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.
Végig gondoltam és arra jutottam hogy nem generál ilyen jellegű hibát, mert:
1. A felhasználó elindítja a makró munkafüzetből a makrót
2. Kiugrik a fájl kiválasztós ablak
3. Csak miután megnyitotta a fájlt számolja össze hány excel fájl van nyitva egyszerre
4. Felhasználó pislog egyet és kész a fájl
Közben viszont így rájöttem hogy hibát generál az, ha meggondolja magát és nem választ ki fájlt...kiugrik a debug ablak, amivel feltételezhetően nem fog tudni mit kezdeni :-DDD. Majd segítségért kiált :-DDD...és jövök.
Utólag ezt még kijavítanám, de már szétküldtem a makrot aztán nem bonyolítom a dolgokat.
"A kérdésem az lenne, hogy lehet-e olyan globál változót definiálni - és aztán értéket megadni - az egyik munkafüzetben, ami a másik munkafüzetben is az előző munkafüzetben megadott értékkel bír? "
Nem tudom. Azt viszont biztosan lehet, hogy minden e szempontból lényeges szubrutinnak legyen egy olyan bemenő paramétere, amelyik a bőbeszédűségét hivatott szabályozni. Aztán a főprogramban kell feltenni a kérdést, és a válasznak megfelelő paraméterezéssel meghívni a többi szubrutinokat.
A másik lehetőség, hogy valami .cfg vagy .ini fájlt hozni létre, és abban tárolni a mindenkire vonatkozó adatokat. Ez a bonyolultabb megoldás szerintem.
Több munkafüzetben vannak, igen. (Az egyikben van az az összesítő program, amiből meghívom a - különböző helyeken lévő - szubrutinokat, a másikban -harmadikban, stb. - a szubrutin.) A kérdésem az lenne, hogy lehet-e olyan globál változót definiálni - és aztán értéket megadni - az egyik munkafüzetben, ami a másik munkafüzetben is az előző munkafüzetben megadott értékkel bír?
Az a helyzet hogy csináltam egy adattáblát és egy olyan diagrammot kellene csinálnom amiben a meghibásodások vannak az idő függvényében. tehát hogy melyik daru mikor milyen hibákat szenvedett.( a számok a hibakódokat jelölik)
És valahogy nem működik, de nem tudok rájönni mi hibázik.
Úgy írja, minth a Find részben lenne hiba...de ha külön az "immadiate" ablakban nézem, akkor tökjól működik a kód. Arra még rájöttem, hogy az oszlopok neveit "" közé kell tennem...
Szerinted mi lehet a baja?
Elfogytak a tippjem, pedig sokat próbálgattam...
Nem lehet, hogy a find nem tudja melyik sheet-en keressen?
Köszi az ötleteklet!
:-)
Sub DeleteColumns()
Dim sor As Integer Dim oszlopnev As String
Sheets("Sheet1").Select
sor = 1
Do While Sheets("Sheet2").Cells(sor, 1) <> "" oszlopnev = Sheets("Sheet2").Cells(sor, 1).Value
Szép megoldás! Innen is látszik, hogy a programozás egy nagyon logikus dolog és egy jó ötlet gyakran fontosabb mint az utasítások teljes ismerete (ami persze nem nélkülözhető, sajnos).
csak el szeretném mesélni, hogy kitaláltam egy még jobb megoldást a makró átadására.
A macrót egy munkafüzethez fűztem, amit simán lehet továbbítani...onnan a felhasználó maga választja ki a kívánt fájlt. Így nem kell Personal-ba másolgatni.
És amivel annyit szenvedtem...rájöttem, hogy ez a workbooks(1) stb...bekavart amiatt, ha nekem volt Personal file-om a gépem, de másnak nem...az 1 néha a Personal volt, néha meg a megnyitott fájl.
Az is gondot jelentett, ha már volt megnyitott munkafüzet.
De mindezt kiküszöböltem ezzel az egy sorral :-):
Miután kinyitotta a felhasználó a kívánt fájlt:
a = Workbooks.Count
Onnantól úgy tudok hivatkozni rá, hogy
Workbooks(a)
:-)
Tökjó megoldásnak tűnik, eddig nem generált hibát.../remélem nem is fog/
Ezt nem egészen értem. Amúgy igen, a (bármelyik) makrólap elején Public utasítással definiált változóra gondoltam. De mi az, hogy "több munkafüzetre érvényesen megadni"? Erre akkor lenne szükség, ha a makrók különböző munkafüzetekben lennének. Egy adott munkafüzetben definiált Public változó (tudomásom szerint) tartja az értékét mindaddig, amíg egy End utasítás végre nem hajtódik, vagy be nem zárod a munkafüzetet.
Ha az összes programkód ugyanabban a munkafüzetben van, akkor bármelyik szubrutin bármikor látja a változó értékét. Függetlenül attól, hogy a programkódot tartalmazó munkafüzet mellett még milyen egyéb munkafüzetek vannak nyitva, és éppen melyik az aktív.
Oké, így csinálom. A globál változót (gondolom a makrólap elején public utasítással definiált változóra utalsz) viszont nem tudom több munkafüzetre érvényesen megadni. Ezt lehet-e, ha igen hogyan megadni?
Szerintem kellene a globál változó, hogy kell-e az emelt szintű szolgáltatás, vagy nem. A program elején feltenni a kérdést, aztán a választól függően jeleníteni meg a továbbiakban az msgbox-okat.
Ha a kérdésed az volt, hogy egy makró mellett futhat-e egy másik makró, ami automatikusan kiválasztja pld a Yes válaszokat, akkor ilyen ésszerű munkaráfordítással nem gondolom, hogy készíthető.
Nos, ha a msgbox kiolvas valami választ (OK, Cancel, Yes, bármi) akkor a kódból ki kell hagyni a Msgbox részt és a feltételezett-kézi-választ be kell írni (hardcoding) a makróba.
Ekkor nem áll meg megkérdezni, hogy "Ízlett-e a kávé, user Úr" (Yes/No) hanem a kódban a változó a Yes értéket kapja és következő lépésként megsimogatja a titkárnő buksi fejét.
Mert alapesetben ez egy user-friendly program, szépen megkérdezi a felhasználótól, hogy hogy tetszik lenni, hogy szolgál az egészsége, akar-e egy picit klikk(el)eskedni, hogy megkapja a napi betevő információt, stb.stb. így szépen sorban. Nade nekem, mint programírónak és főszerkesztő úrnak nincs szükségem ilyen emelt szintű kiszolgálásra, nem kell a fenekem alá tenni mindent, jó nekem egy mezei "yes" válasz is, egyből, bele a közepibe.
Ehhez a problémakörhöz tartozik még egy kérdés: egy programban felbukkanó msgbox üzenetet lehet-e kézi beavatkozás (az üzenet ok gombjára való rákkantítás nélkül) nélkül, makróból lekezelni egy megfelelő utasítással? Ha igen, akkor hogyan?