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.
Kösz a gyors a választ mindkettőtöknek. Ezt az enableevents=false utasítást nem ismertem. Meglehetősen hézagosak ugyanis az ismereteim. De hát azért látogatok ide oly sűrün.
És még annyit, hogy úgy látom, hogy a makróid elejéről hiányzik az Option Explicit beállítás. Ha le van tiltva az Exceledben, jó lenne visszaállítani (sajnos a 2007 alatt nem tudom, hol van ennek a beállítása). Ez nem engedi meg, hogy változókat deklaráció nélkül használj, így a If Target.Column=AThen soron már a futás előtt hibát jelezne, mert nem deklaráltad az A nevű változót. Rendkívül hasznos eszköz ez az elütések ellen.
Mikor cserélsz egy karaktert, akkor hivatalból újra indul az eseményvezérelt makró – ezért kötötted eseményhez. :)
A leállításához a makró elején az Application.EnableEvents = False utasítás megállítja a további "beindulást", amit a végén vissza kell állítanod True értékre ahhoz, hogy a legközelebbi beírásnál is fusson.
Ami az újraindulást illeti, próbálkoztál az EnableEvents=false beállítással a szubrutinba belépéskor (persze kilpéskor meg visszaállítva true értékre)?
Nagyon tecc a makród. Elsősorban azért, mert sokkal egyszerűbben oldottad meg, mint én egy lényegileg hasonlót a 21973-ban. Gondoltam, követve a mintádat leegyszerűsítem a sajátomat. De jó sok időmbe került, míg üzemképessé tudtam tenni. Emiatt írom most ezt a hsz-t. Mert az egy dolog, hogy müködik, de nem értem. Nem értem, hogy a
1. makróm a lefutása után, miért indul el újra, látszólag ok nélkül? Hogyan kell az újraindulást megakadályozni?
2. az újra futást megakadályozó Instr feltétel nélkül a makró miért kerül egy pont 192 körös hurokba? Mert az még hagyján hogy hurokba kerül, de azt mi állítja le, és miért nem előbb vagy később? Az Instr feltétel nélkül ugyanis ez kerül a cellába: 11..............................................................................................................................................................................................2.2.33
3. És végül, a cella átírása után a target miért nem lép át a következő cellára?
Megköszönném, ha valaki meg tudná ezeket magyarázni.
És itt a makróm:
Csak emlékeztetőül : a feladat, hogy a beírt 123456 beírásból 12.34.56-t csináljon.
Private Sub Worksheet_Change(ByVal Target As Range)
Dim a$
If Target.Column <> 1 Then Exit Sub
If InStr(Target, ".") > 0 Then Exit Sub
a = Target.Value
a = Application.WorksheetFunction.Replace(a, 3, 0, ".")
a = Application.WorksheetFunction.Replace(a, 6, 0, ".")
Az első makrót, ami a beírásra jön működésbe, a lapodhoz kell rendelned, ahogy a csatolt képeden látszik, a másodikat, ami a már beírt számok formátumát alakítja át, modulba tedd, ehhez rendelhetsz gombot, vagy ikont.
Nézd meg, hogy a bővítménykezelőben be van-e kapcsolva a két Analyzis kezdetű bővítmény. Az első hatására kapsz egy csomó új függvényt, a második a makrók futtatásához szükséges, anélkül nem ért meg minden parancsot.
Nos lépésről lépésre végrehajtottam. Sajnos nem működik. 'A' oszlop, beírom pl. -> 3619999999, semmi változás. A cellák számformátuma általános, makróbarátként elmentve.
Csakhogy az ilyennek nem gombnyomásra kell indulnia, mert nem makróhívással indul. Hanem ha annak a munkafüzetnek a kódrészére helyezi (pl. Munka1 esetén a VBA képernyőn a Munka1-re kattintva az egér jobb gombjával, majd View Code után oda másolja - persze változatlan névvel és byval paraméterrel), nem pedig egy önálló modulba, akkor a program a Munka1 A oszlopában bármely cella kitöltése után automatikusan lefut.
Tuti, hogy a kódlapra másoltad, nem "sima" makrónak? Én még nem hallottam olyan, hogy event handler-hez gombot társítottak volna. De persze számos dologról nem hallottam még, amelyek ettől függetlenül mégis léteznek :-)
Köszönöm mindenkinek a segíséget. Sajnos nálam nem működik a VB kód. Nem tudom mit ronthattam el. Mindent úgy csináltam, ahogyan leírtad, még gombot is rendeltem hozzá. Az első sornál leáll hibára:
If Target.Column = 1 Then
A hibaüzi:
Run-time error '424':
Object required
Jó lenne valami tuti megoldás, mert sajnos napi rendszerességgel kell híváslistákat feldolgoznom, és az exportálás .csv -be történik.
Miveel az eredeti kódnak a 36 nem része, ezt írtam lejjebb. Ha csupa magyar szám van, akkor talán nem is kéne. Ha viszont következetesen mindegyiket 36-tal adjuk meg, akkor értelemszerűen módosulnak az intervallumok is. Én kihagynám mint redundanciát.
Ha például egy tömeges SMS-küldő szolgáltatást akarok használni, az általában 301234567 alakban várja a mobilszámokat.
Más célokra meg hozzá lehet tenni utólag, ha szükséges.
Nem állítom, hogy az a kód változtatás nélkül tökéletes, hiszen az Excel külön kezeli a telefonszám és a mobilszám formátumot, értelemszerűen igazgatni kell.
Rendeld a makrót ahhoz a laphoz, ahol az A oszlopba írod a telefonszámokat. Tudod, ha nem az A oszlop a számok helye, a piros 1 helyett írd a saját oszlopod számát.
Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column = 1 Then If Len(Target) = 11 Then Range(Target.Address).NumberFormat = """+""00 00 000-0000" If Len(Target) = 10 And Mid(Target, 3, 1) = "1" Then Range(Target.Address).NumberFormat = """+""00 0 000-0000" End If If Len(Target) = 10 And Mid(Target, 3, 1) <> "1" Then Range(Target.Address).NumberFormat = """+""00 00 000-000" End If End If End Sub
Ezután elég "+" és "-" jel, valamint szóköz nélkül beírnod a teljes számot (pl. 36203333333), és a megfelelő formátumra írja át.
Ha már van egy halom, 3613333333 formában beírt számod, érdemes lefuttatni a lenti makrót. Ebben az "A" helyett írd a saját oszlopod betűjelét. 2-vel kezdtem a ciklust, címsort feltételezve.
Sub telefon() Dim sor As Long, usor As Long usor = Range("A" & Rows.Count).End(xlUp).Row For sor = 2 To usor If Len(Range("A" & sor)) = 11 Then Range("A1").NumberFormat = """+""00 00 000-0000" If Len(Range("A" & sor)) = 10 And Mid(Range("A" & sor), 3, 1) = "1" Then Range("A" & sor).NumberFormat = """+""00 0 000-0000" End If If Len(Range("A" & sor)) = 10 And Mid(Range("A" & sor), 3, 1) <> "1" Then Range("A" & sor).NumberFormat = """+""00 00 000-000" End If Next End Sub
Ez így adja magát a HA függvény mintájára, növekvő tartományokkal: az első a legfeljebb 8 jegyű szám formázása, a pontosvessző után a következő intervallum, a másik pontosvessző után, ami annál is nagyobb, így lehet játszani.
A begépelésnél egyben kell beírni számként, pl. 201234567 vagy 36201234567.
# a számjegy, értelemszerűen.
A 36 vagy +36 a számok elé is írható konstansként, idézőjelben.