Keresés

Részletes keresés

Törölt nick Creative Commons License 2019.05.06 0 0 32749

Mit is szokás erre mondani? Amíg élünk, remélünk? :-)

Előzmény: zsófi_01 (32747)
pimre Creative Commons License 2019.05.06 0 0 32748

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

    utolsosor = ActiveSheet.Range("A" & Rows.Count).End(xlUp).Row

    kiirws.Range("A1:A" & utolsosor) = "" ' Az első oszlop adatainak törlése

    hely = "C:"

    sor = 0

    While filekival(hely, filenev)

        Set aktwb = Application.Workbooks.Open(filenev, Password:=jelszo)  ' Ez meg is nyitja

        hely = Left(filenev, Len(filenev) - Len(aktwb.Name))

        For mf = 1 To Sheets.Count

            Set aktws = aktwb.Sheets(mf)

            Set eredm = aktws.Cells.Find(what:=keresokif)

                 ' Ezekkel lehet még pontosítani a keresést: LookIn:=xlValues, lookat:=xlWhole, searchorder:=xlByRows, searchdirection:=xlNext, MatchCase:=True

            If Not eredm Is Nothing Then

                sor = sor + 1

                mfnev = aktwb.Name & " munkafüzet, "

                kiirws.Cells(sor, 1) = mfnev & aktws.Name & " munkalap: " & eredm.Row & ". sor " & eredm.Column & ". oszlop"

                mfnev = Space(Len(mfnev)) ' Hogy másodszorra már ne írja ki

            End If

        Next mf

        Application.DisplayAlerts = False

        aktwb.Close

        Application.DisplayAlerts = True

    Wend

End Sub

'****************************************************************************************

'                            File kiválasztás GetOpenFilename paranccsal

'****************************************************************************************

Function filekival(path As String, filenev As Variant) As Boolean

ChDrive Left(path, 1)

ChDir path

filekival = False

filenev = Application.GetOpenFilename(FileFilter:="Excel files, *.xls*", Title:="File bekérés")

If filenev <> False Then ' Azért kell variant változó, mert lehet a tartalma string, de lehet False is

    filekival = True

End If

End Function

Előzmény: Veeyyl (32746)
zsófi_01 Creative Commons License 2019.05.06 0 0 32747

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😅 

Előzmény: Törölt nick (32683)
Veeyyl Creative Commons License 2019.05.06 0 0 32746

Nem, nem erre készülök, tudom a jelszót a fájlokhoz!! , csak sok-sok fájl van sok-sok adattal, és neveket kell keresni bennük.

Már reggel óta próbálgatom a neten talált megoldásokat, de egyik sem oldja meg teljesen a problémát.

Előzmény: pimre (32743)
pimre Creative Commons License 2019.05.06 0 0 32745

Ezt tudom, olvastam.

 

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.

Előzmény: Sánta Kutya (SK) (32744)
Sánta Kutya (SK) Creative Commons License 2019.05.06 0 1 32744

"a jelszót természetesen tudom, és minden esetben ugyanaz a jelszó"

Előzmény: pimre (32743)
pimre Creative Commons License 2019.05.06 0 0 32743

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.

Előzmény: Veeyyl (32742)
Veeyyl Creative Commons License 2019.05.06 0 0 32742

Ez jó lett volna de nem működik :( (rendszergazdaként futtatom)

Előzmény: Törölt nick (32741)
Törölt nick Creative Commons License 2019.05.04 0 1 32741
Előzmény: Veeyyl (32734)
Sánta Kutya (SK) Creative Commons License 2019.05.03 0 0 32740

Akkor mégiscsak programozás lesz, vagy az illetékesek meggyőzése, hogy nekik a célt kellene meghatározniuk, és nem az eszközt.

Előzmény: Veeyyl (32739)
Veeyyl Creative Commons License 2019.05.03 0 0 32739

Ez a megoldás nem kezeli a jelszavas fájlokat (próbáltam).

Előzmény: arkilaszlo (32738)
arkilaszlo Creative Commons License 2019.05.03 0 0 32738

nagyon egyszerűen, a win saját fájlkezelőjével

 

 

 

 

 

Előzmény: Veeyyl (32734)
Veeyyl Creative Commons License 2019.05.03 0 0 32737

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)

Előzmény: James 42 (32735)
Eredő Vektor Creative Commons License 2019.05.03 0 0 32736

"Total Commender"-ben lehet fájlon belüli szövegre keresni.

Előzmény: Veeyyl (32734)
James 42 Creative Commons License 2019.05.03 0 0 32735

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.

