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.
Most olvastam egy megoldási lehetőséget, de az sem jött be. Aszerint a textboxot tegyem fókuszba, mielőtt beleírnék. Első két indítás jó volt, aztán ugyanúgy nem ment.
Memória problémák is lehetnek. De szerintem a formokat kezelő dll lehet a bűnös (64 bites Win10-nél MS Forms 2.0 Object Library (FM20.DLL).
Nézd meg légy szíves, hogy mindkét gépen ugyanaz a verzió van-e a formkezelőből.
A MS valamikor 2015-ben kicserélte a formkezelőt, mivel nem volt kompatibilis az újabb Excel verziókkal valami miatt. Most nem találom a hivatalosan kiadott javítási menetet sajnos. Erre a keresésre: the object is detached from its clients vba
Ezt eddig úgy oldottam meg, hogy megnyitáskor egy Start makró a fenti példának megfelelő With-tel végigment a lapokon, kitöltötte magát, majd megjelent.
Egy ideje időnként megnyitáskor szó nélkül bezáródott, még debugot sem engedett.
Akkor azt gondoltam, hogy szétszedtem a With Multipage részeit, és a lapokra tettem rá egyenként. Vagyis a Startban csak egy lapnak hagytam meg a kitöltését, a többi a lapra való kattintással aktíváltam....volna :-(
Ám itt időnként újra csak behalt. "A meghívott objektum levált az ügyfeleiről" és ezt a hibaüzenetet adta. A legkülönféle soroknál állt meg. Az egyik lapon a dátumnál, egy másiknál a felhasználónál, egy harmadiknál, ha a munkafüzetből kellett kiolvasni valamit. De van olyan lap, aminek a listboxa egy szűrést követően hiba nélkül kitöltődik.
A hibajelenség nem teljesen konzekvens. Egy megnyitásnál jó, majd egy következőnél nem. Illetve azt figyeltem meg, hogy ha megnyitom az Excelt teljesen, ÉS belépek a VBA felületére, rákattintok duplán a userformra, majd ezután futtatom, akkor minden jó. Próbáltam a load és a show lehetőségeket kombinálni, cserélni, de semmi. Már levettem teljesen a Before Close-t, hogy ne az legyen, hogy a bezárás kavar bele valamit, illetve változtatja meg a megnyitásra, de semmit sem találok.
Ami végképp őrület, hogy a saját laptompomon (Win10, Office2019, 32 bit) hiba nélkül fut, a cégesen (Win10, Office2016, 32 bit) produkálja a fenti hibát. A VBA References között mindkét gépen ugyanazok vannak pipálva. Egy korábbi "iktatóra" tettem plusz funkciókat, és január 1-jével terveztük beállítani. Az extra dolgok remekül működnek, ez a fránya megnyitás vacakol.
Megint egy áthidaló megoldás lett, de azért leírom, hátha valakinek jól jönne.
Szóval a Microsoft DTPickers az "Additionals controls"-ok között nem volt, és az ezt tartalmazó mscomct2.ocx fájlt nem lehetett telepíteni.
Így Textboxból, Spinbuttonból és egy CommandButtonból összeraktam egy ilyet (illetve az egész formra 10 db-ot).
A form indításakor Tb=CDate(Now)
A Spinbuttonra:
Private Sub SB_SpinUp() Tb.Text = Format(CDate(Tb.Text) + CDate(Tb.SmallChange), "yyyy/mm/dd.") End Sub
Private Sub SB_SpinDown() Tb.Text = Format(CDate(Tb.Text) - CDate(Tb.SmallChange), "yyyy/mm/dd.") End Sub
A MA gombra (ha vissza kellene egyszerűen lépni) szintén -> Tb=CDate(Now)
Érdekes volt, hogy ha a formátumot úgy adtam meg, hogy: "yyyy.mm.dd", akkor nem működött, viszont perjelekkel beírva a pontokkal rendelkező formátumot írja be, illetve kezeli.
Mivel jellemzően csak pár napot kell lépdelni, így nem hiányzik a teljesen lenyíló naptáras megjelenítés.
A céges gépeken eddig Office 2013, majd 2016 volt. Ezeken remekül működtek a korábbi években készített formok, amik többek között DTPickerseket is tartalmaztak.
Pár hete az egyik kolléga új gépet kapott, amin már Office 2019 volt, és az ezzel megnyitott korábbi formokon a DTPickerseket nem jeleníti meg, illetve eltávolította azokat, mert ezek után korábbi Office-szal megnyitás esetén már nincsenek ott azok az objektumok.
Nálam az itthoni gépen szintén 2019-es van, azon hiba nélkül működik.
Időpontok (túlórák) összegzésével birkózunk. Adott hónap/személy - majd szumma egész év. Ezt szumhatöbb függvénnyel összesítem.
Az világos, hogy ha 24 óránál többet szeretnék összegezni, akkor a "[ó]:pp" formátumot kell választani.
Így a cellákban jól összegzi az órákat.
A cél, hogy ezek után egy megnyitott form textboxa vegye át ezeket az összegzett óraszámokat, és csak jelenítse meg. Ám - annak ellenére, hogy a kiolvasott cellában jól jelenik meg az óra formátum - ide már csak a 24 órák feletti óraszámokat írja be.
Ha átírom a textbox1=Format(Sheets(1).range("N14"),"[h]:mm") formátumra akkor meg ezt jeleníti meg: ":12" :-O
Hogyan lehetne jól beolvasni a textboxba a cella tartalmát?
Erre azt javasolnám, hogy a MouseMove és az Enter eseményekben beállított szín legyen eltérő. MouseMove-ra pl. halványpiros, Enter-re erős piros. Amíg a user csak kaszál az egérrel, addig legfeljebb előrejelez egy kattintási szándékot, de ha belekattint a vezérlőbe, akkor úgyis életbe lép az ENTER esemény, és akkor a vezérlőbe megkapja a fókusz-színt.
Ez szabadon lévő checkboxnál remekül működik, de ha frame-ben van ÉS az utolsó objektum, akkor továbblépés esetén (vagyis, amikor kikerül a fókuszból) nem is megy bele az Exit eseménybe, és így az Enternél beállított backcolort megtartja.
Private Sub CheckBox1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) CheckBox1.BackColor = RGB(255, 0, 0) End Sub
Ez esetben viszont a háttérszín alaphelyzetbe állítása kicsit macerás, mivel lényegében minden control MouseMove eseményében el kell helyezni egy szubrutint, ami az összes control hátterét alapba állítja.
Private Sub CheckBox1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
Alaphelyzet CheckBox1.BackColor = RGB(255, 0, 0) End Sub