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.
Ha ugyanabból az adatforrásból készítesz két v. több pivot táblát, akkor az excel 2007 automatikusan ua-t az adat-gyorsítótárat (data cache) használja, hogy csökkentse a memória használatot és a fájl méretet. Ha szertnél két pivotot csinálni amelyek függetlenek egymástól, módosítsd a tartományt, pl. hagyd ki a D oszlopot, hiszen úgysem használod ezt a mezőt (arány), mert készítesz egy számított mezőt és azt teszed be a pivot tábládba. Ez után már a két tábla független egymástól és tudod másként csoportosítani (persze a számított mezőt ismét létre kell hoznod)
én nem foglalkoznék a kimutatás heti/havi bontásával, hanem annak adathátterébe beraknék egy WEEKNUMBER(), meg egy HÓNAP() függvényt plusz oszlopként (Ami a dátumaidból kiyneri a hetet meg a hónapot). Aztán idővel szükség lehet az ÉV()-re is.
Próbálkoztam, és azt tapasztalatam, hogy az EOF akkor is False eredményt ad, ha a fájl utolsó bájtját is beolvastam már, és utána a Get még tud olvasni egy 0-t. Nekem ezt teszi a 2-es fájl végére. Fogalmam sincs, miért. Passzolom a kérdést.
Sub olvas() Const ForReading = 1, ForWriting = 2, ForAppending = 3 Const TristateUseDefault = -2, TristateTrue = -1, TristateFalse = 0 Dim fs, f, ts, s Set fs = CreateObject("Scripting.FileSystemObject") fs.OpenTextFile "d:moricka1.txt" 'Ellenőrzi egy file létezését Set f = fs.GetFile("d:moricka2.txt") 'Olvas egy másik filét Set ts = f.OpenAsTextStream(ForReading, TristateUseDefault) For i = 1 To 1000 s = ts.ReadLine MsgBox s Next i ts.Close End Sub
Kérdéseim a professzor urakhoz:
1. Hogyan lehet " On Error"-ral vagy valami mással lekezelni, ha nem létezik a file és a filevéget?
2. Miért térhet el az fs.OpenTextFile sorban és a Set f= fs.Getfile sorban a filenév?
Gyakorlatilag leellenőrzöm az első létezését és olvasgatom a másodikat.
3. Hogyan tudnék bináris filet is végigolvasgatni?
A file létezés ellenőrzését megtaláltam: If (fs.FileExists("móricka.txt")) Then ......
Folyamatos olvasást megtaláltam: s = ts.Read(1000) beolvassa (a következő) 1000 karaktert.
If Dir("C:mappaalmappaakármi.txt", vbNormal) = "" Then MsgBox "Not exist." End If
A másik lehetőség, FileSystemObject használatával:
Set fs = CreateObject("Scripting.FileSystemObject") If Not fs.fileexists("C:mappaalmappaakármi.txt") Then MsgBox "Not exist." End If
2. A FileSystemObject egy összetett objektum, nem egy fájlra vonatkozik. Inkább egy interfész a fájlrendszer elérésére. Ugyanazon FileSystemObject-en keresztül akárhány fájlt megnyithatsz. Másrészt, az OpenTextFile és a GetFile két különböző dolog. A GetFile egy fájl típusú változóhoz rendel hozzá egy konkrét fájlt, és akkor arra a fájlra ezen a változón keresztül tudsz hivatkozni, és vele (rajta) műveleteket végezni. Az OpenTextFile pedig megnyit egy szövegfájlt, vagy ha nincs, akkor létrehozza azt. Ez tehát nem a fájl meglétének ellenőrzése. Igazából az OpenTextFile-t úgy tudnád használni, ha TextStream típusú változóhoz rendelnéd a megnyitott fájlt, másképp nem tudom, hogyan hivatkoznál rá:
Dim ts As TextStream
Set ts = fs.OpenTextFile("d:moricka1.txt")
3. A FileSystemObject-ben nincs meg a lehetőséged bináris fájlolvasásra. Másképp kell megoldani:
Dim FNumber As Long, NextValue As Byte FNumber = FreeFile Open "C:mappaalmappaakármi.dat" For Binary Access Read As FNumber WhileNotEOF(FNumber) Get FNumber, , NextValue Debug.Print NextValue Wend Close FNumber
Ha a NextValue változót Byte helyett Integer-ként deklarálod, akkor kétbájtonként olvassa a fájlt, ha Long-ként, akkor négyesével, stb.