Előzmény: Veeyyl (32734)
Veeyyl Creative Commons License 2019.05.03 0 0 32734

Sziasztok

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 !

Sánta Kutya (SK) Creative Commons License 2019.05.03 0 0 32733

Nehéz napja volt tegnap, és estére túl álmos volt, hogy beleássa magát egy ilyen feladatba, amire valaki már válaszolt. :-)

Előzmény: Törölt nick (32732)
Törölt nick Creative Commons License 2019.05.03 0 0 32732

Szerintem a tagdíjfizetés táblájához nem kellene hozzányúlni. Amit Te mondasz, az már egy riport, amit pivot táblával bármikor elő lehet állítani.

Egyáltalán, ez annyira tipikusan adatbázis feladat, fura, hogy SK még nem szólt érte :-)

Előzmény: pimre (32730)
Sánta Kutya (SK) Creative Commons License 2019.05.02 0 0 32731

zsófi_01

 

Jutottál valamire a segítségünkkel? Nagyon eltűntél.

Előzmény: zsófi_01 (32674)
pimre Creative Commons License 2019.05.02 0 0 32730

É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.

 

 

Előzmény: Klub19111 (32728)
Delila10 Creative Commons License 2019.05.02 0 0 32729
Előzmény: Klub19111 (32728)
Klub19111 Creative Commons License 2019.05.02 0 0 32728

Üdvözlet a fórumnak!

 

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.

 

https://data.hu/get/11808115/klub.xlsx

 

Előre is köszönök minden ötletet, hogyan lehetne megoldani.

pimre Creative Commons License 2019.04.29 0 1 32727

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.

 

És akkor íme a makró:

 

Option Explicit

Sub kombinacio()

Const csvSzámok = "3,5,9,12,13,15,32,44,87,92,100,101,111,145,151"

'Const csvSzámok = "A,B,C,D,E,F,G,H,I,J,K,L,M,N,O"

Dim arrSzámok() As String

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

                Call permutacio(arrSzámok(A), arrSzámok(B), arrSzámok(C), arrSzámok(D), sor)

'               Cells(sor, 1) = arrSzámok(A) & ", " & arrSzámok(B) & ", " & arrSzámok(C) & ", " & arrSzámok(D)

 '               sor = sor + 1

            Next

        Next

    Next

Next

End Sub

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.

        For k = 1 To 2

            Call csere(adat(3), adat(k + 2))

            oszlop = oszlop + 1

            Cells(sor, oszlop) = adat(1) & ", " & adat(2) & ", " & adat(3) & ", " & adat(4)

        Next k

        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 

    Next j

Next i

sor = sor + 1

End Function

Function csere(egyik As String, masik As String)

Dim atm As String

atm = egyik

egyik = masik

masik = atm

End Function

Előzmény: Sánta Kutya (SK) (32725)
havimiki Creative Commons License 2019.04.29 0 0 32726

Köszönöm, elkezdem próbálgatni :)

Sánta Kutya (SK) Creative Commons License 2019.04.29 0 1 32725

A kérdező variációkat mondott. Azokból több van, mert a sorrend is számít. Persze attól még gondolhatott kombinációra.

Előzmény: pimre (32723)
Törölt nick Creative Commons License 2019.04.29 0 0 32724

Kicsit általánosabb formában:

 

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

Előzmény: pimre (32723)
pimre Creative Commons License 2019.04.28 0 0 32723

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

utolsosor = ActiveSheet.Range("A" & Rows.Count).End(xlUp).Row

ActiveSheet.Range("A1:A" & utolsosor) = "" ' A oszlop adatainak törlése

sor = 1

For A = 1 To 15

    For B = A + 1 To 15

        For C = B + 1 To 15

            For D = C + 1 To 15

                Cells(sor, 1) = A & ", " & B & ", " & C & ", " & D

                sor = sor + 1

            Next

        Next

    Next

Next

End Sub

Előzmény: havimiki (32721)
pimre Creative Commons License 2019.04.28 0 0 32722

Szívesen, de ne nekem köszönd. A megoldás Deliláé, én csak abban segítettem, hogy miként alkalmazd.

Előzmény: attilalr (32720)
havimiki Creative Commons License 2019.04.28 0 0 32721

Sziasztok!

 

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.

 

Előre is köszönöm az ötleteket.

attilalr Creative Commons License 2019.04.28 0 0 32720

Zseniális, köszönöm szépen :)

Előzmény: pimre (32719)

Ha kedveled azért, ha nem azért nyomj egy lájkot a Fórumért!