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.
Na akkor küldök egy mintát, hogy milyen úton tudnál elindulni. Persze nem ismerem az adatállományaidat, ezért a programban kézzel kell meghívnod a fájlokat. Ezt nyilván több száz fájllal nem fogod megtenni. De ha majd kitalálsz egy eljárást, hogy milyen módon lehet majd programba írni a feldolgozandó fájlok listáját, ahhoz már könnyű lesz hozzáigazítani a programot.
Szóval nyiss egy új excel munkafüzetet, és a következőt másold be a VBA ablakba. A legelső sorban az x-ek helyére írd be a jelszavadat és a keresendő kifejezést.
A program kéri, hogy válaszd ki a fájlokat (később majd ezt automatizálhatjuk), megnyitja azokat, végignézi azok munkalapjait, és ahol talál egyezőt, úgy az
A oszlopba kiírja találatokat (munkalaponként csak az elsőt, de ezt is lehet módosítani).
Próbáld ki néhánnyal, aztán ha ez jó, akkor majd térjünk vissza az automatizálásra.
Const jelszo As String = "xxxx", keresokif As String = "XXXX"
Option Explicit
Sub beolvas()
Dim hely As String, aktwb As Workbook, aktws As Worksheet, kiirws As Worksheet, filenev As Variant, utolsosor As Long, mf As Long, sor As Long, _
eredm As Range, mfnev As String
Set kiirws = ThisWorkbook.Worksheets(1) ' Ide írjuk ki az eredményeket
Hát én nem is tudom mit mondjak.... nagyon szépen köszönöm, kb 2 órás melóval rendezve van minden..... na nem mintha érteném a függvényedet... de köszönöm😅
De szerintem a hivatkozott oldal ugyan azt állítja magáról, hogy jelszóval védett fájlokban keres szövegeket, majd ezután végig a jelszó megtalálás lehetőségéről ír.
Egyébként meg szerintem ez inkább egy lehúzós oldal, ami kecsegtet egy 30 napos fully-functional verzióval, csak az éppen nem érhető el. Az meg nem derül ki, hogy ténylegesen mit kap az érdeklődő az 50 ezres befizetés után. Nem hiszem el, hogy tényleg tud keresni a védett dokumentumokban.
Egyébként meg egyetértek veled, hogy ha az illetékesek meggyőzése nem megy, akkor programmal oldható meg a dolog. Persze ha a kérdező meg tudja adni a paramétereket, amelyek segítségével meg lehet találni a fájlokat.
Miért működne? Arra készült, hogy keresd meg a biztonsági lyukat a jelszavas védelemmel kapcsolatban. (It was designed to search and find security holes related to password protection.)
Szerintem nem létezik megoldás arra, hogy jelszóval védett Office fájlokat meg lehessen nyitni azok ismerete nélkül. Legfeljebb a nagyon rövid (3 karakter), vagy nagyon primitív (12345) jelszavak megtalálására van esély.
Igen erre én is gondoltam, de sajnos az adatokat többen is használják, és évek óta így készítik és használják. Ezen az adott terület illetékesei nem akarnak változtatni. Pl ha valakinek el kell küldeni az adott fájlt, akkor azzal meg vacakolni kell. Olyanok is használják akik nem értenek ezekhez a dolgokhoz. :( (pedig milyen egyszerű lenne)
Ha nekem kéne ezt megoldani, akkor nem vacakolnék programozással, hanem összeszedném ezeket a fájlokat egy helyre (bár nem feltétlenül egyetlen mappába), aztán mindegyikről levenném a jelszót, és gyártanék nekik egy jelszóval védett mappát például TrueCrypt-tel vagy BitLocker-rel (http://truecrypt.sourceforge.net/). Ha ezt a védett mappát megnyitjuk, akkor utána már lehet benne keresni a kulcsszavakra.
A véleményeteket szeretném kérni, hogy szerintetek ebben az esetben milyen irányba kellene elindulni a megoldással? Adott, viszonylag sok (több 100) excel fájl,több könyvtárban, ezekben kellene megkeresni egy-egy adott szót (vagy több szót: pl nevet). Egyesével megnyitogatni nem lenne túl hatékony :) Eredményként elég lenne a fájl neve, hogy ebben/ezekben megtalálható az adott szó. A probléma azzal "súlyosbodik", hogy a fájlok jelszavasak, a fájl is és a munkafüzet(ek) is. (a jelszót természetesen tudom, és minden esetben ugyanaz a jelszó). Mit javasolnátok ? Köszönöm előre is !
Én az egész adatszerkezetet javaslom átgondolni. A tagok listája rendben van, a büntetésekkel sem foglalkoznék, remélhetőleg ritka eset lesz. A többit másképp csinálnám:
1. A tagdíjfizetések esetén a hónapokat a fejlécbe tenném. Ezzel egy pillantással áttekinthető, hogy az adott hónapban ki fizetett és ki nem. Ha azért nem fizetett, mert nem volt programja az adott hónapban, azt esetleg egy beletett X jel jelezheti:
A terembeosztás az általad tervezett módon szerintem használhatatlan. Két részre bontanám. A foglalások listájában (így nevezem azt, amit "Termek" névvel jelöltél) a dátumokat egy oszlopba írnám, a klub neve mellé beírnám a szervező nevét. A napot képlettel írnám, pl.: =SZÖVEG(B2;"nnnn") (ahol B2 a dátum oszlop 2. sora). Ha a dátumban csak a hónap , ez azt jelenti, hogy a hónap minden megjelölt napját kéri. Ilyenkor a naphoz a képlet helyett azt lehetne írni, hogy "minden kedd":
Viszont ez szerintem egy nem áttekinthető táblázat. Ezért létrehoznék egy Terembeosztás nevű munkalapot, ahol termenként készítenék egy táblázatot. A táblázat sorai tartalmaznák a hónap napjait, az oszlopai pedig az igénybe vehető órákat. (8-22 órát írtam mintának). Amikor valaki bejelent egy foglalást, akkor az annak megfelelő idősávot cellaegyesítéssel összevonnám, beleírnám a klub nevét, és zárójelben a klub szervezőjének nevét (hiszen nem mindegy). És az összevont celláknak a kitöltőszínt (háttérszín) adnék, és ha van vele érintkező cella, akkor azok különböző színűek legyenek, hogy látható legyen a váltás határa:
Ezzel itt is egyetlen pillantással áttekinthető, hogy hol van szabad hely, így ha valaki jelentkezik, hogy szeretne programot, akkor azonnal megmondható, hogy az adott időpontban van-e szabad hely az adott teremben.
A kitöltés automatizálásával nem foglalkoztam, látom, arra Delila már adott mintát. A terembeosztási táblázatnál nem vagyok biztos, hogy megoldható az automatizálás, de úgy gondolom, hogy egy-egy új igény bejegyzése a táblázatba nem okoz akkora pluszmunkát, hogy érdemes lenne foglalkozni az automatizálással.
Komoly gondot jelent a klubnyilvántartásunk, mert sokan jönnek-mennek, és akik vannak, azok se minden hónapban jönnek. Pláne most kitalálták, hogy havonta kell terembeosztást csinálni, azzal is többet kell foglalkozni.
Feltöltöttem egy lebutított excel fájlt, csak a négy fontosabb táblázatot hagytam meg, az lenne a jó, ha valahogyan össze lehetne kapcsolni őket, hogy ne legyen névelírás és más gond.
Igazad van, a sorrendet is figyelembe vevő verzió az ismétléses variáció. Ebben figyelembe kell venni az egyes kiválasztott számcsoportok összes sorrendjét, azaz azok permutációját. Ezt megcsináltam, mégpedig úgy, hogy az eredeti 1365 sort meghagytam, és az egyes sorokba került tételek permutációját a mellette lévő oszlopokba írtam. Így a táblázatnak 1365 sora és 24 oszlopa van. Ettől ugyan nem lesz áttekinthetőbb, de talán mégis könnyebben kezelhető, mint egy 30000 soros táblázat.
Az alapot Jimmy képletére építettem, mert az tényleg általánosabb. Annyit változtattam, hogy a tömböt stringnek határoztam meg, hogy szükség esetén akár szövegkonstansok is állhassanak benne. Például ha lóversenyekre kell, ahol egyes helyeken előfordul, hogy 15 ló közül az első 4-re kell tippelni négyes befutóként.
A permutáló részlet nem lett túl elegáns. Például az egyes ciklusokban az első alkalommal van egy felesleges csere, amikor a ciklus első cseréjét saját magával hajtja végre a program, de nem találtam egyszerűbb megoldást. El tudnám képzelni, hogy egy szép rekurzív függvényt is lehetett volna írni belőle, de most erre nem volt időm és tehetségem.
Az adatokat számokon kívül a stringekkel is kipróbáltam, működik.
Function permutacio(A As String, B As String, C As String, D As String, sor As Long)
Dim adat(4) As String, oszlop As Long, i As Long, j As Long, k As Long
oszlop = 0
For i = 1 To 4 ' Minden fordulóban az induló sorrendre térünk vissza. A különbség az, hogy a csere során mindig a soron következő kerül az első helyre.
adat(1) = A
adat(2) = B
adat(3) = C
adat(4) = D
Call csere(adat(1), adat(i))
For j = 1 To 3
Call csere(adat(2), adat(j + 1)) ' a csere során a soron következő kerül a második helyre.
Call csere(adat(3), adat(k + 1)) ' Visszacseréljük az utolsó két elemet, ezzel visszaáll az adatoknak a j ciklusbeli - a k ciklusba lépés előtti - sorrendje
Sub kombinacio() Const csvSzámok = "3,5,9,12,13,15,32,44,87,92,100,101,111,145,151" Dim arrSzámok As Variant Dim A As Long, B As Long, C As Long, D As Long, iMax As Long, sor As Long, utolsosor As Long
arrSzámok = Split(csvSzámok, ",") iMax = UBound(arrSzámok) utolsosor = ActiveSheet.Range("A" & Rows.Count).End(xlUp).Row ActiveSheet.Range("A1:A" & utolsosor) = "" ' A oszlop adatainak törlése sor = 1 For A = 0 To iMax For B = A + 1 To iMax For C = B + 1 To iMax For D = C + 1 To iMax Cells(sor, 1) = arrSzámok(A) & ", " & arrSzámok(B) & ", " & arrSzámok(C) & ", " & arrSzámok(D) sor = sor + 1 Next Next Next Next End Sub
Amit kérsz, azt úgy nevezik, hogy ismétlés nélküli kombináció. Ilyen pl. a lottó, ahol 90 számból húznak ki ötöt. Az így létrehozható elemek száma: n!/(n-k)!*k!, ahol en az összes elemek száma, a k a kiválasztandó elemek száma.
A kiszámításra van képlet az Excelben: Kombinációk(n;k), a létrehozásra nincs. Viszont, ha az alábbi függvényt bemásolod a VBA képernyőn, akkor létrehozza az esetben lehetséges 1365 elemet. Az eredménysorokban az elemeket vesszővel választottam el egymástól az áttekinthetőség kedvéért.
Sub kombinacio()
Dim A As Long, B As Long, C As Long, D As Long, sor As Long, utolsosor As Long
Az lenne a kérdésem, hogy excelben lehet e szám sorozatokat/variációkat előállítani. Azt szeretném hogy 15 számból generálja le a létező összes 4 számból álló sorozatot (pl.: 1,2,3,4 1,2,3,5 stb) ismétlődés nélkül.