Az „Excel” fórum célja, hogy keretet adjon az Excel felhasználók széles táborának tapasztalataik megosztására, és lehetőséget a segítséget kérőknek. Az alábbi összefoglaló azért készült, hogy segítse a helyes kérdésfeltevést.
– Írd le szabatosan a problémát. Úgy fogalmazz, hogy ne csak te magad, de a szakértő is megértse, mire szeretnél választ kapni.
– Írd le, hogy milyen verziójú Excellel dolgozol. (Vagy ha nem – ill. nem csak – Excel, akkor micsoda?)
– Írd le, hogy milyen úton indultál el, és hol akadtál el rajta.
– A kérdés megértése szempontjából sokat segíthet, ha feltölteszt egy képet, amin látszik, hogy mit szeretnél, vagy illusztrálja azt.
– Még jobb, ha feltöltesz egy minta munkafüzetet valahová (pl. data.hu). Feltöltés előtt távolítsd el belőle a nem publikus adatokat.
– Ha a feladat jellege olyan, célszerű az "előtte" és "utána" állapotokat bemutatni. (Miből kellene csinálni mit?)
– Ha VBA kódon kell javítani, másold be a releváns kódrészt. Rövid kód mehet hozzászólásba, hosszú kód inkább ide: http://pastebin.com/
– Ha valami nem úgy működik, ahogy kellene, add meg a rendellenes viselkedés jellemzőit, a hibaüzenetet, és a hibát okozó programsort.
Nekem a következő probléma adta fel a leckét. Van két oszlop 1.-ben dátumok (de csak az MNB valutakereskedés napjai, tehát munkanapok). Mellette a 2. oszlopban az árfolyam. Ki akarom számolni 60 napos intervallumonként (minden napra, adott nap +60nap) a görbe meredekségét. A bajom, hogy ha pl az első dátum január 3 akkor nem biztos hogy a táblázatban van márc 3-om mert lehet hogy az szombatra esik, ilyenkor márc 5-ig kéne a tartomány. Ezt egyszer kétszer kézzel kijelölhetem de mikor 2 éves intervallum van 500 adattal nem megoldható. Próbáltam az EDATE és az EOMONTH parancsokkal bűvészkedni de semmi.
A kérdésem röviden tehát, annyi hogyan lehet megadni időtartományt egy művelethez és ezt automatizálni végig, hogy ha pl: A89-től cellától az attól 60 napra lévő tartományt akarom vizsgálni, úgy hogy ha nincs az adott nap + 60. napon értékem akkor a progi automatikusan a következő napra ugorjon.
Ezt már csak a tanulási vágy miatt kérdezem, hogy vajon mi lehet a képernyő "villodzás" oka az alábbi beállítás után:
Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim Itt_Szabad As Range Set Itt_Szabad = Range("A6:C" & Range("A" & Rows.Count).End(xlUp).Row - 1)
Application.ScreenUpdating = False
If Not Intersect(Target, Itt_Szabad) Is Nothing Then Intersect(Target, Itt_Szabad).Select Else Range("A" & Target.Row).Select End If
Köszönöm szépen, azt hiszem, ezt kerestem! Egy picit módosítottam az ötleten, mivel több száz soros is lehet a "védett terület" és ilyenkor nem igazán lenne jó, ha a védett területen kívüli kejelölés mindig az "A6"-ra ugrana vissza.
"Egyébként, próbálkoztam már az "Undo"-val, de azt gondoltam, valahogy meg lehet oldani, hogy a megadott területen kívül ki se lehessen választani a cellákat..."
Meg lehet oldani, de nekem nem esett le, hogy ez a feladat. Próbáld ki ezt:
Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim Itt_Szabad As Range Set Itt_Szabad = Range("A6:C" & Range("A" & Rows.Count).End(xlUp).Row - 1) If Not Intersect(Target, Itt_Szabad) Is Nothing Then Intersect(Target, Itt_Szabad).Select Else Itt_Szabad.Cells(1).Select End If End Sub
If Not Intersect(Target, Itt_Szabad) Is Target Then Application.EnableEvents = False Application.Undo Application.EnableEvents = True End If
End Sub
Egyébként, próbálkoztam már az "Undo"-val, de azt gondoltam, valahogy meg lehet oldani, hogy a megadott területen kívül ki se lehessen választani a cellákat...
Hát... nem mondom, hogy mindent értek, de ezzel talán tudsz kezdeni valamit:
Private Sub Worksheet_Change(ByVal Target As Range) Dim Itt_Szabad As Range Set Itt_Szabad = Range("A3:C40") If Not Intersect(Target, Itt_Szabad) Is Target Then Application.EnableEvents = False Application.Undo Application.EnableEvents = True End If End Sub
Vagyis, ha a munkalapon bekövetkező változás bármely cellát érinti az Itt_Szabad-ként definiált területen kívül, akkor egyszerűen végrehajtódik a visszavonás (Undo), amit egyébként ctrl+z gombokkal érünk el.
Öt darab csoportba foglalt munkalapon történő adatbevitelt szeretném lekorlátozni. Itt ugye arról van szó, hogy a csoport elsőként kijelölt munkalapján történő minden változás érvényesül a többi munkalapon is. Na most, ezek a munkalapok nem egyforma szerkezetűek, de az első három oszlop adatának tökéletesen egyeznie kell. A lényeg, hogy a csoportba foglalás után (ez is makróval történik) az összes munkalap A, B, C oszlop adatait egyszerre lehessen kezelni (törzsadatok karbantartása (módosítás, sortörlés, új sor beszúrás, stb) és érvényesítése). És itt jön, amivel nem boldogulok, nem tudom lekezelni, hogy csak és kizárólag a kijelölt területen (A, B, C oszlopokban, meghatározott soroktól, meghatározott sorokig) lehessen adatokat manipulálni…. Próbálkoztam már védelem állítgatásával is (ActiveSheet.Protect beállításokkal), de ez nem jó a csoportba foglalt munkalapokon. Szóval, a lényeg az, hogy a meghatározott területen kívül ne lehessen adatokat bevinni, módosítani, törölni, sort, oszlopot beszúrni...
Tegyük fel, hogy egy szubrutinban benne van, és végrehajtódik ez a sor:
Application.Onkey "{ESC}","Eljárás neve"
Onnantól kezdve az Excel figyeli, hogy mikor nyomsz egy ESC-et, és akkor fut le az "Eljárás neve" nevű Sub. Azt tapasztaltam, hogy amikor cella-szerkesztésből lépsz ki ESC-kel, az nem számít ESC lenyomásnak. Hasonlóképpen, amikor egy Form aktív, hiába nyomogatod az ESC gombot, az Excel nem reagál rá. Hogy miért van így, nem tudom. De Form-on a már említett KeyUp eseménnyel le lehet kezelni.
Dim Path As String On Error GoTo ErrHandler: Path = "D:Leltár" & "Készlet " & Format(Now, "yyyy.mm.d") & ".xls" With ActiveWorkbook .SaveAs Path .ReadOnlyRecommended = True End With
Ezt pedig az eljárás végére:
ErrHandler: If Err.Number = 1004 Then MsgBox "A megadott könyvtár nem létezik. Ellenőrizd!" Exit Sub End If
Mail megjött. Tehát azt szeretném, ha amikor rákattintok a "Készletmódosítás nyílra, akkor ne csak módosítsa a bevételnek megfelelően, hanem mentse is el D:Leltár "Készletyyyyhhdd" fájlba. Ahol az "yyyyhhdd" az aktuális dátum.
Egyébként volt 1x ugyanilyen jellegű - itt megoldott problémám nekem is. Ott valaki a Sendkey-el küldött TAB-okat javasolta. Azt hiszem te voltál, most lusta vagyok visszakeresni. Valószínűleg azért ajánlottad, mert nekem olyan megoldás kellett, hogy jelölje is ki a textbox tartalmát - mintegy előkészítve a tartalom felülírásra. De ez a SetFocus nyilván jobb. Gavrieltől meg elnézést, de a tudásomnak megfelelő volt a megoldásom :)
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Row < 4 Or Target.Row > 40 Or Target.Column > 3 Then Védelem = True Else: Védelem = False End If
End Sub
A következő a gondom: azt szeretném elérni, hogy ha a fenti rutin beállítja a "Védelem" változót igazra, a munkalapon se a dupla klikk (Worksheet_BeforeDoubleClick), se pedig a változás (Worksheet_Change) ne érvényesüljön az adott cellánál (Target)... Vajon, hogy lehetne erre rábírni?
A kurzort egy szövegdobozba állítani a fókusz átadásával (a SetFocus eljárással) lehet. Pl. TextBox1.SetFocus
A billentyűzet figyelésére (ESC-re kilépés, Enter-re kijelölés, stb.) felhasználható a KeyUp esemény. A KeyUp esemény mindig azon a vezérlőelemen következik be, amin a fókusz van. Ha pl. ListBox1-en van a fókusz, akkor ESC billentyű lenyomására (pontosabban a felengedésére) lefut az alábbi kód, ami bezárja a Form-ot
Private Sub ListBox1_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) If KeyCode = 27 Then Unload Me '(Az ESC kódja 27) End Sub
Azt tapasztaltam, hogy fókuszt "levenni" valamiről nem lehet, a Form-nak átadni nem lehet, szóval ha ESC-re mindenféleképpen kilépést akarsz, akkor minden egyes vezérlőelemhez, amelyik fókuszt kaphat, hozzá kell rendelni Form-ot bezáró kódot.
ez tény, meg kézrállóbb is az esc. azért ha megvan hogy kell, írd be. Azt nem vágom hol vannak ilyenkor a többiek, mert a kisujjából kirázná ezt szrtem pár topictárs itt.
Szia robbantomester. Régen kérdeztelek már. Adott egy táblázat. (Amit Te készítettél nekem). Köszönet érte. Szeretném Javítani annyiban, hogy amikor a Készletmódosítás gombra kattintok, Ha lehetséges mentse is el az aktuális dátumra az állományt. A makro a következő:
Én sem tudom sajna hogy kell használni, de kutakodtam: http://www.mrexcel.com/forum/showthread.php?t=14395 http://www.mrexcel.com/forum/showthread.php?t=16985
ez nekem fennt volt elég sokáig, csak leszedtem mert keveset használtam. Persze ettől még nem haszntalan. Sőt, jó dolgok vannak benne. Segítheti az ember munkáját jópár helyzetben
Nem tudom a pontos megoldást megmondani neked, de én biztosan az alább írt autosize tulajdonsággal (Me.Label3.AutoSize = True) és a formon lévő label szélességét meghatározó szelessege = Me.Label3.Width kódokkal kísérleteznék.
Szeretnék megint tanácsot kérni! Ha egy UserForm-on van egy Label elem, ami szöveget jelenít meg, akkor ha szerencsém van, elfér a szöveg, ha nincs, akkor csak az eleje látszik, ami még nem lóg ki a megadott szélességű területről. Hogyan tudnám lekérdezni a megjelenítendő szöveg hosszát a képernyőn? Tehát nem a betűk darabszáma érdekel, hanem a proporcionális és adott méretű szöveg területigénye. Előre is köszönöm!
Üdv! Nekem olyan egyszerű problémám van, hogy talán nem is ide való.
Az office 2007-et tettem fel és az excel szórakozik velem. CTR+C általában másolást eredményez (ahogy kell), de időnként, fogalmam sincs miért, ugyanerre a "Törlés" panelt (cellék eltolása balra, felfelé, ....) hozza elő. Ilyenkor marad az egér jobb-gombos másolás (ami jóval lassabb, mint a billentyűkód), vagy kilépés, belépés és megint működik egy darabig jól.
’ A rutin a B oszlop utolsó nem üres sorától az első sorig törli a feltételeknek megfelelő sorokat (az üres értéknél is törli a sort)Sub BTörlés() For i = Range("B" & Rows.Count).End(xlUp).Row To 1 Step -1 If Range("B" & i) <= 0 Then Range("B" & i).EntireRow.Delete 'Range("B" & i).EntireRow.Interior.ColorIndex = 3 End If Next iEnd Sub
azért mert az ő gépén okosan lecserélték az excelt 2007-re, az én igényeimet azonban továbbra is maximálisan kielégíti a 2003.
Egyébként: ott lecserélték a mailszervert. Ez észreveszi, hogy egy xls kiterjesztésű állományt akarnak átgyömöszölni rajta, amely valójában egy zippelt xml és egyéb könyvtárakat tartalmazó állomány. Ezt ő gonosz varázslatként értelmezi és félvén a vírusoktól magától lecseréli egy sima txt fájlra, melyben az az üzenet olvasható, hogy "a lótüdőt küldök neked jó fajta excel állományt".
de azt gondolom megoldottam, hátha ezt jobban értitek :)
Sub Konvert() fs = Application.GetOpenFilename("Számlák (*.xls),*.xls") If fs <> False Then Workbooks.Open Filename:=fs ActiveWorkbook.SaveAs Filename:=fs, _ FileFormat:=xlExcel5, Password:="", WriteResPassword:="", _ ReadOnlyRecommended:=False, CreateBackup:=False ActiveWorkbook.Close End If End Sub
ez fut 2007-en is? nem vagyok egy vb guru. én még c-t meg assembly-t tanultam :)
Esetleg nem futnál neki még egyszer kicsit erősebben koncentrálva a problémára?
Gondolok itt az ilyen megfogalmazásokra:
"Most lecseréltek valami csodát náluk és a korábbi 2007-es xls fájlok helyett egy txt állomány érkezik, mely arról értesít, hogy lecserélte az állományt.
Az ismerősöm nem igazán tud a dologgal semmit kezdeni, még csak az excel megnyitását és más típussal lementését sem vállalja."
Ha jobban belegondolsz, a makródnak Excel 2007-ben kellene működnie, akkor meg minek kellene konvertálni a megnyitáshoz?! Makró helyett javaslom a Ms Office kompatibilitási csomag telepítését Office 2003-ra. Vagy OpenOffice 3.0 :)
Sziasztok! Segítségre lenne szükségem. Kellene egy makró, amely bekér egy 2007-es excelfájlt, majd lementi azt 2003-as formátumban és kilép mind a makrót tartalmazó, mind pedig a lementett 2003-as (esetleg a 2007-es fájlból).
ui.: magyarázat: Van egy ismerősöm, aki folyamatosan küldözget nekem anyagokat. Most lecseréltek valami csodát náluk és a korábbi 2007-es xls fájlok helyett egy txt állomány érkezik, mely arról értesít, hogy lecserélte az állományt. Az ismerősöm nem igazán tud a dologgal semmit kezdeni, még csak az excel megnyitását és más típussal lementését sem vállalja. Nagyon megköszönök minden segítséget!
Ha még aktuális a kérdés, íme egy lehetséges megoldás, megnyitás után kérdezd le a ActiveWorkbook.ReadOnly tulajdonságot, ha true, akkor ReadOnly, vagyis csak olvasható:
Sub Megnyitás()
Workbooks.Open Filename:="fájlelérés" If ActiveWorkbook.ReadOnly Then MsgBox "Csak olvasható..." Else MsgBox "Szerkeszthető is!" End If
az 1. kérdés érdekel engem is. Az Application.OnKey segítségével kell, csak sajnos nincs időm kísérletezgetni vele. A helpet érdemes nézni jókat ír róla ( már amit értek belőle...)
Ott van a menüpont a Nézet/Szerkesztőléc alatt. Ki/Be lehet kapcsolgatni. De ha mindenképpen gombot akarsz hozzá, akkor Nézet/Eszköztárak/Testreszabás/Parancsok fül ---> Kategóriák oldalon kiválasztani a "Nézet"-et és a bal (Parancsok) oldalról egérrel oda húzod a "Szerkesztőléc" parancsot ahova akarod. És máris van egy gombod amivel ki*be lehet kapcsolgatni.
Alt+F11-re előjön a VBA szerkesztője. Bal oldalon ráállsz a füzeted nevére.
Az Insert/Module menü ad egy új üres lapot jobb oldalon. Ide írd be:
Sub StatSor_ki_be() If Application.DisplayFormulaBar Then Application.DisplayFormulaBar = False Else Application.DisplayFormulaBar = True End If End Sub
Ezzel a makróval váltogathatod a ki-bekapcsolást. Ha sűrűn van szükséged rá, érdemes ikont rendelni hozzá.
Sziasztok! Ha rámegyek egy cellára, akkor fent kiírja a függvényt (ha függvény van a cellában). Igenám de ha sok adat van benne, akkor több sorba tördeli és így kitakarja az oszlopok A, B, C ... nevét. Meg lehet csinálni, hogy ne takarja ki? Mert így mindig át kell lépnem egy üres cellára, hogy lássam az oszlop nevét, aztán vissza a cellára, hogy az oszloptól függően átírjam a függvényt.
Illetve, jó a kérdés, ugyanis a következő problémám ott lesz, hogy ha programból meg akarok nyitni egy másik fájlt amelyet már korábban megnyitott valaki!
Köszönöm, ezt (a hálózati felhasználó azonosító lekérdezést) ismertem, azt hittem, hogy azt tudod lekérdezni valahogy, hogy ki használ egy már megnyitott fájlt...
Egyébként, gondolom elgépelted az alábbit:
Function AskUser() As String Dim Buffer As String * 100 Dim BuffLen As Long
"...a kérdésre keresve a választ, hogy miként lehet megtudni, hogy melyik felhasználó nyitotta meg a fájlt, de arra gyorsan rátaláltam egy idegen nyelvű fórumos oldalon,"
Kedves ERW320!
Ez csak nem hagy nyugton, esetleg megosztanád ennek a megoldását?
Hát, azt hosszú lenne most leírni, de semmi gond mert írtam megírtam a ParamPR1toPR2 és a ParamPR2toPR1 subokat, melyeket a PR1 fájl betöltése után meghívok (a ParamPR1toPR2-t a PR1-ből, a ParamPR2toPR1-et pedig az imént meghívott PR2-ben lévő ParamPR1toPR2-ből, s így azt a néhány alapváltozót amely a működéshez kell át tudom adni-venni.
A PR1 egyébként a munkafájl (xls), a PR2 pedig tartalmazza az eljárásokat és függvényeket, amelyet xla-típusúként mentettem, de a hordozhatóság miatt nem a ...MicrosoftAddIns könyvtárba (a betöltéséről a PR1 gondoskodik).
Nagyon szépen köszönöm a tudást, melyeket megosztottatok velem!!!
Fórumbeli tevékenységem 2008.12.30-án kezdődött arra a kérdésre keresve a választ, hogy miként lehet megtudni, hogy melyik felhasználó nyitotta meg a fájlt, de arra gyorsan rátaláltam egy idegen nyelvű fórumos oldalon, de az ezen a fórumon feszegetett kérdésekkel Nélkületek nem boldogultam!
Egyébként, nem igazán értem, miért kellene egy eljárásnak a megkapott változók értékein túl még egyéb változókat is ismernie az átadó fájlban dekraláltak közül?
Igen, ezt nekem is sikerült összehoznom, de eljáráshíváson kívül nem lehet a másik fájl pl. Modul1-ében Public-ként létrehozott "Proba" nevű változójára hivatkozni valahogyan?
Boraka és ERW köszi, így fogok tenni! (de előtte lefexem aludni, mert ez így kezd durva lenni :) )
Gubameister problémájára addig nem lesz válasz, amíg nem tudható, pontosan mi a célja. Az fkeres magában neki biztos alkalmatlan, mert az fkeres EGY dologhoz rendel EGY dolgot. Neki pedig egy kódszó többször is szerepel a listájában, ennél többet viszont nem tudunk, a vágyott rendezés elvét sem. Tehát hogy segíteni tudjunk neki, tudnunk kéne, mi is a célja.
Adott egy PR1.XLS fájl amelynek pl. az auto_open() eljárása ilyen:
Sub auto_open()
MsgBox "Ez itt a PR1.XLS - auto_open ejárása" & vbNewLine & vbNewLine & _ "Most meghívom a PR2.XLS - PR2_teszt eljárását..."
Application.Run "PR2.xls!Module1.PR2_teszt"
End Sub
2.
Adott egy PR2.XLS fájl, ahol a module1-ben van egy ilyen kis rutin:
Sub PR2_teszt()
MsgBox "Ez itt a PR2.XLS - PR2_teszt eljárása!"
End Sub
Na most, ha megnyitod a PR1.XlS-t és a PR2.XLS már meg van nyitva az auto_open meghívja a másik fájl tesztrutinját. (Ha nincs még megnyitva, akkor az Application.Run előtt nyisd meg, mert egyébként hibaüzenettel visszaszól ;-)
Szóval, az általad idézett rész a "tartományban_keres" paraméterre vonatkozik:
"Tartományban_keres: Logikai érték, amellyel az FKERES függvény pontos vagy közelítő keresését adhatjuk meg:
Ha értéke IGAZ vagy hiányzik, a függvény pontos vagy közelítő egyezést ad vissza. Ha pontos egyezést nem talált a függvény, akkor a következő legnagyobb, de a keresési_érték argumentumnál kisebb értéket adja vissza.
A tömb első oszlopában található értékeket növekvő sorrendben kell elrendezni ahhoz, hogy az FKERES biztosan a megfelelő értéket adja vissza. Az értékek növekvő sorrendbe rendezéséhez válasszuk az Adatok menü Sorba rendezés parancsát, majd az Emelkedő beállítást. További tájékoztatásért olvassuk el az Alapértelmezés szerinti rendezési sorrend című témakört.
Ha az argumentum értéke HAMIS, akkor az FKERES pontos egyezést keres. Ebben az esetben a tömb első oszlopának nem szükséges rendezettnek lennie. Ha két vagy több olyan érték is található a tömbben, amely egyezik a keresési értékkel, az elsőként megtalált érték használatos. Ha nem talál pontos egyezést, a függvény a #HIÁNYZIK hibaértéket adja vissza."
Ha van két excel fájlom és az egyikben történt esemény (Pl.: Workbook_Open) hatására egy a másikban lévő (Pl.: "XLS_Open" nevű) eljárást akarom meghívni, akkor azt hogyan tehetem meg?
Lehet, részletes tesztelést nem végeztem. A Help szerint: "A tábla első oszlopában lévő értékeknek növekvő sorrendben kell elhelyezkedniük, mert különben az FKERES hibás eredményt adhat. További tudnivalókat az Adatok sorba rendezése című rész tartalmaz." Csak felhívtam a figyelmet, hogy milyen gondja lehet még a fv alkalmazásának!
Mit szólnál egy ilyen megoldáshoz, az adott munkalapod Worksheet - Change eljárásával:
Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$A$1" Then ' itt pontosan add meg a címet, hogy melyik cella az érdekes.
Select Case Range("A1") Case 1 MsgBox "az A1 értéke 1..." Case 2 MsgBox "az A1 értéke 2..." Case 3 MsgBox "az A1 értéke 3..." Case Else ' Ha kell ' Minden más End Select
Hello Tóni! A VBA-n pl.: a Munka1 objektumra kattints kétszer, majd a jobb oldali panel bal oldali legördülőmenüjében válaszd a ki "Worksheet", a jobb oldali legördülőmenüjében pedig válaszd ki a "Change"-t!
Van egy-két cella a lapomon, aminek az érétkét ha megváltoztatom, le kéne fusson egy egyszerű makró. A makró már rendben van, csak azt nem tudom, hogy kell pl. az A1 cella OnChange eseményére hivatkozni. Gondolom vmi ilyesmi a megoldás. Avasson be valaki, köszönöm!
Ha van két excel fájlom és az egyikben történt esemény (Pl.: Workbook_Open) hatására egy a másikban lévő (Pl.: "XLS_Open" nevű) eljárást akarom meghívni, akkor azt hogyan tehetem meg?
Csatlakoznék robbantomester kollégához, a csatolt képen egy példa látható arra, hogy az intéző hogy látja a hálózati helyet, valamint ennek alapján a javaslatom az elérési út megadására. Remélem, így sikerül.
Tehát. Kicseréled a "hivatkozás" függvényben az elérési utat, úgy hogy nem a sajátgép betűjelét használod, hanem a közvetlen elérési (hálózati) utat írod be? Még mindig úgy gondolom, hogy működnie kellene - bár a 2007-es excelt nem használtam még... :(
Az előző példákból kimaradt a backslash (sajnos nem tudom hogy kell beírni, hogy megjelenjen), de mindegyik a helyén van. Az ötleted sajnos nem vált be, akkor is átírja a excelben lévő hivatkozást \számítógépnévre, ami mentve már nem lesz megfelelő, mert nem frissíti automatikusan az adatokat. :(
én első körben kipróbálnám az elérési utat a hiperhivatkozás függvényben átírni pl. \\serverneve\eleresiut\file.xlsx (mint hálózati meghajtó elérési útja)
Sziasztok! Van egy dilemmám és abban reménykedek, hogy valaki találkozott már ilyen problémával és tud a következőkben segíteni:
Adott egy hálózati meghajtó (szerver) melynek a jele N:, továbbá hátom excel fájl. 1. forras.xlsx, melynek adat munkalapján az A1 cellájában van egy szám, mondjuk 5 2. adat.xlsx, melynek az A1 cellájában a következő hivatkozás található: ='N:[forras.xlsx]adat'!A1 3. vezérlő.xlsx melynek az A1 cellájában a következő függvény van : =HIPERHIVATKOZÁS("N:adat.xlsx";"Adat megnyitása")
Nos a probléma a következő: ha az adat.xlsx-et nyitom meg, akkor a csatolásokban lévő hivatkozások a megadott hálózati mappa betűjelét használja az elérési úthoz. Akármikor nyitom meg, zárom be az úgy marad, ezáltal megnyitáskor a megfelelő beállításokkal azonnal frissíti az adatot, ha az a forras.xlsx fájlban változik. Ez a normális működés, így kell csinálnia. Viszont ha a vezérlő.xlsx fájlt nyitom meg és a linkre kattintva nyitom meg az adat.xlsx fájlt, akkor a megnyitáskor hibaüzenettel indul el: Ez a munkafüzet egy vagy több nem frissíthető csatolást tartalmaz. Két lehetőség van hogy Tovább vagy Csatolások módosítása. A továbbra kattintva azt mondja hogy nem módosítja a csatolásokat, ezért a tovább gombra kattintok. Igen ám, de ha megnézem a Hivatkozások menüpontot és az ott becsatolt fájlok elérhetőségét, akkor az N: helyett a számítógépnév hivatkozást használja, ami azért nem jó, mert ha mentésnél így marad, akkor nem fogja frissíteni az adatokat.
Már leválasztottam a hálózati csatlakozó majd újra, excelből, hátha az segít de nem semmi. Hozzáadtam már a biztonságos helyekhez a hálózati meghajtót, de semmi, semmi, semmi. Teljesen ki vagyok idegileg, aki tud kérem segítsen
az FKERESnél, még sorrendbe rendezettnek is kell lennie amiben keres!
szvsz (én azérmég nem vagyok guru...) az FKERES kölcsönösen egyértelmű hozzárendeléshez való, ha egy kód értékhez több eredmény is tartozhat, akkor valami mást kellene alkalmazni!
Elakadtam egy táblázat szerkesztésében és ehhez kérnék egy kis segítséget.
A helyzet a következő, fkeres függvénnyel akarok egy kódszámhoz értékeket rendelni viszont egy ilyen számhoz több eredmény is tartozik és minden esetben csak a legelsőt jeleníti meg.
Ezzel a függvénnyel nem is lehet ilyet csinálni, vagy csak beállítás kérdése az egész?
Ha nem megoldható, tudnátok javasolni valami mást?
a programozással én is most ismerkedem, igérni nem merek.
úgy fognék neki, hogy makróban rögzíteném a szűrés teendőit, aztán beletenném ezt a figyelő utasítást, hogy futtassa a makrót, ha változás történik az adatok között! ha lesz egy kis időm kipróbálom! de hátha lesz másnak is ötlete, hogy lehetne még megoldani!
Egy ilyen makró elkészítése megoldható varázslóval is vagy feltétlenül programoznom kell hozzá? Amennyiben én is megtudom oldani (kezdőként), tudnál benne segíteni nekem?
Viszont azt vettem észre, hogyha bővítem a baloldali táblázatot, tehát lefelé haladva tételeket adok hozzá, azokat már nem gyűjti ki a jobboldali táblázatba, csak akkor hogyha újabb szűrést végzek.
Hogyan tudom megoldani, hogy ahogy folyamatosan bővítem a táblázatot lefelé, a jobboldali táblázatban automatikusan megjelenjenek az újabb "teljesített tételek"???
azt a tartományt amiben a szűrési feltételeket elhelyezed. érdemes lemásolni a tartomány első sorának az adatállomány első sorát, a másodikba pedig betenni az x-et abba az oszlopba, ahova te is jelölni fogsz. nézd meg a helpet, tényleg segíteni fog! lsd: Szűrés speciális feltételek alapján
Jelen példa esetében működik minden, viszont hogyha az F6 cella üres és mondjuk legközelebb csak az F8-ban van "X", akkor már nem, mert listázza az egész tartományt. Mit kell ilyenkor szűrőtartománynak megadni?
tt65-nek köszi a mintát.
Az alatt pedig, hogy elég jol haladok azt értettem, hogy a legalapvetőbb dolgok, mint pl.: SZUM, HA, DBTELI, stb. függvények használata megy és eddig csak ezekre volt szükség. De mint látod ez a feladat már kifogott rajtam, a szűrő eszembe sem jutott. Ezért kértem a segítségeteket. és ezért szeretném minnél jobban elsajátítani ezeket az ismereteket.
az előbb még azt irtad egész jól haladsz a költségvetés készítő programmal! na mindegy.. sztem akármilyen régi excel könyv is jó az alapokhoz, de a help is segítséget nyújt, sőt a microsoft honlapja is! ha bíros az angolt, akkor keress rá az excel bible szavakra és találsz jót, már 2007hez is!
Köszönöm szépen a segítségeteket, frankón működik a szűrős dolog!
Tudtok esetleg ajánlani valamilyen szakirodalmat, esetleg tutorialt az excellel kapcsolatban? Szeretném elsajátítani ha nem is az egészet, de az alapvetőbb dolgokat mindenképpen!
Lenne egy olyan problémám, hogy lehet-e olyat készíteni az excelben, hogy van egy képlet, amibe van több behelyettesítendő adat van, de csak egy képlet.És a több behelyetteítendő adat több végeredményt produkál, de csak egy képletből.
Ime:
A "D3" cellában található egy képlet, itt a példán A7*A7.
De az "A" oszlopban van több érték, amit ba szeretnék helyettesíteni a D3 képletbe.És eredményül az A oszlop értéke behelyettesítve a D3 cellában eredményét a F oszlop A oszloppal azonos sorában jelenik meg.
Nemrég elkezdtem csinálni egy költségvetéskészítő programot excelben. Egészen jól halodok vele, viszont most megakadtam. Közbejött egy probléma, aminek a megoldásában a ti segítségeteket szeretném kérni.
Nem fárasztalak benneteket az egész dokumentummal, inkább az egyszerűség kedvéért készítettem egy sematikus modellt a problémáról:
http://practice.uw.hu/feladat.xls
3 munkalapra bontottam a dokumentumot:
- A "feladat" című munkalap tartalmazza azt az állapotot ameddig eddig eljutottam. A bal oldali táblázatban különböző tételek szerepelnek (sorszám, megjegyzés, összeg), és egyes tételek melett látható egy "X", amely azt hivatott jelezni, hogy a tétel teljesítése megtörtént-e.
A cél az, hogy azon tételek melyek teljesítve vannak (tehát "X" szerepel mellettük) kerüljenek egymás alá a jobb oldali, üres táblázatba.
- A "megoldás képe" című munkalap szemlélteti az elképzelt megoldást. Nyilván mivel a valóságban nem 6 tételt kell majd rendeznem, ezért ezt valmilyen függvény, stb. segítségével szeretném megoldani, viszont ezen a téren már hiányosak az ismereteim. ;[
A megoldás során használható bármilyen segédtáblázat, képlet, függvény és bármi más, ami szükséges a megoldáshoz.
Amennyiben valki talál megoldást a problémára, és természetesen nem jelent neki problémát, arra kérném hogy azt a "megoldás" című munkalapon keresztül mutassa meg nekem.
Számtan. :-) =5*KEREK(A1/5;0) De csak akkor lesz jó, ha az A oszlopban csak egészek lehetnek, ami forintnál elvárható. Ha törtek is lehetnek, akkor nem mindig jó.
Van-e lehetőség arra, hogy valamilyen képlet segítségével az 1 és 2 forintos kivonása óta alkalmazott kerekítést használjuk pénz számolásánál?
Vagyis 1-re vagy 2-re végződő összeget lefelé 0-ra, 3-ra vagy 4-re végződőt felfelé 5-re, 6-ra vagy 7-re végződőt lefelé 5-re, 8-ra vagy 9-re végződőt pedig felfelé 0-ra kerekítsünk?
Azon a munkalapon állj, ahol az adatok vannak amikor a makrót indítod.
Elvileg mindent megcsinál, amit szeretnél, bár szerintem összekeverted a munkafüzetet (workbook) a munkalappal (worksheet). Ha jól értettem egy fájlt (dokumentum... munkafüzet) szeretnél sok munkalappal.
Szóval.
- Új munkafüzetet(fájlt) hoz létre, aminek a nevében benne van a tegnapi dátum ÉÉÉÉHHNN formátumban
- Az adatokat tartalmazó munkalap 2. oszlopának egyedi értékei alapján megszűri az adatokat, azokat az új fájlba másolja, egyedi értékenként (országnév) külön munkafüzetre
Dim thisFajl, thisSheet, thisPath, tmp, newFajl, newFajlFull, newSheet As String Dim i, x, utsoSor As Double Dim yr, mt, dt As Double Dim tegnap As Date Dim Cell As Range Dim FieldSzam As Double Dim uzenet, munkalapok As String
thisFajl = ActiveWorkbook.Name thisSheet = ActiveSheet.Name thisPath = ActiveWorkbook.Path tmp = "temp" newFajlFull = thisPath & "\europa_" & yr & mt & dt & ".xls" FieldSzam = 2 'az az oszlop ahol az egyedi filteradatok / pl. az országnév van
'temp munkalap létrehozása amely tartalmazza az egyedi filtereket 'ha volt korábban temp munkalap, azt töröljük
Application.DisplayAlerts = False On Error Resume Next Worksheets(tmp).Delete Application.DisplayAlerts = True On Error GoTo 0
'létrehozzuk az új munkafüzetet, elõtte ha van ilyen nevû fájl, töröljük
On Error Resume Next Kill newFajlFull On Error GoTo 0
Workbooks.Add ActiveWorkbook.SaveAs newFajlFull i = ActiveWorkbook.Worksheets.Count 'a végén kitöröljük a felesleges munkalapokat newFajl = ActiveWorkbook.Name
'végigmegyünk a tartományon ahol az egyedi filter-értékek vannak
'egyedi munkalapok létrehozása 'a munkalapok neve az egyedi mezõ neve 'a mezõ név meg kell hogy feleljen a munkalap név kritériumoknak 'pl.max 31 karakter, nem tartalmazhat speciális karaktereket... stb
For Each Cell In Workbooks(thisFajl).Worksheets(tmp).Range("A2:A" & utsoSor) Workbooks(thisFajl).Activate Worksheets(thisSheet).Activate Cells.Select Selection.AutoFilter Field:=FieldSzam, Criteria1:="=" & Cell.Value Worksheets(thisSheet).AutoFilter.Range.Copy Workbooks(newFajl).Activate Worksheets.Add After:=Sheets(ActiveWorkbook.Sheets.Count) ActiveSheet.Name = Cell.Value With ActiveSheet.Range("A1") .PasteSpecial Paste:=8 'oszlopszélesség miatt .PasteSpecial xlPasteValues .PasteSpecial xlPasteFormats Application.CutCopyMode = False .Select End With munkalapok = munkalapok & Cell.Value & Chr(13) Next
'kikapcsoljuk a filtert és töröljük a temp munkalapot
Workbooks(newFajl).Activate Application.DisplayAlerts = False For x = 1 To i Worksheets(1).Delete Next x Application.DisplayAlerts = True Application.ScreenUpdating = True Worksheets(1).Activate ActiveWorkbook.Save
A gépek, amin a teszteket irják a "versenyzők" munkafegyelmi és biztonsági okok miatt nem érik el a netet, így a google docs kilőve. A moddle alighanem hasonló okok miatt bukik. Marad az excel. Igazából én is ezt preferálom, mert szeretném megtanulni a vba programozását, ez egy jó kihívás erre. A fórum amit ajánlottál jó, fel is iratkoztam. Igazából nekem nem öszefűni kell a teszteket egy táblába, hanem a kitöltési adatokat kell betennem egy kiértékelő táblába. És kiértékelni! köszi az eddigi segítséget!
Illetve ugyanott érdekes lehet még neked az "excel munkafüzetek összefûzése" thread is, ahol szintén felmerült a Google Docs, valamint egy makró több táblázat egyesítésére.
Talán, de segíteni nem tudok benne, csak kiindulópontot adni. Ebben az archívumban keress rá a "Webes adatgyujto" threadre. A Google Docs és a Moodle merült fel hasonló probléma kapcsán.
Egy cellának nevet adsz. Egy másik cellából ráhivatkozol. Az eredmény oké. A hivatkozást átmásolod további cellákba, de itt már nem NEVre hivatkozik, mert nem a nevet, hanem a relatívként tárolt hivatkozása szerint másol. Ez még érthető lenne. De...
Ugyanezt a hivatkozást és másolást egy másik munkalapról ejted meg: az összes másolt cellában a valódi névre hivatkozik.
De ez még semmi. Visszamész az eredeti munkalapra, ahol látod, hogy a NEV MEGADÁSA menüben a NEV abszolut hivatkozással van jegyezve. Átállítod relatívra, onnantól a franc se tudja, hogy mire mutat.
És még egy csomó zavaros jelenség a NEV megadása és hivatkozás témakörből. Tud valaki erről valami használható irodalmat?
képzeld el, hogy egy teremben ül x db. vizsgázó, mindegyik előtt pc. mindegyiken egy kitöltendő teszt. mindenki beirja a nevét és kitölti a tesztet. mikor kész kiértékelés következik és létrejön az a táblázat a versenyzők neveivel és eredményeivel amit mutattál.
hát... akkor ez már makró, mert nyilván a többiek nem láthatják mások megoldásait.
Most erre nincs időm, de ezt tovább lehet fejleszteni úgy, hogy pl. mentéskor (jelszóval) elrejti a már meglévő megoldásokat - így a többiek nem látják.
Ezt egyszerű megcsinálni.
Viszont ha egyszerre több embernek kell töltögetni a tesztet, nem tudom hogy lehet azt kivitelezni, hogy egyszerre többen is tudjanak rajta dolgozni. Kivitelezhető a biztonsági beállításokkal, de a hogyanra kapásból nem tudom a választ.
nem teljesen, de valami ilyesmi! én arra gondolok, hogy minden tesztiró megnyitja a kitöltendő teszt fájlt, megadja a nevét , majd kitölti a tesztet. mondjuk ment a végén. ekkor jönne létre valami hasonló táblázat, mint amit te hoztál létre, és jönne létre a kiértékelés.
Lenne egy kerdesem...vagyis majd nagyon nagyon sok kerdesem...de az elejen kezdem. Az elso kerdessel :-)...
Es bocsanat nincs ekezetem de azert remelem lehet majd erteni.
Tehat, hogyan tudom makro szintjen a kovetkezot kerni az exceltol:
Tegyuk fel a B oszlopban orszagok nevei vannak. Az excelnek azt kellene csinalnia, hogy...
1. megszuri orszagonket az adataimat (pl. csak a Mo-ra vonatkozo adatokat veszi)
2. ezeket atmasolja egy uj excel dokumentumba, amely excel domentumot elnevezi valahogy (pl. "EUROPA.xls"), de a magyar adatokat ezen belul a "Mo." munkafuzetben helyezi el...es teszi ezt minden orszaggal...tehat ide masolja majd Lengyelorszagot is, de azt a "Pl." munkafuzetre.
Valoszinu ez mind nem olyan bonyolult, csak en nem tudom meg hogy kell...probaltam felvenni lepesenkent a makroba, de nem mukodott...persze SPSS-ben siman tudnam...:-(...de az itt nincs :-).
3. es hogy meg bonyolitsak egy kicsit az lenne a tuti, ha a fajl nevehez hozza biggyesztodne az aktualis datum...pl igy...EUROPA_20081222,
vagy hogy meg megspekeljem egy kicsit nem az aktualis datumra lenne szukseg, hanem az egyel korabbi napra...tehat, aktualis datum minusz egy nap...
Uj munkam van es az elodom olyan "template" fajlokat gyartott, hogy csak pislogok...nem is tudtam, hogy ilyesmiket is lehet excelben csinalni...es persze fogalmam sincs hogyan csinalta oket...es most nyomozok, ha esetleg valami elromolna, hogy meg tudjam majd javitani...
Ugyhogy majd annyi mindent szeretnek kerdezni...de csak sorjaban :-)...
Elore is koszonom a tippeket!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
hali! én is segítséget szeretnék kérni, attól aki foglalkozott már ilyesmivel.
Szeretnék egy olyan tesztet készíteni, amiben kérdések vannakk egy csak a három megadott válasz közül kell kiválasztani a helyeset. Kitöltés után, az egyes kitöltési eredmények egy összegző táblázatban megjelennének. (tulajdonképp az lenne a jó, ha az egyes sorokban megjelennének a kitöltők nevei, az oszlopokban, pedig a kérdéskre kapott 0 v. 1 pontjai és egy összegző sor) Ha valaki csinált már ilyent megközsönném a segítségét!
van egy táblázat két oszloppal és vagy 2700 sorral. erre szeretnék ráilleszteni egy másik ugyanilyen paraméterekkel rendelkező táblázatot, ami már tartalmaz olyan cellákat, amelyek megvannak az elsőben, magyarul a két táblából egyet szeretnék csinálni, de csak egyszer szeretném, ha előfordulnának a bejegyzések.
van egy progim aminek a makrója egy scr fájlt csinál.Mi tévő legyek hogy a számok ,NE vesszővel jelenjenek meg a listerben vagy a jegyzettömbben,hanem pontok.a tizedesek elött.(22,5 helyett 22.5)Innét másolnám az autocadba.Köszike ha tippet adtok.
Eltérő helyen vannak a sorok. Végülis úgy képzeld el, hogy van az egyik táblázat, amibe mondjuk a termékek 2006-os árai vannak, és a másikba az új árak, de nem mindegyik termék árát változtatták meg. és ezt szeretném "kiszűrni", hogy mik a változott árú termékek.
De, amit írtál sokat segített. Holnap ki is próbálom!
pro-kontra, szerintem sem kellenek makrók egy ilyen feladathoz. Viszont sokat lehet tanulni ha mégis melette dönt. + ha valamit elkezdett így felépíteni, nem biztos hogy már eláll tőle.
Ennél kicsit több infó kellene. Az első, hogy a két lista sorai azonosak vagy azok is megváltoztak, tehát az az adatsor, ami az egyikben a 23. sorban szerepelt az a másikban is a 23. sorban van, vagy bárhol lehet.
Ha ugyan ott van, és mind a kettőben pontosan ugyan annyi sor van csak a sorokon belül valamelyik cella (oszlop) megváltozott, akkor egy egyszerű tömbfügvénnyel is eléred a célt. Egy A-C oszlopban lévő adatsor esetén a D oszlopban beírod: =ÉS(A1:C1=Munka1!A1:C1), ahol a Munka1 a másik tábla, majd nyomsz egy CTRL+SHIFT+ENTER-t. Ezáltal soronként megkapod, hogy van-e eltérés vagy nincs. Majd erre az oszlopra már tudsz szűrni.
Ha a két táblában eltérő helyen is lehetnek adatok, akkor egy primitív, de egyszerű módszer lehet, hogy egy üres oszlopban mind a két helyen ÖSSZEFŰZ függvénnyel összerakod az egymás melletti cellákat mind a két táblázatban. Majd ezt az oszlopot FKERES függvénnyel megkeresed a másik táblában. Ha nem talál ilyet a másik táblában, akkor ez a sor vagy új, vagy megváltozott. Persze ez csak akkor használható ha minden sor egyedi, vagyis a táblában nincs és nem is lehet két teljesen egyforma sor.
Most kapásból ez jutott eszembe, de biztos van még több más lehetőség is.
Ezen kívül lehet makróval is, aminek viszont már számtalan megvalósítási módja lehet.
Ha nem túl bonyolult az amit készítened kell, akkor lehet hogy nem is Form-ot kellene használnod. Nem tudom mennyire ismered az excelt. Két féle nagyon hasonló mégis nagyon eltérő eszköztár létezik. Van a "vezérlők eszközkészlete" és van az "űrlapok". Meg kellene próbálnod ezt a másodikat használni. Kezdő VBA felhasználók számára ez sokkal könnyebb. Ezeket közvetlenül leteheted az aktuális munkalapra, de akár egy másik munkalapra is. Ezáltal egy ürlapot létrehozva. Viszont ezeket sokkal könnyebb csatolnod az excel cellákhoz és a tartalmuk együtt változik a cellákkal. A legtöbb esetben nem is szüséges makrókat írni. A legtöbb szövegdobozt és egyéb objektumot feltölthetnéd az excel cellákban ügyes képletekkel kiszámolt értékekkel és valószínűleg csak egyetlen makrót kellene használnod ami a kívánt sormásolást elvégzi.
Köszönöm a tanácsot, sajna az én VBA tudásom = 0, a cellába írás fontos lenne mivel egy következő makróval az egész sort másolom a lentebb található legközelebbi sorba.
Van 2 excel táblázatom 6000-6000 tétellel, és az egyikbe változott 1000 tétel elszórtan. Namost az eredetiből akarom kivonni a változtatott táblázatot, hogy a megváltozott 1000 tételt kapjam eredményül. Hogyan csináljam ezt? Még egy dolog, hogy ezt ecxellel is meg kéne csinálnom, és open office-nak a táblázatkezelőjével is.. :S Hogyan? A válaszokat előre is köszönöm!
Private Sub Worksheet_SelectionChange(ByVal Target As Range) Kiadás_Form1.TextBox3.Text = Application.VLookup(Sheets("Kiadás").Cells(3, 3), Sheets("Árú törzs").Range("A4:B500"), 2, False) End Sub
Nekem az az érzésem, hogy rossz az egész megközelítésed a probléma megoldására. Amit eddig olvastam abból azt szűrtem le, hogy vagy egy Form-od, amin több objektum beviteli mező stb van. Ez esetben nem célszerű ezt még összekötni a munkalapon lévő függvényekkel. Illetve lehet, de a frissítéseket akkor is a Form-hoz tartozó makrókból és nem a Sheet-hez tartozó makrókból kellene indítanod. Esetünkben, ha van egy ComboBoxod, aminek a megváltozása esetén megváltozik a C3, majd a C4 cellád, akkor az ehez a ComboBox-hoz tartozó makróban kell kiolvasnod a C4 tartalmát és ezt beírni a TextBox-ba és még ezután még lehet, hogy ki kell adnod a parancsot a Form frissítéséhez is.
Ezt most csak elméletként írom nem vagyok nagy szakértője a témának (még csak középszinten haladok VBA területen), és most sajnos időm sincs lemodellezni Excelben az esetet. Még jobb ha a robbantomester modszerével közvetlenül a makróban használód az Fkerest. Sőt még jobb ha eleve a ComboBox eredményét ki sem írod a C3-as cellába, hanem közvetlenül használod fel a további műveletekben a makrókban.
A cella értéke szinte állandóan változik, mivel itt arról lenne szó, hogy létrehoztam egy munkalapon törzsadatokat ahol szerepel többek között a termék neve valamint a mértékegysége. Cement kg B-30 falazó db A Form gyakorlatilag egy beviteli űrlap lenne, ezen létrehozott ComboBox segítségével a törzsadatból átemelek egy terméket „Kiadás! C3” cellába, ekkor az említett „C4” cellában az FKERES függvény segítségével megjelenik a termékhez tartozó mértékegység. Ezt a mértékegységet kellene megjeleníteni a TextBox-nak és ezt követően írnám be a mennyiséget egy másik TextBox-ba. A beírással nincs gond mivel ControlSource tulajdonsághoz beírom az adott cellát, csak fordítva nem jön össze.
1. A Worksheet_Change esemény akkor hajtódik végre, ha egy cella értéke megváltozik.
Másik lehetőség - Worksheet_SelectionChange - pedig akkor, ha a cellakiválasztás változik meg. (Azonban így sokszor feleslegesen hajtódik végre a parancs pazarolva az erőforrást)
2. 1.-es pont alapján jó helyre másoltad a kódot, jó munkalapra?
Sziasztok! Az lenne a kérdésem, hogyan lehet Form-on megjeleníteni egy cellában -’Kiadás’!C4- szereplő értéket, mely változó érték , „FKERES” függvény van beszúrva. ComboBox-al valamint ListBox-al meg tudom csinálni, viszont TextBox vagy Label megoldás érdekelne. Fontos, hogy a függvény ne törlődjön.
Az Entirerow metódus/objektum/mittomén pontosan mire jó?
Nézegettem a neten is, meg a VBA súgójában.
A kutakodás eredmény: az egész sorra (rows esetén sorokra) mutató dolog.
A VBA példája:
ActiveCell.EntireRow.Cells(1, 1).Value = 5 Az első dolog, ami egyből feltűnt az az, hogy ez a programsor az EntireRow nélkül pontosan ugyanazt csinálja, mint vele.
Most esett le hogy te az üres cellákat külön külön jelölgetnéd ki, de nem kell. Erre ott van az irányított kijelölés, ami az összes üres cellát kijelöli.
Mi tart sokáig? Nekem akár mekkora a tábla, legyen az 65000 soros is nem tart tovább 2 másodpercnél.
Egy darab képlet beírása, egy darab enter, egy darab CTRL+C, egy darab tartomány kijelölés (az egész kimutatás egyszerre), majd a beillesztés az üres cellákba (5 db egér kattintás és egy darab CTRL+V)
Persze ha naponta többször kellene végrehajtanom én is a makrót választanám, de egyébként nem.
Sub feltölt() Dim Rng As Range, cel As Range, An As Long
Set Rng = ActiveCell.CurrentRegion Rng.Select An = MsgBox("A kijelölt területet tölteném fel. Mehet?", vbYesNo) If An = vbNo Then Exit Sub For Each cel In Rng.SpecialCells(xlCellTypeBlanks) cel.Value = cel.End(xlUp).Value Next End Sub
Indítás előtt jelöld ki a kimutatás-másolat bal felső sarkát.
Igenigen. Erre a jelenségre (jelen esetben problémára) gondoltam. A megoldásod én is szoktam használni, csak ritkán, mert nagy táblánál borzasztó sok ideig tart.
A makró, amit írtam erre (nagy hibája pl, hogy nem keresi meg az első nem üres cellát, hanem konkrétan az A5-ről indul, ezért átírrom:
Loop Until intO = intI + 5
De ezzel is csak a szőnyeg alá söpörtem a gondot, mert nem minden felhasználó fogja A5-ös kezdéssel "átkopizni" a kimutatást. A másik gondom az oszlopok számának meghatározása, és ezt változóként meghatározni, hogy flexibilis legyen a progi. Mert elég béna megoldás, hogy annyiszor illesztem be a ciklust, ahány oszlopot sejtek majd.
Ha a lenti adatokkal készítesz egy kimutatást, melyben mindkét oszlop a "Sor mező"be kerül (sorrend legyen pl. név, nap), akkor az eredeti táblában 3* szereplő Pistit összevonja, és csak egyszer szerepelteti. (Nem tudom értelmesebben megfogalmazni :( )
név
nap
Józsi
hétfő
Klári
kedd
Csaba
szombat
Joci
vasárnap
Zsuzsi
hétfő
Gergő
kedd
Gyuri
szerda
Balázs
csütörtök
Pisti
péntek
Pisti
szombat
Pisti
vasárnap
Ez nem jó nekem, ezért a kimutatás adatait átmásolom egy másik munkalapra (hogy módosíthatóvá váljon az üres cella), és ráeresztem a makrót. (vagy manuálisan másolgatom át, de egy több tízezer soros táblánál ez igen könnyfacsaró tevékenység... :(
Tudomásom szerint magában az eredeti kimutatásban nem lehet feltölteni az üres cellákat, csak ha ezt értékként másolod valahová. Ott pedig én úgy szoktam, hogy belemegyek az első üres cellába mondjuk C6 és beírom hogy =C5, majd másolás, a kérdéses tartomány kijelölése, majd ezen belül a csak üres cellák kijelölése (szerkesztés, ugrás, irányított), majd beillesztés. Már ha erre gondoltál :) Viszont összetettebb kimutatások esetén, így az összesítő sorok tartalmazhatnak nem odaillő adatokat, elnevezéseket is.
Tudnál egy-két képet feltölteni arról, hogy mi a kiindulási állapot, illetve mi a cél? Vagy szóban elmondani, hogy mit akarsz megvalósítani. Ez, hogy "kimutatás üres mezőinek kitöltése", nem túl informatív (számomra legalábbis).
Sub check_filter() If ActiveSheet.FilterMode = True Then MsgBox "Az autofilter be van kapcsolva" Else MsgBox "Az autofilter nincs bekapcsolva vagy nincs autofilter a munkalapon" End If
Köszi! Ötletes megoldás, tetszik. Azt hiszem, nem bonyolítom a dolgot, ha akarok keresgélni a munkalapon, akkor Munkalap.ShowAllData és megszűnik az összes szűrési feltétel. Különös módon, ha a munkalapon soronként vizsgálgatom az adatokat, akkor az elrejtett sorokban is keresgél a makró, de a leszűrt sorok láthatatlanok maradnak. Bár elég gyanúsan viselkedik a makró, lehet, valahol hiba van, vagy a makrómban, vagy az Excel bugzik. Köszi a segítséget!
Dim R As Range Set R = Sheets(1).AutoFilter.Range If R.Cells.Count <> R.SpecialCells(xlCellTypeVisible).Cells.Count Then MsgBox "Szűrő bekapcsolva"
Vagyis ha a szűrési tartományon belül az összes cellák és a látható (nem rejtett) cellák száma különböző, akkor szűrve vagyon. Fel lehet rúgni azzal, hogy pl. elrejtesz egy vagy több oszlopot, vagy szűrés után egy sortartománynak átállítod a magasságát, stb.
Sziasztok! Óriási segtség lenne ha valaki meg tudná nekem mondani hogy tudok egy függvényértékből normál szöveget kreálni. Összefűz fügvénnyel két cella tartalmából egyet csináltam, de a forrás oszlopokat törölni szeretném, csakhogy akkor a függvényértékből is eltűnik az a szövegrész.
Makróból szeretném lekérdezni, hogy az adott munkalapon az AutoFilter le van-e szűrve. Azt le tudom kérdezni, hogy a szűrés be van-e kapcsolva (Munkalap.AutoFilterMode értéke True vagy False), de azt hogyan lehet lekérdezni, hogy ha be van kapcsolva a szűrő, akkor vajon le van-e szűrve? Úgy lehetséges, hogy a Munkalap.AutoFilter.Filters.Item[i].Criteria1 változókat végignézem 1-től Munkalap.AutoFilter.Filters.Count-ig, és ha akár egy is tartalmaz valamit, akkor le van szűrve, de talán lenne egyszerűbb módszer?
Van egy táblázatom, ami „szép színes” sok cellaformázást tartalmaz, valamint feltételes formázást is. A feltételes formázás a H oszloptól kezdődően összehasonlítja az adatokat az egymás melletti oszlopokban tehát H-I, J-K és így tovább. Ezt a táblát folyamatosan bővítem és sajnos egy idő után az Excel kiakad. Jelen esetben az AV-AW oszlopnál még semmi problémája nincs, viszont abban a pillanatban, hogy beleteszem az AX-AY oszloppárt is és menteni próbálom ezt adja:
Az Excel nem tudja menteni a(z) …..xls valamennyi hozzáadott adatát vagy formázását. A Mégse gombbal mentés nélkül visszatérhet a munkafüzethez. Ha a probléma kiküszöbölése nélkül kívánja folytatni a mentést, kattintson az OK gombra.
Tehát vagy nem mentem le és nem tehetek semmit, vagy lementem és akkor sem tehetek semmit :o) mert azt nem közli és nem is jelöli, hogy mit nem sikerült menteni.
Ez már tavaly is kiakasztott, akkor ugyanis az egész táblát újra kellett készítenem. Azóta minden verziót külön fájlban más néven mentek. Idén most értem el a bűvös oszlopszámot. Ez a 2003-as hibája? Ki lehet küszöbölni valahogy, vagy legalább meg lehetne tudni, hogy miben különbözik az így hibásam mentett tábla egy korábbi hibátlan táblától? Azt már tapasztaltam például, hogy a munkalapon lévő ürlap objektum (választókapcsoló, vagy rádiógomb) nálam szürkére van színezve. A hibás táblában a tulajdonsága szintén szürke, de ez nem jelenik meg és átlátszó lesz, hiába színezem újra.
Az előző módszerrel (Jimmy) megjelenítheted az y tengely viszonylatában a minimum és maximum értékeket.
Ezt továbbfejlesztve ha csak az x tengelyen szeretnéd jelölni, hogy hol vannak ezek az értékek, akkor arra egy megoldás, hogy második oszlopban a képletet így módosítod:
Az y tengely minimumát átállítod 0-ra. A második adat formátumát oszlopról pont diagramtípusra. Ezáltal az x tengelyen ott fog megjelenni a beállított jel, amelyik értéknél a minimum vagy maximum van.
Ha másra van szükség én is csak a makrót látom megoldásnak, de diagram területen nem vagyok nagyon jártas.
Direktben nem tudok ilyenről, de kerülő megoldások léteznek. Pl. Létrehozol az eredeti adatoszlop alapján egy segédoszlopot, olyan képlettel, amely csak a minimumra és maximumra ad eredményt. =HA(VAGY(B1=MAX($B$1:$B$8);B1=MIN($B$1:$B$8));B1;"") Azt is felveszed a diagramra, és ha sikerül feltölteni a képet, akkor itt látod az eredményt.
Vannak értékeim egy oszlopban, ezek vannak ábrázolva egy diagramon. Azt szeretném, ha jelölve lenne a diagramon, hogy hol van a legkisebb illtve a legnagyobb érték.
A form-ra tehető DTPicker-nek én sem találtam meg a LinkedCell tulajdonságát, viszont a változását viszonylag egyszerű munkalapon tükrözni:
Private Sub DTPicker1_Change() Sheets("Bevételezés").Range("D4").Value = DTPicker1.Value End Sub
Visszafelé sem sokkal bonyolultabb:
Private Sub Worksheet_Change(ByVal Target As Range) If Not Intersect(Target, Range("D4")) Is Nothing Then UserForm1.DTPicker1.Value = Range("D4").Value End Sub
Persze ez utóbbit azért fejre lehet állítani, mert a DTPicker nem tud akármilyen értéket fogadni, de legfeljebb kitalálsz neki valami okos hibakezelést.
Sziasztok! Egy form-ra elhelyeztem (többek között) egy DTPicker-t , viszont nem tudom a kiválasztott dátumot beírni az adott cellában, pld:„'Bevételezés'!d4”. Viszont , ha egy munkalapba ágyazom be akkor a tulajdonságoknál megjelenik a „ LinkedCell”, és oda beírom:„'Bevételezés'!d4”, akkor tökéletessen működik csak a form-on nem szerepel a tulajdonságoknál. Segítségeteket előre is köszönöm! Üdv:Zsiga
"Ha jól értem ez a ShowModal tulajdonság lehetővé teszi, hogy ..."
A ShowModal tulajdonság azt befolyásolja, hogy amíg a Form fent van, a fókusz lekerülhet-e róla, vagy sem. Egy modális Formról nem tudsz lelépni és pl. cellába kattintani. A nem modális Formról igen. Aztán hogy ennek még milyen egyéb járulékai vannak, azt én sem tudom pontosan. Ehhez már (azt hiszem) a Windows ablakkezelő függvényeit, algoritmusait kellene behatóan ismerni. De tapasztalatom szerint ez az egyik mellékhatás, amit te is írtál. Ám abban nem vagyok biztos, hogy ez jobb, mint Form aktiválásból indítani a dolgokat. A modális Form egyértelművé teszi a vezérlés útját. A nem modális Formok bekavarhatnak. Nekem voltak már gonjdaim több nem modális Form egyidejű alkalmazásával, de nem tudom elmondani, mert nem értem pontosan.
Van egy problémám. Még csak most kezdem tanulgatni az Excelt, és elakadtam. Nyitok egy Excelt. Úgy csinálam, hogy amit a Munka1-be beírok nevet, az a Munka2-be is megjelenjen. Azt szeretném elérni, hogy amit a Munka1-be beírok nevet, pl (Kovács Tamás) a Munka 2-be már név+rangjelzést jelenitsen meg. (Kovács Tamás tű. tőrm.) Segítségeteket előre is köszönöm.
Kölcsönvettem István ötletét a Progressbar feltételes frissítéséről, és így módosítottam a Sub-ot (a vastagított sor a különbség):
Sub Update_ProgressIndicator(PctDone As Single) With UserForm1 If .FrameProgress.Caption = Format(PctDone, "0%") Then Exit Sub .FrameProgress.Caption = Format(PctDone, "0%") .LabelProgress.Width = PctDone * (.FrameProgress.Width - 10) End With ' The DoEvents statement is responsible for the form updating DoEvents End Sub
Nekem ez így nem villog.
A várakozást azért raktam bele, mert úgy gondoltam, hogy anélkül egy pillanat alatt lefut. Nem próbáltam ki. Azóta igen, és láttam, hogy az első megoldásom várakozás nélkül is elég lassú, ez a módosított változat azonban elbírja.
Köszönöm. Ebben számomra az a furcsa, hogy csak a % jelzés villog, a kiíratott aktuális feldolgozási státusz (UserForm1.Label1.Caption) nem. Egy picit átalakítottam a feldolgozás jelző most ilyen:
Sub teszt() Dim i As Long, j As Long, V As Long
UserForm1.LabelProgress.Width = 0 UserForm1.Show V = 44567
For i = 0 To V Update_ProgressIndicator i / V, i, V 'For j = 1 To 5000 'várakozás 'Next Next Unload UserForm1
End Sub
Sub Update_ProgressIndicator(PctDone As Single, Indx As Long, Volume As Long)
With UserForm1 .Label1.Caption = "Feldolgozva: " & Volume & " -> " & Indx ' ez nem villog .FrameProgress.Caption = Format(PctDone, "0%") ' csak ez villog .LabelProgress.Width = PctDone * (.FrameProgress.Width - 10) '.Repaint End With ' The DoEvents statement is responsible for the form updating DoEvents
Bocsi most olvastam el „figyelmesebben”, hogy a % jelzés villog. (Nekem az egész panel villogot) A % jelzés valószínűleg azért villog, mert túl gyakran és nagyon gyorsan egymás után írja át a program. Erre én korábban olyan megoldást találtam ki, hogy egy változóban elmentem a beírni kívánt értéket, majd a következő ciklusban amikor újra kiszámolom a % értéket, akkor összehasonlítom az előző értékkel (csak az kiírandó egész részt INT függvénnyel) és csak akkor írom be az értéket a panelra, valamint csak akkor kérek repaintot, ha ez az érték megváltozott. Ezáltal ideális esetben megszűnik a vibrálás.
A villogásra csak tippelni tudok. Szerintem ezzel a ShowModal tulajdonsággal van összefüggésben. Mert igaz esetén én pont az ellenkezőjét tapasztaltam, ahogy korábban már írtam. Nekem a repaint villogot és a DoEvents meg abszolút nem. Csak ha ez a tulajdonság azt jelenti amire gondolok (8215), akkor sejtésem szerint nem ez a Form ablak az elsődlegesen aktív ablak és ez miatt villoghat. De Jimmy the Hand talán tud más magyarázatot is.
Ha jól értem ez a ShowModal tulajdonság lehetővé teszi, hogy a Form megjelenítése után folytatódjon az azt megjelenítő program? Én balga meg mindig a feldolgozó programrészeket és szubrutinokat beletettem a Form aktiválásába.
Ez a várakozás miért kell? A százalék jelzésének villogását nem lehetne valahogy kiszűrni? Érdekes, ha a DoEvents helyett UserForm1.Repaint -ot használom, nem villog olyan bántóan, viszon jóval lassabban fut le...
"csak még nem tudom, hogy lehetne rávenni, hogy pl. 35000 ig futó cikloson belül is megfelelően működjön..."
Például így: 1) Törlöd a Form kódlapjáról az aktiváláskor lefutó kódot 2) Átállítod a Form ShowModal tulajdonságát False-ra 3) Beírod az alábbi szubrutinokat 4) Futtatod a teszt nevűt.
Sub teszt() Dim i As Long, j As Long UserForm1.LabelProgress.Width = 0 UserForm1.Show For i = 0 To 35000 Update_ProgressIndicator (i / 35000) For j = 1 To 5000 'várakozás Next Next Unload UserForm1 End Sub
Sub Update_ProgressIndicator(PctDone As Single) With UserForm1 .FrameProgress.Caption = Format(PctDone, "0%") .LabelProgress.Width = PctDone * (.FrameProgress.Width - 10) End With ' The DoEvents statement is responsible for the form updating DoEvents End Sub
Nem tudom jó helyen járok-e, de van egy kérdésem. 2007-es officeban (word, excel) le van tiltva a Legutóbbi dokumentumok listájának módosítási lehetősége (szürke). /beállítások-speciális - megjelenítés rész/
Köszönöm, most tanulgatom a VBA-t probálok minden ötletet begyűjteni...
Íme egy másik feldolgozás jelző ami letölthető és még tetszetős is, csak még nem tudom, hogy lehetne rávenni, hogy pl. 35000 ig futó cikloson belül is megfelelően működjön...
Ha annyira titkosak azok a rejtett sorok, de egyébként szükségesek valamilyen számításokhoz és ezért nem lehet véglegesen törölni őket, akkor olyan megoldási javaslatom lenne, hogy azokat tedd át egy másik munkalapra és onnan hivatkozd meg. Majd ezt a másik munkalapot rejtsd el, de nem sima lapelrejtéssel, hanem VBA felületen kereszült
sheets("Munka2").visible=xlveryhidden
majd az egész VBA felületre tegyél jelszót. Halandó felhasználók ellen elegendő védelem.
A leírtakat a 2007-es Excelben tapasztaltam. Amikor a bal felső sarokra kattintok látszólag nem csinál semmit, de utána a Ctrl+C-vel tudom másolni az egész lapot. S azt már könnyedén be tudom illeszteni egy másik Excel állományba.
Nem tudom mennyire vagy otthon a VBA-ban, és a Form-ok kezelésében, de ez csak egy sima értékadás. Ha ezt az objektumot beleteszed egy Form-ba, ott tudod változtatni az értékét.
For ciklus = 1 To ciklusvege ProgressBar1 = int(ciklus/ciklusvege*100) DoEvents Next ciklus
Sajnos magát az értéket nem jeleníti meg, de az meg kiírható külön egy szövegdobozban ha szükséges.
Ez érdekes. Most próbáltam ki: ha a zárolt cellák kijelölése nincs engedélyezve, akkor nem tudom az egész lapot (bal felső sarok) sem kijelölni. 2003-as Excelem van.
Igen, a kicselezésen azt értem, hogy másolás után a rejtett cellákat (sorokat, oszlopokat) is beilleszti.
Sajnos a "zárolt cellák kijelölése" pipa kivétele sem működik (próbáltam korábban), mert ha az egész lapot kijelölöm (bal felső sarok) akkor kijelöl mindent (bár láthatatlanul), mégis lehet másolni, s beilleszteni mindent (rejtett cellákkal együtt).
Korán lelkesedtem. :( Igaz, hogy egyszerű a használata, de nem olyan szép, mert csak egységnyi kockákat ugrik és nem mutatja a folyamatos emelkedést, úgy mint az én barkácsolt megoldásom.
Tapasztalatom nincs, de most megnéztem. Szuper. (Például ilyet kerestem volna korábban.) Beállítható a minumum és a maximum értéke, ami alapból 0 és 100, majd értéket adva neki mutatja, hogy hol tartunk. Ezentúl nem kell barkácsolnom :o)
A folyamat/feldolgozás jelzővel kapcsolatban olvastam valahol, hogy viszonylag egyszerűen megoldható egy ProgressBar nevű eszközzel. Esetleg, van már valakinek tapasztalata ezzel kapcsolatban?
Ha egy tartományt kijelölsz és másolsz és ez a tartomány tartalmaz rejtett oszlopokat sorokat, akkor azt is másolni fogja. Tehát ahová beilleszted, ott megjelenik a rejtett sorok, oszlopok tartalma is.
Ennek kiküszöbölésére egy lehetőség például az, hogy a lapvédelem bekapcsolása elött kiveszed a pipát a "zárolt cellák kijelölése" sor elől. Ezáltal nem lehet kijelölni a cellákat, így másolni sem lehet. (Egyszerű halandó felhasználóknak)
Sziasztok, Tud valaki segíteni abban, hogy hogyan lehet (ha egyáltalán van erre lehetőség) Excel munkalapon másolásvédelmet beállítani a cellákra / összes cellára?
Vagy úgy elrejteni sorokat, hogy csak jelszóval lehessen felfedni (fonsot, hogy copy-paste után se legyenek ott ezek a sorok). A sima lapvédelmet ki tudtam cselezni. :(
Sajnos ez esetben ezt nem használhatom, mert olyan táblázatokat és programokat kell készítenem, amit az alap Excel támogat, vagy ha nem akkor maga az Excel fájl tartalmazza valamilyen módon beépülve, csatolva.
Sok erőforrást használhat így, de leleményes megoldás. Eszembe jutott még az, hogy lehet játszani a StatusBar-al is - nyilván nem látványos annyira, de egyszerű. Pl. Application.StatusBar = Application.StatusBar & "|"
Sub h() Dim Rng As Range ActiveSheet.Rows.Hidden = False Do Set Rng = ActiveSheet.Range("B:B").Find(What:=1, LookIn:=xlValues, LookAt:=xlWhole) If Rng Is Nothing Then Exit Do Rng.EntireRow.Hidden = True Loop End Sub
Bizonyos konkrét esetekben ezt még lehet tovább egyszerűsíteni.
Igen, ez egy plusz dll, amit telepíteni kell ahhoz, hogy VBA-ból elérhető legyen. Ez a rész szól a telepítésről:
"Installing ProgessReporter
Unzip and save the file to some directory. Then, go to the Windows Start menu, choose Run, and enter the following command: RegSvr32 "C:folderProgressReporter.dll"
Change the folder to the complete folder name in which you saved the file. Then, in your VBA Project, go to the Tools menu, choose References, and put a check next to "ProgressReporter"."
Aztat szeretném csinálni, hogy egy táblázat automatikusan (mondjuk gombnyomásra, vagy ilyesmi) rejtse el azokat a sorokat ahol a B (vagy akármelyik) oszlop értéke mondjuk 1 (vagy akármi).
Ezt is megnéztem. Az angol tudásom nem túl jó, de ha jól értem ez egy plusz dll, amit a gépre fel kell tenni, viszont ha készítek egy excel táblát makróval, és más valaki más gépen futtatná, ott meg nem lesz meg ez a dll. Vagy valahogy csatolható az excel fájlhoz?
Nem ismertem. Megnéztem. Ez végül is hasonló az enyémhez, de ebben az esetben is ismert mind a két ciklusban a futások száma. Viszont tanultam egy újat. Köszönöm. Eddig én a userform.repaint paranccsal frissítettem a panelomat, ami a gyakori frissítések miatt vibrálást okozott. Most kicseréltem erre a DoEvents-re és így most nem vibrál. :)
Nézd meg a VB Editor ablakban a Tools->References menüpontot. Ott valszleg lesz valami *MISSING* figyelmeztetés, hogy milyen DLL-t vagy OCX-t vagy hasonló függvény- illetve objektumkönyvtárt nem talál a gépre telepítve. Azt kellene pótolni. Ennek semmi köze a Mid függvényhez. Az sem biztos, hogy Office tartozék az illető.
>>Ja,a kérdésem arra vonatkozott, hogy az egysoros textboxban ott alul mitől lesz kék színű a folyamatjelző csík. (Vmilyen kék színű karaktereket fűzöl egymás után?)
Ez egy nem túl elegáns barkácsolás eredménye. A panelen látható elemek egyike sem TextBox, hanem Label. Csak úgy vannak formázva mintha TextBox-ok lennének. Jelen esetben egy 304 széles fehér Label-en van rajta egy 300 széles kék Label. Ennek a szélessége van változtatva 0-300 között ami a % érték 3 szorosa. Majd az egész tetején van egy harmadik átlátszó Label, amibe a % érték kerül. Nem túl elegáns, de tudásomból erre futotta. Azért érdekelne, hogy ezt hogy kellene "hivatalosan" és "profin"elkészíteni. Ennek a módszernek ugyanis van egy kis hibája, hogy géptől és képernyő felbontástól függően a kék Label egy nagyon picit elcsúszhat a fehér háttértől és akkor már nem olyan szép.
>> Persze ez akkor nem működik ha összesen egy ciklusod van és az sokáig fut. :(
Pontosan ez a helyzet áll fenn :)
>>Azt ne vedd készpénznek, hogy a problémádra nincs megoldás, mert én is amatör vagyok.
Amit megcsináltam, az is már egy fél megoldás - célnak megfelel, a felhasználó így már nem néz bután, hogy most akkor lefagyott avagy történik valami.
De mégis keserű a csokoládé, ezért kérdezősködtem itt erről és köszönöm a válaszaidat.
Ja,a kérdésem arra vonatkozott, hogy az egysoros textboxban ott alul mitől lesz kék színű a folyamatjelző csík. (Vmilyen kék színű karaktereket fűzöl egymás után?)
Van egy egysoros text box, majd alatta egy több soros.
Az egysorosba beírom az éppen aktuális folymatot. Például
x.munkalapon táblázat formázása folyamatban
vagy y munkalap adatainak ellenörzése, feldolgozása stb.
Majd amikor az egy sorosba új szöveget írok a régit sortöréssel hozzáfűzüm a többsoroshoz. Így azt is látja, hogy eddig mi történt.
Egyébként ha nem ismert a ciklusszám, de több egymás utáni feladatot kell elvégezned akkor az is megoldás, hogy minden egyes feladat elvégzése után kiírsz egy új % értéket. Ez által kisebb ugrásokkal számol a % értéked is mégsem kell ismerned a ciklusszámot. Az egyes százalék ugrások között meg kiírod a vonalaidat :) Persze ez akkor nem működik ha összesen egy ciklusod van és az sokáig fut. :(
Azt ne vedd készpénznek, hogy a problémádra nincs megoldás, mert én is amatör vagyok.
Szia! Köszönöm a segítségedet, korrekt. Jól sejtettem, hogy ismerni kell a lépésszámot. A legegyszerűbb megoldásra gondoltam én is - miszerint az épp futó folyamatot szövegesen kiírnám. De ennél tovább szerettem volna menni. A képen a folyamatjelzőt (textbox?) mivel töltöd fel?
Én a folyamatjelzésre kétféle módszert használok, azonban mindegyik esetben szükség van a ciklusszám ismeretére.
A legegyszerűbb esetben simán kiírom a ciklusváltozót és egy / jel után az ciklusok számát, így a felhasználó látja, hogy hol tart. Egy for each ciklus esetében természetesen előbb meg kell határozni a ciklusok számát majd bevezetni egy változót a ciklusszámlálásra. Ebből a két számból már kiírható a százalék is
A látványosabb esetben készítettem egy Form-ot melyben egy futó sávban jelzem és %-ban kiírom hogy hol tartunk, valamint felette egy szöveges mezőben azt hogy melyik munkafolyamat fut. Ennek egy hátránya van, hogy az állandó frissítések miatt vibrál.
Amikor több munkafolyamat van akkor egyszerre csak egy munkafolyamat esetén tudom megszámolni a szükséges ciklus számot. Ez esetben %-os értékben megbecsülöm hogy az egyes munkafolyamatok a teljes munkafolyamat hány %-át teszik ki.
például az első munkafolyamat 5%, akkor a kiíratandó érték:
Int(feldolgozott_adat /osszes_adat * 0.05 * 100)
A következő munkafolyamat 80% tehát a sávnak 5%-ról kell indulnia és 85-nél kell befejeződnie.
Szerintem a References a fájlban van rögzítve. Szóval ha a makrót tartalmazó fájlt teszed közzé, akkor mindenkinek tudnia kell futtatni. Másrészt, csinálhatod a fejlesztést úgy, hogy beikszeled az Outlook Object Library referenciát, és használod a kódkiegészítőt. És amikor kész vagy, kicseréled
ezt: Dim OL As Outlook.Application Set OL = New Outlook.Application
erre: Dim OL As Object Set OL = CreateObject("Outlook.Application")
és már nem kell a referenciával törődni.
Az Outlook-os makrórögzítést meg kicsit elnéztem... Bocsánat.
A "Reference-es" lehetőséggel az a baj, hogy a felhasználók nem tudják majd kezelni a kész makrót... (abból indulok ki, hogy nem szeretném a majdani felhasználóknak a kezét fogni) ezért valamilyen CreateObject-es megoldást kell találnom.
Azelőtt köszöntem meg, hogy kipróbáltam volna... :)
Kipróbáltam, amit mondtál, de a "." kirakása után nem jelenik meg lista a lehetőségekről. :(
Az Outlookban hogyan kell makrót rögzíteni?
Az Eszközök menü ---> Makrók menüpontja alatt nincs ilyen opció (Csak 3 lehetőségem van: ("Makrók..." :a már elkészített makrók listája; "Biztonság..."; "Visual Basic Editor").
SZiasztok, 1 db kérdésem van, jellegét tekintve inkább matek. A lényeg az hogy folyamatjelzőt készítettem
Const folyamat = "|" FJ.value = FJ & folyamat
módszerrel, bizonyos ciklusokba, sorokba beszúrva.
Azonban nem tetszik, mert ismeretlen a vége - tehát pakolgatja a More vonalakat, de a felhasználó nem tudja, hogy meddig. (De legalább azt látja, hogy valami történik.)
Fenti módszert követve egyszerűsíteném úgy, nem | vonalakat fűzögetne egybe, hanem számolna 100%-ig.
Azonban nem tudom hogy kell kiszámolni azt, hogy mindig 100 legyen a végére. Az a megoldás nem jó, hogy elindítom 1%-ról fenti módszert követve beszúrok 1-1 sort, hogy 10%.... 20%....30%....100%, mert egy változó lépésszámú for each ciklusba is bele kell raknom. Gondolom valahogy el kell osztani a 100-at és megszorozni valamivel. A gond itt az lehet, hogy iváltozó az ismétlődések száma.
Meg tudom számolni a for each ciklus lépéseit (ez egy sima selection.count lenne) és akkor már gyerekjáték lenne kiszámolni, hogy a végére 100legyen.
De nagyon kíváncsi vagyok, hogy más mit tud erről mondani.
Esetleg azt megpróbálhatod, hogy nevet adsz a két pivotos cellának. Kijelölöd az egyiket, aztán Menü: Beszúrás -> Név -> Név megadása, és beírod oda, hogy pl. "Pista_átlag". A másikat hasonló módon elnevezed "Józsi_átlag"-nak. Aztán a képleted kb. így fog kinézni: =Pista_átlag/Józsi_átlag
Az "=" és átkattintás Pivotba meg tudja tréfálni az embert. Javaslom, inkább írd be direkbe az egyenlőség jel után a pivotot tartalmazó lap nevét, utána felkiáltójellel majd a cella címét (=pivotosmunkalap!B5).
Annyit tennék hozzá, hogy angol Excelben a függvény-argumentumokat nem pontosvesszővel, hanem sima vesszővel kell elválasztani. Ha a vizsgáztatónak szőrös a szíve, akár ezen is el lehet bukni.
Azt kell elképzelni, hogy csináltam egy pivot-ot...ahol láthatom pl. Pista/Józsi hányszor vásárolt és mennyiért összesen.
Aztán egy másik munkalapon egy konkrét cellába formula szintjén nekem bele kell írnom Pista átlagát,...de ez egy teszt volt, szóval konkrétan a lényeg az, hogy abban a cellában benne kell lennie egy ilyen automatikusan kiszámoló formulának...
Mert persze magamtól, tutira megoldok mindent valami paraszti módszerrel...de itt ebben az esetben ez egy excel ismeretet tesztelő feladat volt, amivel engem vizsgáztatnak...
És dühítő, mert elég szarul sikerült, főleg hogy én magyar excelt használok és nem annyira egyértelmű, hogy angolul is tudnom kell a formulákat...meg persze 1 perc alatt meg lehet őket tanulni, ha szükséges...itt meg mégis hülyének jöttem ki :-(
Na, mindegy :-((...
Tehát, ami ezt a feladatot illeti, logikus, hogy a celléba beírom, hogy "=", majd átmegyek a pivot ablakában és bekattintom mivel is egyenlő és ezt a szám osztva egy másik pivotban lévő értékkel, de valami követhetetlenül hosszú sorok lesznek a formulában...szóval azt hiszem nem így kell csinálni....
Álláskeresésben vagyok ugyanis :-((...aztán ott teszteltek.
Szóval gondotam megtanulom, mert egyébként is jól jöhet még :-)...
De azt hiszem megint elég érthetetlenül írtam le a problémám....
1. többszörös feltételt írni (pl. ha A1=4, vagy 5, akkor B1 =1)...tudom, hogy ez nagyon könnyű dolog, csak hát én nem tudom :-(...
2. sorokat színezni az alapján, hogy pl. A1 páros, vagy páratlan szám (függvénnyel, azt hiszem valami MOD()
3. hogyan lehet (osztani szorozni) egy pivot táblázatban lévő számot. pontosabban az munka1 en egy cellában szeretnék pl. megjeleníteni egy átlag számot, amit egy pivotban lévő táblázat alapján számolok ki...de függvénnyel...fúúú, nem tudom értehető-e a kérdésem...
Magyarul bejött 4 időpontban 5-5 termék és ki kellen adni 7,3,4 db terméket úgy hogy a legelső 5 és a második 2 menjen ki először, aztán 3 db a második bejövőből, aztán 4 db a harmadikból. Mindegy elsőre hogy néz ki. Meg tudom csinálni én is, de ha már készített valaki ilyet nagyon szívesen vennék egy xls-t.
VBA dettó. Meg tudom írni, de azt hiszem fölös erősfeszítés lenne, ha már létezik ilyen és a felhasználók miatt, egy egyszerűbb Exceles megoldás lenne a hatásos.
Csatolás Excel 2003-ban: Adatok menü - Külső adatok importálása - Adatok beolvasása - prn fájlt adok meg, majd szövegimportáló varázsló. No most ezen a fülön jobb egérgombra lehet frissíteni, ill. az Adattartomány tulajdonságainál lehet beállítani, hogy "Frissítéskor rákérdezés a fájlnévre". No tehát ennek a frissítéséről lenne szó.
Nem értem a helyzetet. Mit jelent az, hogy "egy fülre csatolva van egy textfájl"?
Úgy tudom elképzelni, hogy Menü: Beszúrás->Objektum->Létrehozás fájlból, és ott a csatolás fájlhoz négyzetet beikszelni. Namost. Ezt a munkafüzetet elmentem, megnyitom, és nyitáskor kérdezi, hogy akarom-e frissíteni a más helyekre mutató hivatkozásokat. Mondom neki, hogy igen. De tőlem nem kérdez semmiféle fájlnevet...
Szóval pontosan mi is ez, és mit akarsz vele csinálni?
Egy fülre csatolva van egy textfájl (prn). Frissítéskor rákérdez a fájlnévre, no de egyre több fájl közül kell kiválasztani a helyes fájlt és ez nagyon zavaró.
Olyat szeretnék, hogy ha pl. az A1 cellára lép valaki, akkor jöjjön elő a frissítéskor előbukkanó szövegfájl importálása (persze csak a fájlt kellene kiválasztanom újra - a varázsló nem kell).
Az megy, hogy az A1 cellára kattintva elinduljon egy makró, csak az nem, hogy - a frissítés ablak jöjjön elő - adott kiterjesztésű fájlok jöjjenek csak elő (pl. 11*bx.prn) - egy ftp helyen lévő könyvtár tartalma jöjjön elő (név-jelszó rögzítve lehet).
Köszönöm a jótanácsokat. Egyébként gondoltam arra, hogy stringgé darabolja, írja a help is. Egyelőre megpróbálom valahogy számmá alakítani, a rejtett cellás megoldásod is jó, csak nem tetszik annyira.
Szerintem nem lenne itt semmi gubanc, ha a tömbödben számok lennének. De egy Split() után sztringek kerülnek a tömbbe, és az Average emiatt fut zátonyra. Nézd csak:
Arra kellene rájönni, hogyan lehet a sztringsorozatot elegánsan átalakítani számsorozattá. Egy lehetséges megoldás, hogy a tömböt egy (rejtett) cellatartományba másolod, és ezt a Range-et adod meg az Average paramétereként. De ez nem elegáns.
Az idő az Excelben számként van ábrázolva. Az egység a nap. Az idő megfeleltethető egy végtelen számegyenesnek. Konvenció szerint a számegyenes 1-es értéke 1900.01.01. 0:00:00 időpontnak felel meg. Minden egységnyi lépés egy napot jelent előre vagy hátra az időben. Az 1900 előtti dátumok (tehát a negatív számok) kezelése alapértelmezésben nincs benne az Excelben.
Amikor egy dátum típusú változónak értéket adsz (pl. D = "1999.02.12"), akkor a változóhoz tulajdonképpen egy valós szám rendelődik hozzá, amelynek csak a megjelenítési módja dátumforma. Ezzel a számmal minden matematikai művelet elvégezhető, amit valós számokkal el lehet végezni. Így például a fenti D dátumból gyököt lehet vonni, ki lehet számolni a szinuszát, meg lehet szorozni kettővel, stb. és valódi értékek jönnek, ki, csak éppen az értelmük kérdéses.
Dátumokat végzett műveletek esetében általában a következő aritmetikai műveleteknek van értelmük: - két dátum különbsége (időtartam) - dátum és időtartam összege v. különbsége
Az időtartam egy tetszőleges szám, de ez is nap alapú. Tehát 24-gyel kell megszorozni, ha óraszámot akarsz belőle kihozni.
Ha egy dátumváltozóval matematikai műveletet végzel, az eredmény gyakran valós (Double) típusú lesz, ezt dátummá a CDate() típuskonverziós függvénnyel alakítod.
És még a következő segítségre lenne szükségem.Van egy honlap, ahol kijelölök egy részt, ami betüket és számokat tartalmaz.Ezt másolom, és egy Excel táblázatba beillesztem.Csak az a baj, hogy egyes számértékekekt Pl: 4,15 értéket a beillesztés után 15.Ápr-ként jeleniti meg.Hogyan tudnám azt elérni, hogy ne dátumként írja át, hanem ahogyan beillesztettem, azaz 4,15-ként?
Azt szeretném kérdezni, hogyan tudok olyat csinálni, hogy pl. az első sor (A) az folyamatosan látszodjon ha lefele görgetek listán? Abban a sorban irtam be az oszlopok megnevezését és szeretném látni, ha pl lemegyek a 60. sorba.
Akkor a Solver lehet a megoldás, annak meg lehet adni, hogy egészértékű lehessen csak a változód. Kicsit hosszú lenne itt leírni a működését, először olvass utána, és ha van kérdésed, szívesen segítek. Üdv József
Próbáltam a célértékkeresőt, de sajnos az nem talált olyat, de ha kézzel görgettem a léptetőt, akkor talált.A célértékkereső tizedes végű számokat is behelyettesít, igy nem jó nekem ez a megoldás.Más ötleted nincs?
Ez így biztosan nem jó, mert az egész számokhoz hozzáad 1-et (12,1 -> 13 ok, 12,9 -> 13 ok, 12 -> 13 nem ok). Inkább ezt próbáljátok ki: Application.WorksheetFunction.RoundUp(Arg1, Arg2)
Lenne egy kérésem, nem tudom, hogy ez az excelben megoldható-e.
A következő:
Van benne egy léptető, amely a H1 cella értékeét változtatja.
Ez a H1 cella értéke K és az L oszlopokkal van összefüggésben.Azaz jelenleg a H1 cella értéke 234, ami a K oszlopban 234-nél a vele azonos sorban lévő érték 67.
A K oszlop állandó értékek, de az L oszlop változó értékek vannak,amelyek egy másik cella értéke alapján más lehet, bár ezt most nem tüntettem fel itt.
A 234 érték ugye jelenleg a 67-et hozza, amit behelyettesít a D oszlopba.
Az A , B , C, D oszlopok értékei soronként össze vannak adva,ami az E oszlopban jelenik meg.
Az F oszlopban meg HA függvény található, amely a G4-es cellával van összefüggésben, aminek az értéke szintén változó érték ,ami változtatható, de itt most 1160.Ennek hatására abban a sorban megjelent egy 1-es, ahol a G4 cella értéke megyegyezik.Ez az 1 es szám van ott megjelenitve a G1 cellában.
A művelet a következő:A léptetőt 1-es értékről indulva léptetjük, ami D , és az E oszlopban folyamatosan változik.De a G4 es oszlopba beírunk egy tetszőleges értéket, ami itt 1160, és a léptetőt addig léptetük, mig nem talál olyan sort, ami megfelel a G4 cella kritériumának, és ha megfelel akkor a HA függvény segítségével megjelenik az adott sorban az 1 szám, ami összesítve megjelenik a G1 cellában.
A léptetőt meg addig léptetjük, amig itt a példán 234 értékre nem ér,mert itt adta ki előszőr azt a sort, ahol egyezés van.
Ez volt a leírása a dolognak, és most jönne a kérdésem.
Lehet-e olyat csinálni, hogy H1 cella értékét 1-től kezdve az excel automatikusan 1-el növekedve addig helyettesítse be magának, mig el nem ér addig, ahol egyezés található, azaz itt a 234 értékig.Mert a léptetőt nem akarom egyfolytában nyomni, és figyelni, hanem helyettesítsen be magától, és ott ahol megfelelnek a feltételek, ott álljon meg.
Remélem nem ilyet tud az excel, és nem csak álmodozom...
De durva. Azt gondoltam, hogy erre lesz egy tulajdonság, aztán kész - amit ki lehet fejezni 1-2 rövid sorral. Erre ( ha jól értem a kódot) az oldaltörés szélétől kell kiszámolgatni a cella helyét.
Ja még annyit, hogy a bemenő paraméter Range típusú, tehát meghívható úgy is, hogy pl. MsgBox Oldalszám(Workbooks("akármi.xls").Sheets("Munka1"):Range("AB1234"))
Function Oldalszám(Cella As Range) Dim SavedBckp As Boolean, EmptyCell As Boolean, WS As Worksheet Dim HPB As HPageBreak, VPB As VPageBreak Dim HCount As Long, VCount As Long, i As Long
Set WS = Cella.Parent SavedBckp = WS.Parent.Saved
If Cella = vbNullString Then EmptyCell = True If EmptyCell Then Cella = 1 For i = 0 To WS.HPageBreaks.Count - 1 If Cella.Row < WS.HPageBreaks(i + 1).Location.Row Then Exit For Next HCount = i
For i = 0 To WS.VPageBreaks.Count - 1 If Cella.Column < WS.VPageBreaks(i + 1).Location.Column Then Exit For Next VCount = i
If WS.PageSetup.Order = xlDownThenOver Then Oldalszám = VCount * (WS.HPageBreaks.Count + 1) + HCount + 1 Else Oldalszám = HCount * (WS.VPageBreaks.Count + 1) + VCount + 1 End If
If EmptyCell Then Cella = vbNullString WS.Parent.Saved = SavedBckp
End Function
Sub teszt() MsgBox Oldalszám(Range("W67")) End Sub
Az Excelben van egy "beépített" hiba az oldaltörések kezelésében. Bizonyos esetekben előfordulhat, hogy a fenti program kiakad. Más esetekben pedig hibás eredménnyel tér vissza. Ez utóbbi akkor fordul elő, amikor a táblázat utolsó értéket tartalmazó sora éppen egy vízszintes törésvonal fölött van, illetve az utolsó értéket tartalmazó oszlop éppen függőleges egy törésvonal előtt. Biztosan ezt is le lehet kérdezni, de arra most nem fussa. Egyéb esetekben szerintem jól működik.
Sziasztok!
A következő problémában szeretnék segítséget kérni:
Adott egy Microsoft Office SharePoint Portal Server 2003 tárhely, ahonnan hiba nélkül tudok egyenként excel fájlokat megnyitni az alábbi utasítással:
Workbooks.Open Filename:= "http://groupweb/mappa1/mappa11/mappa111/teszt1.xls"
Ami probléma, az a tárhelyen található *.xls fájlok listázása, az alábbi eljárás Run-time error 52 (Bad file name or number) hibaüzenettel akad ki.
Tudna valaki segíteni?
Sub Lista()
ListaAdat = 0
tmp = "http://groupweb/mappa1/mappa11/mappa111/"
FN = Dir(tmp & "*.xls", vbNormal)
Do While FN <> ""
MsgBox FN
FN = Dir()
ListaAdat = ListaAdat + 1
Loop
End Sub
A Worksheet_SelectionChange eseménykezelő, mint a neve is mutatja, akkor aktiválódik, amikor a munkalapon megváltozik a kijelölés. Tehát pl. másik cellába kattintasz.
A Worksheet_Change eseménykezelő ezzel szemben akkor aktiválódik, amikor a munkalapon bármelyik cella tartalma változik meg.
Mindkettőnek van egy Target nevű "paramétere", amely egy Range típusú objektum, és az első esetben az újonnan kijelölt, a második esetben az éppen megváltozott tartományt tartalmazza. Ha pl. az A1 cellába írsz 1-et, akkor a Worksheet_Change eseménykezelő esetében a Target az A1 cella lesz, és a pl. a következő értékek olvashatók ki belőle Target.Address = $A$1 Target.Value = 1 Target.Interior.ColorIndex = ... (az aktuális színkód) stb.
Ha azt akarod, hogy cellától függjön, hogy az eseménykezelő lefut-e, akkor így lehet eljárni: If Target = Range("A1") Then (lefut) Else Exit sub End If
Nem értem hogyan, mert ellentmond a józan észnek, hiszen a képlet csak az adatbázis második sorára hivatkozik, nincs definiált mezőnév de működik. >:o) Hát, ez az Excel... Különben hogyan is lenne több, mint nyolcezer hozzászólás ebben a topikban :))
Tehát alapesetben a feltételnek úgy kellene kinézni, hogy az első sor tartalmazza a mezőnevet ami azonos az adatbázis első sorában lévő névvel a második sortól pedig kezdődnének a feltételek.
Azonban ha képletet akarunk megfogalmazni, akkor az első sort (D25) hagyjuk üresen a második sorba (D26) pedig írjunk be egy képletet, melynek igaz vagy hamis lehet az eredménye. Jelen esetben a problémás oszlopom az adatbázisban az E oszlop. Tehát a feltételbe ezt kell beírnom: =Adatbázis!E2<>"987" és már működik is. Nem értem hogyan, mert ellentmond a józan észnek, hiszen a képlet csak az adatbázis második sorára hivatkozik, nincs definiált mezőnév de működik. >:o) Így a =AB.SZUM(alapadatok;"Érték";Feltételek!D25:D26) eredménye az összes rekord kivéve a 987-esek.
Az általad említett logikai és információs függvényeket csak magában az adatbázisban használhatnám, de oda nem lehet annyi oszlopot és annyi logikai feltételt beírni, amennyi Valamelyik régebbi hozzászólásomban leírtam, hogyan lehet függvényeket használni a feltételtáblában a szűrőfeltétetel megadására, keress rá, nagy valószínűséggel megoldja a problémádat.
Mint írtam adatbázis függvény szűrési feltételeivel van probléma.
Az adatbázis egy 50000 sorból és 21 oszlopból áll. Ebből kell adatbázis függvényekkel egy kész jelentést készíteni. Az egyes adatok bonyolult szűrési feltételekkel állnak elő, melynek egy csekély része ez a korábban említett kizárás.
Az általad említett logikai és információs függvényeket csak magában az adatbázisban használhatnám, de oda nem lehet annyi oszlopot és annyi logikai feltételt beírni, amennyi feltételt meg kellene fogalmaznom. (Legalábbis úgy értettem, hogy oda írjam be ezeket a függvényeket és arra az új oszlopra hivatkozzak a feltételnél.)
Ez a problémás oszlop 3 karakterből álló kombináció, melyben lehet szöveges és számos karakter is. A 987 csak egy példa volt.
Mellesleg már kipróbáltam mindegyik említett függvényt és mindegyik azt az információt adja vissza, hogy a cellában szöveg található, hiszen a cellában található érték egy szövegfüggvény eredménye.
Tehát problémás képlet a
=AB.SZUM(alapadatok;"Érték";Feltételek!D25:D26)
melyben a D25:D26 a feltétel lenne. Ez a feltétel majd több oszlopból és sorból állna, de most maradjunk csak ennél az egy problémás feltételnél. A D25 a mezőnév, a D26 a feltétel, ami a példa kedvéért <>987 lenne, de ez nem működik, mert nem zárja ki a 987-es rekordokat. Hogy tudnám megadni, hogy a <>987 feltételben lévő karakterek, (jelen esetben a 987) szövegként értelmezendők és nem számként. (Az idézőjelekre sem működik <>"987"
Lehet, hogy a végén nem marad más hátra, mint hogy magában az adatbázisban kell megoldanom, hogy ha az adott cellában csak szám karakterek szerepelnek, akkor az legyen számmá alakítva az ÉRTÉK függvénnyel, ha viszont van benne betű is (5P9) akkor maradjon szöveg.
Most akkor kell a 987 vagy nem kell? Ha kell, akkor valami olyannal próbálkoznék, hogy ÉS(B1=987;SZÁM(B1)) A lényeg, hogy a logikai függvények segíthetnek, nézd meg ezeknek a súgóját: SZÁM NEM.SZÖVEG TÍPUS
Átolvasgattam a forumokat és itt találtam sok okos embert, akik talán tudnak segíteni nekem is. :)
Van egy adatbázisom. Az egyik oszlopban szövegfüggvényekkel előállított adatok találhatóak. Például AAA és 987. Mivel ezek szövegfüggvényekkel vannak előállítva, ezért a 987-et nem számként, hanem szövegként értelmezi az excel (balra van rendezve). Ennek így is kellene maradnia.
Most adatbázis függvényyel szeretnék számolni. Ha a feltételt tartalmazó cellába 987-et írok összeszámolja a 987-es szöveget tartalmazó rekordokat annak ellenére, hogy a feltétel cellában lévő 987-es érték szám és nem szöveg. (cellaformátum általános és a beírt értéket jobbra rendezi az excel) Most szeretném kizárni a 987-es rekordokat. Ha a <>987 értéket írom a feltételbe, akkor eredménynek az összes rekordot kapom. valószínűleg azért mert az excel úgy "találja", hogy 987-es számot nem tartalmaz az adatbázis, ami igaz is mert csak 987-es szöveget tartalmaz. A <>"987" sem működik. Tud valaki valamilyen megoldást? Úgy rémlik, hogy kb 6 évvel ezelött ezt már sikerült megoldanom, igaz akkor még 95-ös excelben, most meg 2003-as van. Lebutult az excel?
Természetesen megoldás lehetne hogy két képlettel számolom ki a kívánt értéket. Az összes rekordból kivonom a 987-es rekordok értékeit, de más okok miatt szükségem van rá hogy a kizárás <> feltételt használjam.
Köszönöm a tanácsokat! Tényleg valami olyasmit vártam, hogy itt tegyél egy pipát, vagy onnan vegyed ki, és kész. Azért lett jó ötlet!
Igazából -mint nagyon sokan- nem arra használom az exelt, amire ki van találva. Különböző listákat irogatok bele, ezeket rendezgetem különböző szempontok alapján. Meg számológépnek is használom. :)
Én sem 2003-ban, de még a neten sem. És ha Micro$oft sem tud/akar jobbat javasolni, akkor nincs más hátra, mint betenni a jelenséget az "ez van, ezt kell szeretni" feliratú dobozba.
Ez is jó, de ez sem állandó megoldás. Ha valaki nagyon sok ilyet ír be, és sose akarja átváltoztatni, akkor joggal idegeskedik. Arra gondolok, hogy a Worben például az automatikus formázás beállításainál ki lehet kapcsolni, hogy magától felsorolásra váltson, ha úggy kezdek egy bekezdést, hogy '1.', meg még egy csomó hasonlót. Az Excelben viszont nincs olyan beállítás, hogy ne kezdjen semmilyen önhatalmú automatikus formázásba. Én legalábbis nem találtam a 2000-esben, pedig szerintem a kérdező ezt keresi. Talán még lehetne egy rögzített makrót csinálni az összes formázás visszaállítására, és annak kitenni egy ikont az eszköztárra, és akkor alkalmanként egy kattintás, de igazából még az is sok.
Micro$oft says: Method 2 1. Select a range of cells, and then click Cells on the Format menu. 2. Click the Number tab. 3. Click Text, and then click OK. This method allows you to type data in the selected cells as text. You must perform these steps before you type the numbers in the cells.
Valószínűleg volt már hasonló kérdés, de már akkora ez a topic...
Excel folyamatosan irogatja át azt, amit én gépelek. Azt akarom, hogy ne tegye. Soha, semilyen körülmények közt. Azért írom bele úgy, ahogy, mert azt akarom ott látni. Pont azt.
Ha azt írom be, hogy 10.15, akkor átírja 15.okt -ra.
Dühít. Ha dátumot szeretnék csinálni, majd szólok neki. (Arra sohasem volt még szükségem.) A cella formátumot generalként szeretném megtartani... Folyamatosan kell számokkal, szövegekkel vegyesen babrálnom.
Ez annyira felhasználó barát, hogy éveket vesz el az életemből. Hosszú órákat töltöttem már el, az értelemetlen sugó olvasgatásával, végig böngésztem az Tools/optionst, de nem lelek rá a megoldásra. Pedig valami pofon egyszerűnek kell lenie.
Színezd be az első sort amilyenre akarod, a következőt hagyd fehéren. Jelöld ki ezt a két sort, majd Ctrl + C Jelöld ki azt a területet, ahol alkalmazni akarod a formátumot.
(A sorokat úgy jelöld ki SZERINTEM úgy, hogy a sorszámra mutatsz az egérrel, a kurzor meg is változik.)
Majd Menü - Szerkesztés - Irányított beillesztés -> itt jelöld be a csak formátumot.
Hmm, ezek nagyon bonyolultnak tűnnek. Azt hittem könnyű megcsinálni, mert láttam ilyet sokszor, ezt a felváltott színezést. Mindenesetre köszönöm a részletes választ.
Beszúrok egy képet, h mi is ez, egy filmlista, csak látványosabbá akartam tenni, meg áttkeinthetőbb is lenne úgy.
És nem az egészet akarnám, hanem csak a 2. sortól lefele, a D oszlop szélességéig.
Sub sorok() For sor = 1 To 999 Step 2 Rows(sor & ":" & sor).Select Selection.Interior.ColorIndex = 2 Rows(sor + 1 & ":" & sor + 1).Select Selection.Interior.ColorIndex = 34 Next End Sub
Kétféle megoldás jut eszembe. Az egyik a feltételes formázás használata, a másik pedig makró. Az elsőt leírom, a másikat majd valaki más elmondja, ha szükséges lesz. 1. Válaszd ki az A1 cellát 2. Menü: Formátum -> Feltételes formázás 3. 1. feltétel: A képlet értéke, =MARADÉK(SOR(A1);2)=0 (lásd ábra) 4. Megadod a kívánt formátumot, aztán OK gomb 4. A1 cella másolás (Ctrl+c) 5. Kijelölöd azt a részt, amit formázni akarsz (bizonyos sorok, oszlopok, vagy akár az egész táblázat). 6. Menü: Szerkesztés -> Irányított beillesztés -> Formátumot 7. Ha az A1 cella nem része annak a tartománynak, amit kékre akarsz csíkozni, akkor az A1 cellából törlöd a feltételes formázást.
Meg fogod látni, hogy ez a formázás sajátosan reagál arra, ha beszúrsz vagy törölsz cellákat, sorokat, oszlopokat. Kérdés, hogy mi a célod pontosan.
lehet ez nagyon láma kérdés de nem bánnám ha megválaszolnátok:
hogy tudom azt megcsinálni, hogy egy táblázatban a sorok felváltott színűek legyenek, tehát pl az 1. sor fehér, 2. világoskék, 3. megint fehér, 4. világoskék? Mert a cellaformázás opcióban ezt sehogy sem lehet. 2007-es Excelem van.
Private Sub Worksheet_SelectionChange(ByVal Target As Range) On Error Resume Next If Target.Address = "$B$2" Then ActiveWindow.Panes(2).Activate Range("AA:AA").Select End If End Sub
Kissé láma vagyok, de nagyon szeretnék egy olyan scriptet, hogy ha egy megnevezett cellába kattintok a függőlegesen felosztott munkalap bal oldalán, akkor a jobb oldal egy adott oszlophoz ugorjon.
Mármint minek a többszöröse? A hété biztosan nem, mert akkor nem kellene maradékot nézni. De ha folyamatosan vannak számozva a napok, akkor ugyanaz a hetes maradék nyilván mindig a hétnek ugyanazt a napját jelenti, örökkön-örökké.
Sub proba() MsgBox Weekday(DateSerial(2008, 12, 0), vbMonday) MsgBox Day(DateSerial(2008, 12, 0)) End Sub
A DateSerial hasznos tulajdonsága, hogy nullát és negatív számokat is elfogad paraméternek. Pl. a DateSerial(2008, 12, 0) kifejezés 2008. november 30-at jelent a DateSerial(2008, 12, -1) kifejezés 2008. november 29-et jelent a DateSerial(2008, 0, 0) kifejezés 2007. november 30-at jelent stb.
Ha tehát bármely hónap utolsó napja kell, nem kell tudnod, hogy hány napos a hónap, hanem így kell paraméterezni: év, hónap+1, 0
"Hogyan lehet meghatározni tetszőleges hónap milyen hosszú." Legegyszerűbb fejben, számítógép nélkül. :-DDDD
Nem pontosan értem a függvényekkel szembeni ellenérzéseidet, és hogy melyiket akarod elkerülni és miért, de az is lehet megldás, ha a keresett dátumot számmá alakítod, és egyszerűen megnézed a maradékát héttel osztva.
(Azt meg végképp nem értem, hogy az Excelbe miért táplálták ezt az idióta saját belső dátumábrázolást, amikor a folyamatos napszámozásra több, mint háromszáz éve van ismert és elfogadott eszköz, a Julián-dátum.)
sziasztok, remélem tud valaki választ a problémámra a gond a következő: leíró statisztikát (összesítő statisztika) kellene készítenem egy táblázatból, ki is jelölöm hozzá a kellő mezőket, leokézom, és azt írja ki, hogy "a bemeneti tartomány nem-numerikus adatokat tartalmaz" biztos hülye vagyok hozzá de nem tudom mit tegyek. a nem-numerikus adatok is kellenek bele, asszem, órán legalábbis sikerült. köszönöm, előre is
Szia! - Hogyan lehet meghatározni tetszőleges hónapjának első napja a hét melyik napjára esik. Bekapcsolod a Eszközöd/Bővítménykezelőből az Analysis ToolPak-t és akkor lesz egy WeekNum nevezetű függvényed, ami ezt adja. Ha ez nem elég, előkeresek egy méteres képletet, ami enélkül is kiszámítja. - Hogyan lehet meghatározni tetszőleges hónap milyen hosszú. Ha A1 van egy dátum, akkor az e hónap napjainak számát a következő képlet adja meg (az eredményt számformátumra meg kell formázni) =DÁTUM(ÉV(A1);HÓNAP(A1)+1;1)-DÁTUM(ÉV(A1);HÓNAP(A1);1) Üdv József
A feltételes formázásról azt tapasztaltam, hogy az általa megszabott formátum és a cella normál formátuma egymástól független, és a feltételes formázás prioritása nagyobb. Ha pl. a cellát pirosra színezed, de a feltételes formázás alapján sárga kell legyen, akkor sárgának fogod látni. És amíg ez a sárga él, addig bármilyen színűre beállíthatod, nem fogsz változást látni.
Amikor először feltetted ezt a kérdést, akkor kaptál egy makrót Delilától, ami kiszínezte a feltételnek eleget tévő cellákat. Amikor ehelyett a feltételes formázást javasoltuk, nem tudtuk, hogy végül is hogyan akarod használni. Azt mondanám - az újabb adatok ismeretében -, hogy egyszerűbb makróval formázni a cellaszíneket, egyszer, amikor már minden egyéb szempontból kész és végleges a táblázat.
Ennek ellenére - csak mert kihívás volt - csináltam egy makrót, ami a feltételes formázást alakítja át fix formázássá. A kérdéses munkalapon kell lefuttatni, és reményeim szerint beszínezi azokat a cellákat, amelyek a feltételes formázás alapján színt kaptak volna. A kódból látható, hogy az 1-e típusú formátum esetén csak 3 relációt (>, =, <) vizsgáltam meg, de a többi ezek alapján pótolható. Szerintem nem lesz rá szükség.
Sub CopyFormat() Dim cel As Range, WS As Worksheet Set WS = ActiveSheet For Each cel In WS.Cells.SpecialCells(xlCellTypeAllFormatConditions).Cells cel.Select With cel.FormatConditions(1) If .Type = 1 Then Select Case .Operator Case xlGreater If cel.Value > Evaluate(.Formula1) Then cel.Interior.ColorIndex = .Interior.ColorIndex Case xlEqual If cel.Value = Evaluate(.Formula1) Then cel.Interior.ColorIndex = .Interior.ColorIndex Case xlLess If cel.Value < .Formula1 Then cel.Interior.ColorIndex = .Interior.ColorIndex End Select ElseIf .Type = 2 Then If Evaluate(.Formula1) = True Then cel.Interior.ColorIndex = .Interior.ColorIndex End If .Delete End With Next End Sub
Javaslom, készíts biztonsági másolatot, mielőtt ezt kipróbálod.
Megjegyzés: Általában ellene vagyok a cellák szelektálásának, de ez valahogy nem ment másképp. Ha nem választottam ki a ciklusban az aktuális cellát, akkor a cel.FormatConditions(1).Formula1 kifejezés rossz képletet adott vissza. Nem tudom, miért van ez.
Akiknek átadod a táblázatot, menniyre ismerik az excel "titkait"? A munkalap jelszavas védelme nem segít? Átadás előtt a D oszlopot jelöld be védetté és rejtetté is, majd rejtsd el és kapcsold be a lap védelmi valami frappáns jelszóval. Utána átadhatod.
Milyen számok szerepelnek a D oszlopban, és mi titkos ezekből? Például hozzá lehetne rendelni a D oszlop értékeihez valami kódot? Mondjuk egy összetett HA függvénnyel 10 és 20 között A, 20 fölött B stb. Ezek már nyilván nem titkosak, hiszen a színezés sem az. Ha kiadsz egy színezést, akkor nyilván kiadod valamennyire azt is, hogy mi annak az alapja.
És nincs valami korreláció a két oszlop között, aminek az alapján a céloszlopot formázhatnád? Akár úgy is, hogy nagyjából megcsinálod feltételessel, aztán kézzel korrigálod. Biztos meg lehet csinálni makróval a dolgot, de azt nem én fogom elmondani.
Szerintem sehogy, bár nem vagyok biztos benne, hogy jól értem a problémádat. Törlés helyett inkább tedd rejtetté azt az oszlopot, és akkor a kecske meg a káposzta is. Esetleg körül lehetne nézni az irányított beillesztésnél, ha valami, akkor tán az tud ilyet.
Nemrég kaptam egy jó tanácsot, hogy hogyan lehet "Feltételes formázással" formázni a táblázatot.
Ez jó is működik, de az lenne a kérdésem, hogy hogyan lehet ezt a formázást úgy "rögzíteni", hogy ha pl. azt az oszlopot kitörlöm ami a formázás "feltétele" maga formázás megmaradjon?
Hát igen, azok a játékok érdekesek. Mondjuk én nem szoktam excellel játszani, mert arra ennél jobb eszközök is vannak. Az viszont érdekelne, hogyan csinálják. De az a pár játék, amit megnéztem, nem engedte megnyitni a kódmodulokat.
Ami Józsefet illeti, szerintem biztosan nem mondott búcsút nekünk. Talán csak az a baj, hogy nem hagyjuk szóhoz jutni :) Delila pl. igen gyorsan reagál a feltett kérdésekre ;)
Egyébként ha körülnézel, rengeteg játékot lehet találni, ami az excel cellákat grafikai mátrixként használva fut excel alatt, pl Pacman stb.... Jópofa dolog ilyet látni azon a felületen, amit általában nem erre szoktunk használni :)) Aki erre képes, az tud excel (visual basic-et) programozni. Meg nagyon ráér.
Szerintem is egy hatalmas chatszobára hasonlít - de ez nem baj. (Természetesen van kivétel is)
Szeretem ez az exceles topikot. Sajnos ha a mag eltűnne, akkor úgy érzem kihalna. Így is hiányolok 1-2 arcot, (pl József, rengeteget tanultam tőle is) a többiek még fel-fel bukkanak.
Az egyetlen hiba, amit nehezményezek, hogy Opera böngészővel nem úgy viselkedik a hozzászólás szerkesztő, ahogy egyébként. 10 éve használom ezt a böngészőt, nem tudok az extráiról emiatt lemondani...
Egy (NEKEM) rázós kérdésre emlékszem, amikor az user arra volt kíváncsi, hogy mit kell tenni ahhoz, hogy kiszámolja az excel két egyenes metszetét egy x;y tengelyen egy gombnyomásra. Jó játék volt megoldani.
Az index nem támogatja a közösségformálást - kivéve néhány topicot, ami a semmiből nőtte ki magát offline baráti társasággá - közös gondolkodású tagokból. Sőt. Óva intenek attól, hogy bárki saját vagy más személyére utaló információkat adjon közre, de ez egy másik téma.
Továbbá van itt egy szűk mag, aki életben tartja ezt a topikot. Mi lesz ha ezek eltűnnek? Pl "József"-et hiányolom, bár lehetséges, hogy olvas. Sok jó dolgot tanultam tőle IS.
Ez érdekes, a vastagbetűkkel kiemelt probléma nálam is előfordul, de úgy érzem ez mégsem a fórumszoftver hibája. Egyébként azt hittem ezzel egyedül vagyok :)
Gondolom, ezek szakmai fórumok. Én is ismerek pár ilyet. Közös jellemzőjük, hogy minden kérdező új topikot nyit a kérdésével, ezért nem keverednek össze az egyes problémákhoz tartozó hozzászólások. Lehet regisztrálni egyes (pl. saját) topikokra, és kérni értesítést, ha azokban új hozzászólás jelenik meg. Sokkal könnyebb így nyomon követni és visszakeresni a dolgokat.
Továbbá, azok a fórumok jobban támogatják a segítségnyújtást (pl. fájlfeltöltés lehetőségével) és a közösségformálást (pl. privát üzenetekkel), mint az index.
Az index viszont egy annyira általános fórum, hogy itt aztán ablaktól zsiráfig minden téma előfordul. Évente több millió hozzászólás, és a legtöbbnek túl sok értelme nincs is. Inkább hasonlít ez egy hatalmas chat szobára. A magam részéről nem sok esélyét látom, hogy ez változni fog. De nem bánom. Ez az exceles topik elég jó szerintem, általában minden problémára kerül valami használható válasz. Vagy csak elkerülnek az igazán rázós kérdések? Még senki nem jött pl. azzal, hogy excelből akar fűnyírót vezérelni...
Több fórum értesít a hozzászólásokról. Van, amelyiknél kérhetjük a napi 1-, vagy választhatjuk a minden hsz-ról való értesítést.
Ha előcsalom ezt a fórumot, először mindig a fejemhez vágja, hogy:
"A művelet elvégzéséhez sajnos nem rendelkezik a szükséges jogosultsággal."
Újabb belépésre megengedi a bejelentkezést, ha ezután hozzá is akarok szólni, előbb megint sajnálkozik, és csak utána enged be. De a legördülőben akkor is kiírja, hogy váltsak nicknevet.
Ezeket az apró technikai furcsaságokat leszámítva nagyon szeretem ezt a fórumot.
OFF Indexen nincs ilyen jellegű szolgáltatás, ellentétben egy másik fórummal (Azt hiszem Delile is erre gondolt) - ahol úgy látszik nem okozott problémát ennek megvalósítása. De van erre számtalan példa is, egy szó mint száz - az indexen nincs. ON
Tulajdonképpen elsiettem az előző hsz-t, mert azóta kifundáltam egy sokkal egyszerűbb megoldást.
Private Sub ComboBox_Feltöltés Dim Rng As Range Set Rng = ThisWorkbook.Sheets("Munka1").Range("E2") Set Rng = Range(Rng, Rng.End(xlDown)) ComboBox1.List = Rng.Value End Sub
Ez a szubrutin mindig a teljes listát lecseréli, nem csak elemeket ad hozzá a meglévőkhöz. Meg kell hívni egyszer a form inicializálásakor, és utána minden alkalommal, amikor a másik lapon új rekordokat viszel be.
A szépséghibája ugyanaz, mint a "direkt" (tulajdonságlapon történő) feltöltésnek. Ha ugyanennek a MultiPage-nek a másik lapján felviszek egy új rekordot, ezen a lapon csak akkor mutatja, ha előbb kilépek a UserFormból.
Erre nincs gyógymódod?
Az is nagy segítség, hogy az első használatnál nem mutat jónéhány üres sort, mint az E2:E500-nál.
Private Sub UserForm_Activate() Dim Rng As Range, cel As Range Set Rng = ThisWorkbook.Sheets("Munka1").Range("E2") Set Rng = Range(Rng, Rng.End(xlDown)) For Each cel In Rng.Cells ComboBox1.AddItem cel.Value Next End Sub
=FKERES(ide válaszd ki azt a sorszám cellát amit vissza kell keresned; itt add meg azt a tartományt úgy, hogy az első oszlopa a visszakeresendő sorszám legyen; az előzőleg kiválasztott tartománynak az az oszlopszáma, amit vissza akarsz keresni.; HAMIS)*2 a *2 azért kell, mert aszontad duplája kell az árnak
Állsz a C3-on, és a jobb alsó sarkában lévő kis fekete négyzetre duplán klikkelsz. A képlettel kitölti a C oszlopot addig, míg a B-ben talál maga mellett adatot.
pfff... köszi. Isten biz próbáltam a Range-val is, ahogy mutatod, de nem tetszett neki. Igaz, Excel.Application-nal, de akkor sem értem azzal mit rontottam el. Köszi még1x
Sziasztok, azt szeretném most megkérdezni, hoigy egy névvel ellátott tartományt hogy tudok elérni a makróban?
Ha esetleg így nem érthető: Kijelölök egy tartományt és megadok neki egy nevet (pl menü-beszúrás-Név megadása) És erre a névre hivatkozni szeretnék a makróban, hogy pl válassza(select) ki, vagy a tartományát integrálni szeretném vhová, akkor mit kell tennem?
Pedig ez kiüríti az A1 tartalmát. Záráskor rákérdez a mentésre, természetesen menteni kell, akkor töröl. A zárójel fele biztosan csak itt a fórumban maradt le.
1. Működne programból, ha nem Excel.Application-ból vezérelném - de így sajnos nem működik.
2. ...Forrás.Range("B2").End(xlDown).Offset(0, 12)... Ha hiszed, ha nem, nem ment az Address nélkül, pedig szerintem is működnie kéne. Próbáld ki, szerintem neked sem fog menni, ha hasonlóan éred el a munkafüzetet mint én.
3. Ha kézzel SIMÁN másolom át, akkor valóban a képletek értékként másolódnak át egyik munkafüzetből a másikba (valóban...)
Egyébként feladtam. Feltöltöm For Each ciklussal, viszont ennek se barátja a mergelt cella :(
For Each CELLA In xls.Selection formában sajnos végig lépked az egyesített cellát alkotó sorokon is :(
Van erre vmi módszer, vagy figyeljem a cikluson belül valahogy hogy kihagyja. Azt tudom, hogy van MergeArea stb... de azt nem, hogy miként lehetne ezt rábeszelni, hogy csak a mergearea cellákon lépkedjen végig.
"Ha kézzel csinálom, akkor mindenféle irányított beillesztés nélkül ÉRTÉKKÉNT átmásolódik a tartomány a forrásból a célmunkafüzetbe."
És programból ugyanez nem működik? Mert akkor a pastespecial kihagyható lenne...
"A Range tartomány végcellája változó, ezért van az Address-el meghatározva."
a végcella meghatározása odáig tart, hogy (pl.) Forrás.Range("B2").End(xlDown).Offset(0, 12) Az Address azért kell, mert a Range definiálását sztringgel végzed. Ezt akarod kihozni: Range(cella1.address & ":" & cella2.address) Ehelyett javasoltam a Range([color=#ff0000]cella1[/color], [color=#0000ff]cella2[/color]) verziót: Range([color=#ff0000]"N7"[/color], [color=#0000ff]Forrás.Range("B2").End(xlDown).Offset(0, 12)[/color]) (remélem, sikerült a színeket alkalmaznom...)
Rövidebb a kód és jobban áttekinthető. Ezen túlmenően nem tudom, van-e más előnye.
csak kimarad az "önmagára másolás"
Az önmagára másolás azért kell, hogy a forrás helyen ne képletek, hanem értékek legyenek. No de ha a képletek is értékként másolódnak, akkor persze nincs szükség erre a lépésre.
2. észrevételedhez kapcsolódóan: A Range tartomány végcellája változó, ezért van az Address-el meghatározva. Azt tudom, hogy ezt lehetett volna egyszerűbb formában is, vagy Cells(sor,soszlop) segítségével, de ez "így maradt" Ugyanakkor van egy olyan érzésem, hogy nem erre vonatkozott az észrevételed, de akkor mire?
Köszönöm, még mindig dolgozoma megoldáson, de tudod mi a poén? Ha kézzel csinálom, akkor mindenféle irányított beillesztés nélkül ÉRTÉKKÉNT átmásolódik a tartomány a forrásból a célmunkafüzetbe. Holott a forrásban képleteket tartalmazó tartományt jelölök ki! (Ez 1-1 munkafüzet. Nem 1-1 munkalap 1 munkafüzeten belül) Valószínűleg hihetetlen, de igaz. (Annyira azért értek az excelhez, hogy hülyeséget ne állítsak.)
Egyelőre azzal próbálkozom, hogy fennt leírtakat alapján megjelenítem a 2 munkafüzetet.
A köztes megoldásodra gondoltam én is, de egyszerűen nem tudok aludni, ha nem sikerül enélkül. (tisztább, szárazabb érzés lenne...:) Ettől függetlenül jó ötletnek tartom.
Szóval, ha jól értem, van két munkafüzeted és mindegyiken egy kijelölt munkalap. A forrás és a cél munkalapon egyaránt vannak egyesített cellák. Te a forrás munkalap valamely, egyesített cellákat tartalmazó tartományát akarod a cél munkalapra másolni, egy olyan tartományra, ahol az egyesített cellák elhelyezkedése pontosan ugyanolyan, mint a forrás tartományban volt. És ez nem megy.
Vigasztaljon a tudat, hogy a probléma gyökere nem az OLE objektumban és nem a kódodban van, ugyanis ez a művelet ugyanazon a munkalapon belül, kézi vezérléssel sem megy. Tehát: Ha pl. A1:A2 cellák egyesítve vannak, valamint B1:B2 cellák egyesítve vannak, akkor A1:A2 -t kimásolva B1:B2-be nem tudok irányított érték-beillesztést csinálni.
Úgy tapasztaltam, hogy a fenti művelet csak az értékek beillesztésénél akad ki, ellenben sima másolás, formátum-beillesztés, képletbeillesztés, stb. megy. Ennek alapján egy kerülő megoldást tudnék javasolni. A kerülő módszer lépései:
1. A forrás tartományt átmásolod egy segédmunkalapra (Forrás.Copy Destination:=Segéd) 2. A forrás tartományt önmagára másolod értékekkel (Forrás.Copy, Forrás.PasteSpecial xlvalues) 3. A cél tartomány formátumát átmásolod a forrásra (Cél.Copy, Forrás.PasteSpecial xlFormats) (Ekkor a forrás tartományod már csak értékeket tartalmaz, és formátumában pontosan olyan, amilyennek a cél munkalapon ki kell néznie.) 4. A forrás tartományt átmásolod a célra (Forrás.Copy Destination:=Cél) 5. Visszaállítod a forrás tartomány eredeti tartalmát (Segéd.Copy Destination:=Forrás)
Ha a cellaformátumok nem számítanak, akkor a 3. lépés ki is hagyható.
Ha megengedsz még két észrevételt. 1. Szerintem érdemes lenne két munkalap objektumot deklarálni. Sokkal áttekinthetőbbé tenné a kódot. 2. A Range két sarokcella megadásával is definiálható, nem csak a címeiket tartalmazó sztringgel.
A javasolt módosításokkal a kódod így nézne ki (nyilván nem teszteltem):
Dim Forrás As Worksheet, Cél As Worksheet Set Forrás = pivot.Worksheets("pivottable")
For i = 1 To 2 Set Cél = payment.Worksheets(WS) Forrás.Range("O:O").AutoFilter Field:=15, Criteria1:=TIPUS 'szures alapanyagszallitokra
Ezzel kapcsolatban most elakadtam. Gyakorlatilag ezzel a módszerrel másolgatok át egyik munkafüzetből a másikba tartományokat. A gond az, hogy ez tartalmaz egyesített cellákat is. De: A két xls egyesített cellái azonos számú sorokat foglalnak össze. (oszlopokat nem) Ennek ellenére nem tudom átmásolni a tartományokat a megfelelő helyeikre. Találkoztál már ilyennel, ill. erre tudsz vmi megoldást?
=($C1>10) helyett valami =($D1>10) jellegű képletet tettél be a feltételes formázásba? Figyeltél arra, hogy hol van dollárjel és hol nincs? Mert ez alapvető fontosságú!
Ez már érdekesebb, de nekem egy kicsit össze vissza jelöl.
A biztonság kedvéért itt a tábla képe amit meg kell oldani.
Szóval a "D" oszlopot kell vizsgálni és a ha ott találok 10 db feletti értéket akkor a "B","C","D","E" oszlopokhoz tartozó celláket kell beszinezni az adott sorban.
nekem az előzőekben leírt módszerrel nem a legjobban csinálta meg.
Ha kéritek szúrok be olyan képet amit azzal csinált.
Ez már érdekesebb, de nekem egy kicsit össze vissza jelöl.
A biztonság kedvéért itt a tábla képe amit meg kell oldani.
Szóval a "D" oszlopot kell vizsgálni és a ha ott találok 10 db feletti értéket akkor a "B","C","D","E" oszlopokhoz tartozó celláket kell beszinezni az adott sorban.
nekem az előzőekben leírt módszerrel nem a legjobban csinálta meg.
Ha kéritek szúrok be olyan képet amit azzal csinált.
- Állj rá az A1 cellára. - Írd be feltételes formázásnak, hogy - 1. mező: képlet értéke - 2. mező: =$C1>10 - Állítsd be a formátumot amire akarod. - Miközben az A1 cella aktív, kattints a "formátum másolása" gombra. - Jelöld ki az A-B-C oszlopokat.
A megoldás, akkor is a feltételes formázás: 1. Kijelölöd a teljes munkalapot, vagy ott, ahol az adatok vannak (tehát nem csak a C oszlopot) 2. Formátum/ Feltételes formázás Képlet értéke: =($C1>10)
Ha nem az első sortól jelölted ki, akkor $C2, $C3 stb. A lényeg, hogy olyan vegyes hivatkozást kell használni, ahol az oszlop ("C") rögzített, a sor pedig relatívan változik. 3. Beállítod a sárga hátteret.
Köszi, ez tök jól mőködik, de lehet, hogy nem voltam eléggé egyértelmű.
A lényeg, hogy pl. az adat amit vizsgálok a "C" oszlopban van és ha ott igaz a feltétel, hogy 10 felett van akkor a "C" oszlop éppen vizsgált sorában (pl.10) az "A10" és a "B10" is ki kell, hogy legyen színezve és persze a "C10" is.
Én az általad említett 2. módszert használom. Sokat küzdöttem vele, mert ez bizony nem szűr semmilyen hibát - tehát valószínűleg jobb a te 1. módszered.
Legközelebb ezzel próbálkozom én is, mert magamtól nem fogom tudni hogy minek milyen metódusa/tulajdonsága van.
Most már megírom így a kódomat (2. módszerrel), legalább jól megalapozom vele a könnyebb 1.módszeredet...
Nem tudom, hogy néz ki a táblázatod, de sztem működnie kellene az ofszetes megoldásnak. Mert ha pl. az összegzendő tartomány A1:A5, és az A6-ban van az összeg, akkor a helyes képlet: =SZUM(A1:OFSZET(A6;-1;0)) Ha itt beszúrsz egy sort a 6-os sor elé, akkor a képlet az A7-be kerül, és így módosul: =SZUM(A1:OFSZET(A7;-1;0)) az OFSZET(A7;-1;0) hivatkozás pedig az A6-os cellára mutat, tehát a SZUM függvény az A1:A6 tartományt összegzi.
Az, hogy a tartomány eleji vagy végi beszúrás miért nem módosítja a képleteket, gondolom költői kérdés. Legalábbis, ha tudnánk is a választ, az sem módosítana a helyzeten. Viszont megfigyeltem egy érdekességet.
A1:A7 tartományba számokat írtam, A8-ba pedig SZUM(A1:A7) Aztán beszúrtam egy sort A8 elé. A képlet A9-be került, és továbbra is SZUM(A1:A7) maradt. Ezután beírtam egy számot A8-ba, mire a képlet az A9-ben SZUM(A1:A8)-ra változott!!
1. Jelöld ki a kérdéses oszlopot. 2. Menü: Formátum -> feltételes formázás -> 1.feltétel: a cella értéke nagyobb, mint 10 3. Állítsd be a kívánt formátumot.
Előnye a makrós módszerrel szemben, hogy - teljesen automatikus, nem kell makrót futtatni minden módosítás után - ha az oszlop máshová kerül, a formátum beállítások mennek vele, míg a makrót módosítani kellene, hogy rendesen működjön
Köszi a keresést, ezzel nekem nem működött a dolog, de "kínomban" kitaláltam egy megoldást:
=SZUM(E2:INDIREKT(ÖSSZEFŰZ("E";SOR()-1)))
Továbbra sem értem azonban az excelnek azt a működési módját, amelyben:
ha a szumma függvénnyel összegzel egy adott tartományt (mondjuk öt sor A oszlopát a hatodik sorban - "=szum(a1:a5)" ), akkor, ha a tartományban beszúrsz egy plusz sort, akkor a szumma függvény automatikusan kijavítódik ("=szum(a1:a6)" lesz), de ha az összegző sorba szúrsz be plusz sort (ami az összegző sor fölé kerül, tehát látszólag az is a tartomány része lesz), akkor az nem változtatja meg a szumma függvényt (marad "=szum(a1:a5)").
Érti ennek valaki a magyarázatát? Mert számomra nem logikus.
Meg kellene oldani azt, hogy egy oszlopot vizsgálva cellánként az abban szereplő értékeket figyelembe véve, amennyiben pl. 10 nél nagyobb szám van a cellában akkor az álltalam beállított cellák hátterét szinezze ki pl sárgára.
Lehet, hogy ez full hülyeség, de van egy 4000 soros táblázat amiben ki kell emelni háttérszínezéssel bizonyos sorokat asszerint, hogy egy bizonyos oszlop pl. "J"-ben szereplő érték nagyobb-e mint 10 vagy sem.
Most ez manuális munka és kb. fél óra.
Szóval ha lenne megoldás akkor köszönöm a segítséget.
Látszólag ugyanaz a dolog és mégsem. Elmondom konkrétan a problémát:
Van egy részösszeges tábla, amibe a részösszeges csoportba, annak utolsó, részösszeg előtti sorába szeretnék sort beszúrni úgy, hogy a beszúrt sor megfelelő adatát is adja bele a részösszegbe. Az excel sajátossága adja a porblémát, aminek az a lényege, hogy ha a részösszeg (vagy szumma) soron állva szúrsz be sort, akkor nem bővül a réssszeg tartomány képlete (nem lesz eggyel több), hanem marad ugyanannyi, míg ha a résszösszeg tartományon belül szúrod be a sort, akkor a képlet is nő a beszúrt sorok számával. Ezért, ha a résszösszegen állva szurok be sort a tartományba, akkor nem fogja a beszúrt sor adatát a résszösszeg tartalmazni, ha meg a réssszöszeg felett szurokbe sort, akkor az meg nem lesz a tartomány utolsó sora. Mindezek miatt kellene úgy tudni beszúrni sort, hogy a tartomány utolsó sora alá tudjak sort beszúrni, ne az eggyel alatti fölé.
Excel application objektumot kétféleképpen tudok létrehozni (bár lehet, hogy van még egy tucat lehetőség):
1. Dim xls As As Excel.Application Set xls = New Excel.Application
2. Dim xls As Object Set xls = CreateObject("Excel.Application")
Az első módszer előnye, hogy a fordító már a kód írásakor tudja, hogy milyen objektumom van, és felkínálja a lehetséges property-ket és method-okat, továbbá egy rakás hibát kiszűr, még mielőtt a program futását engedélyezné. Pl. nem engedi, hogy olyan property-t írjak a kódba, amilyen az Excel application-nek nincs.
Te viszont általában a CrateObject-et használod, legalábbis innen úgy tűnik. Annak milyen előnye van az 1. módszerhez képest?
Nem ismerem az OLE objektumos elérési lehetőségeket. (Vagy lehet, hogy ismerem, csak nem tudom, hogy úgy hívják?) Elmondod, hogy megy ez? Hátha tudok valami tippet adni.
Illetve van még egy kérdésem, köszönettel venném ha valaki segítene. Szintén OLE objuktomon keresztül kimásolok Copy-val egy tartományt, de én csak az értéket akarom átadni. Ez ugye így nézne ki de természetresen nem működik:
Sziasztok, OLE objektummal elért munkafüzetben hogy lehet For Each-el bejárni egy Selection-t? Ha esetleg így nem érthető a kérdésem másolok be kódrészletet.
A kérdésem most az lenne, hogyan tudom beállítani azt, hogy egy billentyű kombinációval beállított eljárást az Eszközök - Makró - Makrók - Indítással ne lehessen elindítani? Ha a modul tetején Option Private Module-t használom, nem indul el a beállított billenytyűkkel...
Kedves Delila_1, magyarpityu, Jimmy the Hand!
Köszönöm szépen a segítséget! Végül, magyarpityu topictárs vezetett a jó megoldásra, mivel a megoldásával (7934) a 2 és 100 között változó értékeket is lehet összegezni.