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.
Elképzelni sem tudom mi a probléma nálad. Most újra teszteltem a képletet dátumokkal, normál számokkal, és működik. A dátumokat beírtam stringnek is, de akkor 0-t ad eredményül és nem #SZÁM! hibát. A képlettel mindenféle hibát (#érték!, #név!), elő tudtam idézni, de #szám!-ot azt nem. Tehát elképzelni sem tudom, hogy nálad mi okozhatta. Talán a dátumok számformátuma nem megfelelő. Próbáld ki a képletetet normál számokkal is, ha azokkal működik, akkor nagy valószínűséggel a dátumfomádat nem szereti. Ha nem, akkor valami excelbeállítási probléma lehet. Nálam a Lotus kompatibilitás szokott időnként nem várt eredményhez vezetni. Lehet hogy nálad is van valami extremítás. Ha nem boldogulsz, küldd el priviben, hagy nézzem meg én is.
És végül: Van egy olyan gyanúm, hogy valamit egészen másképp csinálsz mint kéne. Ezt abból gondolom, hogy ezt írod: "de valamennyi cellában #SZÁM! az érték, akár aktív, akár inaktív szó áll az F mezőben". Hol vannak ezek a valamennyicellák? Amikor összesen csak 1 cella értéke fűgg az F mezőbeli beírásoktól. A max képleté.
Akkor most egy pillanatra visszatérnék egy több mint 3 hete elhangzott megoldásogra, a tömbképletre. Djmorphy 22505-ös kérdésére az =Max(ha(F:F=äktiv";A:A)) képletet javasoltad megoldásnak tömbképletként beírva.
Érdekelt a dolog, kipróbáltam, és nekem semmiképp sem akar összejönni. A tömbképlet rendben megjelenik {=MAX(HA(F:F="aktív";A:A))}, de valamennyi cellában #SZÁM! az érték, akár aktív, akár inaktív szó áll az F mezőben. Az A oszlopban dátumok vannak 2013.01.01, 2013.01.02 stb. formában, az F oszopban aktív, vagy inaktív, ügyelve a hosszú 1-re.
Ha a függvényből a MAX() részt elhagyom, akkor is ugyanez az eredmény.
Vajon ez miért nem működött nálam. Akkor nem akartam rögtön megzavarni a dolog megoldását a kérdésemmel, de azért továbbra is érdekel.
Valamit azonban nem értek ennél az autoszűrőnél. A 255 karakternél hosszabb stringeket is illene szűrnie az 1-255 karakter alapján. De nem teszi. Miért? Úgy dereng az írányított szűrőnél nem volt ilyen probléma.
Benne van a VBA elején az Option utasítások között. Ugyanott van az Option Base is. Valamint a szöveghasonlító strcomp függvény magyarázata is hivatkozik rá.
Én sokkal izgalmasabbnak és újdonságnak találtam a magyar kettősbetűk ügyét.
Az autószűrőnek van korlátja. 255 karaktert képes szűrni. (excel 2007)
Ha ennél hosszabb szövegeket akarsz szűrni, használd a special (írányított) szűrőt. Annak is van korlátja, de lényegesen magasabb. Hogy mennyi, arra nem emlékszem, de sok, több mint ezer. Arra viszont emlékszem, hogy nekem még annak a korlátját is túl lépve kellett szűrnöm (excel 2003-mal). meg is oldottam. De József feltett ide a fórumra egy az enyéménél elegánsabb megoldást, ami szintén többezres stringeket volt képes szűrni. De megtalálni...... Talán ha olvassa, kedve lesz újra ismertetni. Ha nem és szűkséges lesz, megírhatom az én módszeremet.
Ja és elfelejtettem itt a táblázatba betenni az összetett magyar betűket, de kipróbáltam, és az opció alkalmazásával azokat is a magyar ABC szerint rendezi, ahogy ezt megírtad.
Megtaláltam a megoldást a VBA-ban. Ha a modul elején elhelyezzük az Option Compare Text utasítást, akkor az adott nyelvi beállításokat veszi figyelembe. Ki is próbáltam ezt, és az alábbi táblázatban szedtem össze az eredmények közti különbséget:
Option Compare Text
nélkül rendezve Option Compare Text használatával rendezve
Az Az
Er az
Iz Áz
Ok áz
Ut Er
az er
er Ér
iz ér
ok Iz
ut iz
Áz Íz
Ér íz
Íz Ok
Ók ok
Ön Ók
Út ók
Üt Ön
áz ön
ér Őn
íz őn
ók Ut
ön ut
út Út
üt út
Őn Üt
őn üt
Űt Űt
űt űt
Ez kicsit csúnyácska lett, de a lényeg látszik. Tehát az opció nélkül lefuttatva a nagybetűk előre kerültek, az á, é, í ó, ö, ú és ü utánuk, ezen belül is a nagy-, majd a kisbetűk, aztán az Ő és ő végül az ű és Ű. Az opció használatával csak a nagybetűk kerülnek a saját kisbetűs párjuk elé.
2002-es Excelben autószűrőt használok a mukalap oszlopaira. Az egyik oszlop celláiban (20 cella kb) elég sok szöveg van, van közte egyforma is és van különböző tartalmú is, kb 14 fajta van. A fönti szűrő gomb lenyílásakor azonban csak 6 szűrési lehetőség jelenik meg. Létezik, hogy van valami karakterbeli korlát? És emiatt nem listázza a többit?
Két makró szükséges hozzá. Az elsőt a Munka1 lapodhoz kell rendelned (ahogy az előzőnél).
Private Sub Worksheet_Change(ByVal Target As Range) Dim sorBeir As Integer, nev 'helyfoglalás a változókhoz If Target.Column = 2 Then 'ha a bevitel oszlopa a B, akkor nev = Target.Value 'a nev válztozó vegye fel a kiválasztott értéket sorBeir = Target.Row 'a sorBeir változó vegye fel a beírás sorának a számát Keres nev, sorBeir 'Meghívjuk a Keres makrót, átadva a nev és sorBeir változók aktuális értékét End If End Sub
A másodikat modulba tedd. VB szerkesztőben Insert | Module. A kapott üres lapra másold be:
Sub Keres(nev, sorBeir) Dim sor As Integer sor = Application.WorksheetFunction.Match(nev, Sheets("Adat").Columns(6), 0) 'Az Adat lap G oszlopában (6) meghatározza a nev változó sorát (a HOL.VAN függvény VBA-s megfelelője a Match) Sheets("Adat").Range("G" & sor).Copy Sheets("Munka1").Range("G" & sorBeir) 'másolás End Sub
Az első figyeli a Munka1 lapon történt változásokat. Mikor a B oszlopban kiválasztasz egy adatot az érvényesítésből, akkor a változás értékét (a megadott adatot), és a változtatás sorát átadja a modulba írt makrónak. Erre azért van szükség, mert az egyes lapokhoz rendelt makrók csk a saját lapjukon tudnak dolgozni.
SK! Megemelem elötted a kalapom. A munkafüzeten alkalmazott < reláció a magyar abc szerinti müködik, míg a vba-é az angol szerint. Amint az a berakott táblázaton is látható, csak a magyar kettős betüknél borult a reláció. Nagy meglátás volt! Elismerésem.
(A táblázat elég nagy, ha a fórummotor nem fogadná felteszem egy elérhető tárhelyre)
A függvényként való működtetésnél egyszerűen a tömb nevét adom át paraméterként:
Dim tömb(elemszám) ' vagy ReDim tömb(elemszám)
' tömb feltöltés
Call quicksort(tömb)
A stringgel kapcsolatos hiba okára nincs ötletem. Én is megnéztem, és nálam is jó volt a sorrend, de ellenőrzéskor hibásnak jelezte az Excel az általad megadott párokat.
Viszont, amikor kipróbáltam ezek rendezését, és találtam egy hibát a programban. Ugyanis az elmúlt évtizedekben eddig kizárólag számokkal használtam az algoritmust, így két változót hibásan numerikusnak (Double) deklaráltam Variant helyett. Az érintett sor helyesen: Dim aktelem As Variant, segédvált As Variant. De ezt Te nyilván korrigáltad, hiszen lefutott nálad a program a stringekkel.
Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim sor As Integer If Target.Column = 4 Then sor = Application.WorksheetFunction.Match(Target, Columns(8), 0) Cells(sor, 9).Copy Cells(Target.Row, 4) End If End Sub
Megpróbáltam, töröltem a Selection-t, beírtam a lapnevet, de nem történik semmi! A Munka1 fülön a G oszlopba kellene, hogy betegye a másolatot az Adat fül G oszlopából! Egyébként a Munka1 fül C oszlopában listázom ki az Adat fül F oszlop adatait, amiből választok!
Egy részletes magyarázatot tudnál adni a kód sorairól, hogy ha itt és itt változtatok, akkor mi történik, csak, hogy több helyen is tudjam ezt alkalmazni, és a jelenlegi funkciójára is rá tudjam bírni?
KöszönömDelila10a kódot! Működik bár nem teljesen úgy, ahogy szeretném mert a B oszlopba, ha üres mezőre kattintok, hogy kilistázza választási lehetőséget, hibát ír ki! Ezt ki lehet valahogy küszöbölni? Úgy működik az egész, hogy a B oszlopban kilistázza a tételt én kiválasztom az egyiket és a D sorban a hozzá rendelt ajánlat megjelenik. Jelenleg a hibánál, ha a stopra kattintok, majd újra a cellára, úgy már megjelenik az amire szükségem van! Még egy kérdés: Mivel ez a táblázat, amikről a képeket készítem csak szemléltetésnek van így a valós táblázatom nem teljesen így nézne ki! Meg lehet ezzel a kóddal (valamelyik sor/sorok módosításával) azt oldani, hogy a cellákat egy másik munkafüzet lapjáról másolja be?
Bocsánat, ez valószínűleg nem az Excel verziójától függ ilyenkor (főleg makróban), hanem a locale beállításaitól. Mi van, ha a vezérlőpultban full angolra állítasz minden nyelvi-területi beállítást?
Próbáld ki angol Excellel is. Az a vakmerő elképzelésem támadt, hogy esetleg a te verziód felismeri a mindegyik párban látható kétjegyű magyar mássalhangzókat, de valamiért az ábécé végére sorolja.
Úgy néz ki igazad van. Az 5000 tripletpárból 35-nél a bináris és a szöveges összehasonlítás valószinűleg eltérő eredményt ad. De most mennyivel vagyunk előbbre azzal, hogy ezt megállapítottuk? Gyakorlatilag semmivel. Mert ettől még teljesen érthetetlen, hogy ezeknél a textuális miért ad más eredményt mint a normális bináris? A többi meg a helyes relációt mutatja, mind textuálisan, mind binárisan.
Egyáltalán: mi az hogy bináris és mi az hogy szöveges összehasonlítás. A vbUse CompareOption-ról már nem is beszélve, mert azt meg nem is volt hajlandó végrehajtani.
A CSX-CTA triplet párt vizsgálva az derült ki, hogy a CS párosítás gázos. Ugyanis a CS nem csak a CT-nél nagyobb, de T utáni többi betűs párosításnál is (lásd az ábrát). És ilyen gázos stringpárból még 34 akadt, de a résztvevő karakterek gyakoriságából semmi féle tendencia nem rajzolódik ki.
A gázos tripletpárokat felraktam a data.hu-ra. Hátha valakinek mondanak valamit.