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.
Szerintem ennek működnie kell, ha jól értem a problémád:
Ha(A1="Teljesítve";A1&A2&A3&A4;"")
A függvény indig relíve fogj amegnézni a Ha függvény igaz-e, thea, ha ezt a füügvényt lehúzod, akkor az A 41-es cell mellé már automatikus ezt fogja írni az excel:
Olyat szeretnék csinálni, hogy miután megkerestem az egyik cellában lévő értéket, így: HA("Teljesítve"=A1;IGAZ;""). Az IGAZ helyére egy összefűz képletet akarok beilleszteni, de úgy, hogy fűzze össze az A1,A2,A3,A4 cellák tartalmát. Ezt így próbáltam megoldani: ÖSSZEFŰZ(A1;A1+1;A1+2), csak, hogy ilyen argumentumot nem ismer az excel. Hogyan tudom megoldani ezt a problémát. Ha a következő alkalommal pl. az A41 cellában kap IGAZ értéket a HA függvény, akkor az A41,A42,A43-as cellákat kell összefűzni.
Hogyan lehet ezt megoldani? A megoldás az lenne, hogy ÖSSZEFŰZ(A1;A2;A3) csak ez így ebben az esetben nem jó, tehát ez helyett valahogy tudatni kell az excel-el, hogy az adott cella, és az az alatti cellákat akarom összefűzni.
'Itt adod meg, hogy addig tartson a ciklus, míg a Sheet2 'lap A oszlopában nem talál üres cellát Do While Sheets("Sheet2").Cells(sor, 1) <> "" 'Az OszlopNév változóba betöltöd a cella értékét. 'A .Value elhagyható, mert ez az alapértelmezés OszlopNév = Sheets("Sheet2").Cells(sor, 1).Value
'Keresés és törlés, ahogy előbb írtad Cells.Find(What:=OszlopNév, After:=ActiveCell, LookIn:=xlFormulas, _ LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _ MatchCase:=False, SearchFormat:=False).Activate Columns(ActiveCell.Column).Delete
'A "sor" változó növelése sor = sor + 1 Loop
SQL-nek igaza van, hibát okozhat az elgépelés. Egy hibakezeléssel ki lehet lőni (a hibát, nem SQL-t).
Látható, hogy bárhol használhatsz változót, csak vigyázzni kell, hgoy a változó olyan fajta legyen, amire az adott környezetben szükség van. Itt pld. az OszlopNev String kell legyen.
Én lebeszélnélek a Find használatáról, mert mi van ha nem talál meg valamit (pld elgépelés a Sheet2-n)? Akkor még simán továbblép a következő makro sorra és próbál törölni, de valszeg rosszat fog törölni.
Örülök, hogy sikerült érthetően leírni a dologot :-D.
Egyedül szeretném megoldani /egy kis segtséggel :-d/ a makrót. Van egy kis időm és gondoltam elszórakozom vele. Igazából ez amit most kitaláltam csak egy szépítés már. Senki sem kért rá, csak magamat szórakoztatom :-)...
Ha jól értelmezem Delila_1 makrója az első sor első oszlopával kezd, de nekem ez pont mindig labilis, hoyg hol kezdődik...ezért is használtam ezt a FIND-os parancsot, ami mindig megtalálja bárhol is van a fejléc....
Azt valahogy én nis érzem, hoyg valami ciklusban kéne kiovasnom egy virtuális "memóriába" egymás után a törlendő neveket a listából...csak ez az amit nem tudom hoyg kell és hogyan kell behelyettesíteni a FIND után, nem konkrét oszlopcímként, hanem "virtuális változókén"...
Elég kezdő vagyok makróból...még sosem írtam ciklust....főleg olyat nem ami működöt :-DDDD...
Mi a terved? Szeretnéd ha valaki készen megírná neked a kódot, vagy segítség kell ott ahol elakadsz?
Én személy szerint a másodikat javasolnám, mert arra aminek magad kutatsz utána, tuti emlékezni fogsz. Nyilván az első mellett szól ha sürgős a dolog.
A második szellemében: - csinálni kell egy loop-ot (lásd Delila kódját), ami a Sheet2 összes releváns celláján végigmegy, hogy egyenként kiolvassa a törölni kívánt oszlopok nevét. - ezt a nevet eltároljuk egy String tipusú változóban - ezen a loop-on belül írunk vagy egy másik loop-ot vagy egy For/Next ciklust, ami végigmegy a Sheet1 összes releváns celláján és kiértékeli (If) hogy a két név megegyezik-e. - ha igen, törlés - ha nem, akkor tövábblép a ciklusban.
Azért lenne praktikusabb nem kérdezgetni, mert nagyon sok oszlop van, majdnem 60...jobb lenne, ha magátol megcsinálná :-)....
De maga a törlés nem is gond már. Arra találtam tök jó kereső parancsot.
Jobb lenne, ha kiolvasná egy fix helyről és lehetne bővíteni/javítani a listát, hogy ne kelljen sokat gondolkodni a felhasználónak :-)...Ez egy fix template-ben lenne.
Igazad van. Tök érthetetlen, amit írtam. Akkor megpróbálom kicsit érthetőbben :-D:
Sheet1 - egy adatbázis, aminek 3 oszlopát törölni kell, de változó melyik sorban kezdődnek a fejlécek és hogy milyen sorrendben.
Sheet2 - Lenne egy felsorolás egymás alatt azokkal az oszlopnevekkel, amiket törölni kell. Ha esetleg felmerül új oszlop név, amit törölni kell akkor elég ide beírni és a makro már azt is felhasználja. /A lényeg, ha változik az oszlopnév, akkor idegen ne turkáljon a makrómban...tehát hogy rugalmas is legyen a makró a felhasználó számára, mert nem csak én fogom használni/
Amit eddig sikerült megcsinálnom:
Makro, ami megkeresi a konkrét oszlopcímet és törli az oszlopot.
Sub DeleteColumns() Cells.Find(what:="Time To Resolve (Discontd 3/08)", after:=[A1], LookIn:=xlFormulas, lookat:=xlWhole, searchorder:=xlByRows, searchdirection:=xlNext, MatchCase:=False).Activate Columns(ActiveCell.Column).delete End Sub
Amit nem tudok hogy csináljak:
Hogyan oldjam meg, hogy a makróba ne közvetlenül kelljen beírni az olszlopnevet, hanem pl a sheet2-n lennének felsorolva /akár bővíthető listában/. Tehát a makro addig törölgetne adott oszlopokat a Sheet2-n megjelenő listában, míg talál ott nevet. Tehát maga a név helyett, egy változó lenne a makróban. Addig helyettesítgetné be a nevet egy ciklusban pl, míg talál törlendő oszlopnevet.
Remélem sikerül érthetőbben megfogalmaznom a dolgot :-D!!
Sub ColumsDelete() Dim oszlop As Integer Dim v As Variant Dim sz As String
oszlop = 1 Do While Cells(1, oszlop) <> "" sz = "Törli a(z) " & Cells(1, oszlop) & " című oszlopot?" v = MsgBox(sz, vbYesNo) If v = vbYes Then Columns(oszlop).Delete oszlop = oszlop - 1 End If oszlop = oszlop + 1 Loop End Sub
Én viszont szeretem kontrollálni, hogy mit is frissítek, no meg vannak olyan esetek (elég gyakran), hogy nem kell a fájlban lévő összes kimutatást egyszerre frissíteni, hanem csak azok egy csoportját.
Azt akarod megoldani, hogy a makró dobjon fel egy üzenetet, amiben egymás után felsorolja az oszlopok neveit, és a felhasználó mindegyiknél választhasson, hogy törli-e, vagy nem? Törli az x nevű oszlopot, IGEN, NEM formában?
Lehet elmúlt a reggeli kávé hatása, de én nem vélem érteni a megoldandó problémát.
De ez a name range már lapon lenne. Ezt itt nem értem biztos, hogy jól használod a name range kifejezést? Egy name range nem tud más lapon lenni, mert a name range nem más, mint egy excel tábla olyan része, aminek a könnyebb hivakozás miatt nevet adtunk.
Tegyük fel a Sheet1-en az A1 cellában van az első oszlopnév...ha nem üres, akkor helyettesítse be.
Mit helyettesítsen be? És hova? Hisz azt írod előtte, hogy nem üres (gondolom itt az A1 cellára gondoltál).
Leírom a szitut. Van egy adatbázis, ami nem mindig az első sorban kezdődik és 3 vagy több oszlopot ki kell belőle törölni.
Azt már szuperul megcsináltam, hogy kitörölje a nem kellő oszlopot.
Sub DeleteColumns() Cells.Find(what:="Time To Resolve (Discontd 3/08)", after:=[A1], LookIn:=xlFormulas, lookat:=xlWhole, searchorder:=xlByRows, searchdirection:=xlNext, MatchCase:=False).Activate Columns(ActiveCell.Column).delete End Sub
Viszont arra gondoltam, hogy jobb lenn, ha a felhasználó által látható felületen lenne a name range stb,ha esetleg változik az oszlop neve, vagy új jön hozzás.
De ez a name range már lapon lenne.
Azt kéne megoldanom, hogy amíg talál kitörölendő oszlopnevet addig helyettesítgesse be a fento macróba az oszlopnevet.
Jelenleg ezen gondolkozom ezt hogyan tudnám megoldani.
Tegyük fel a Sheet1-en az A1 cellában van az első oszlopnév...ha nem üres, akkor helyettesítse be. Aztán, ha lejebb megy és ott sem üres a cella, akkor azt is helyettesítse be...
Sub rangeteszt() Sheets("Sheet2").Activate range("torol").Select If ActiveCell.Offset(-1, 0) <> "" Then a = ActiveCell.Offset(-1, 0).Value Sheets("Sheet1").Activate Cells.Find(what:="a", after:=[A1], LookIn:=xlFormulas, lookat:=xlWhole, searchorder:=xlByRows, searchdirection:=xlNext, MatchCase:=False).Activate Columns(ActiveCell.Column).delete End Sub
Itt tartok, de persze ez nem nagyon működik meg még nincs is kész...de valami ilyen vonalon kén indulnom :-)...
Egy segédtábla kell hozzáa tól-ig dátumokkal. Ebből keres egy fkeres, aminek az utolsó argumentuma = 1 (IGAZ) (A segédtábla nem is annyira fontos, meg lehet oldani anélkül is) Ez az fkeres kell egy külön oszlopba és végighúzni a dátumok mellé. Erre rá egy pivottábla és azt már úgy húzod össze magadnak ahogy akarod.
Ahogy SQL mondja. Egyébként meg használd az "Összes Frissítése" funkciót :) (2007-ben az "Adatok" menüpont alatt van.) Makróban Application.RefreshAll - vagy valami ilyesmi.
Szerintem a frissüléstől független a kimutatás forrása. Más szóval, hiába ugyanaz a forrás, ha az egyiket frissíted, a másik nem fog frissülni magától.
Szóval a te esetedben: Columns(oszlop).delete a megoldás.
Javaslat: ne használd a Select-et, mert csak feleslegesen belassítja a kódodat, VBA-ban ritkán van szükség a Select utasításra, főleg akkor látni ha valaki makró rekorder-ből csinál kódot, mert ott a rekorder felvesz mindent akár kell akár nem.