Keresés

Új hozzászólás Aktív témák

  • ny.janos

    tag

    válasz jerry311 #48728 üzenetére

    Egy gondolatébresztő a korábban felvetett Power Query megoldáshoz: Ha az összes csv fájlt beolvasod mintából és a fájloknak a nevében szerepel a dátum, akkor a fájlnév részének kinyerésével és dátummá alakításával lesz egy adathalmazod, melyben szerepel a Name, ID, Status adatok mellett a dátum is. Az ID és a dátum oszlop összevonásával készíthetsz egy új oszlopot. Ezután a státuszt meg tudod keresni a VLOOKUP-al a PQ által előállított adathalmazban, ha az ID cella és fejlécként szereplő dátum cella összevont adatára keresel.
    Ha az egyes csv fájlok nem tartalmaznak több 10e sort így a több, mint egymillió soros korlátot várhatóan nem léped túl, akkor nem is foglalkoznék havonta külön munkalappal, hanem az évet és a hónapot kiemelném egy-egy cellába a munkalap tetején, és annak felhasználásával képezném a fejlécben a dátumot. Így ha változtatod az évet és a hónapot, akkor mindig az aktuális értéket fogja dátumnak megfelelően kiolvasni a VLOOKUP a PQ által beolvasott csv fájlok összességéből.

  • Fire/SOUL/CD

    félisten

    válasz jerry311 #48728 üzenetére

    Az itt található adatokat vettem alapul. Létrehoztam belőle 3 db CSV fájlt, az első maradt érintetlen, a 2.-ban lecseréltem az összes DOWN státuszt UP-ra, a 3.-ban meg lecseréltem az összes UP-t FIRE-UP-ra, nyilván azért, hogy több státusz is legyen.

    A kód futtatásának ez lett az eredménye:

    A Module1-be másolandó kód (és fontos, hogy modul-ba kerüljön!)

    'Fire/SOUL/CD - 2022

    Public Sub Fire_CSV_Process()

    'mappa, amelyben a CSV fájlok találhatóak
    Const MYCSVFOLDER = "C:\CSVs\"
    'CSV elválasztó karakter megadása
    Const MYDELIMITER = ","
    'Ha igaz, akkor nem dolgozza fel a fejlécet
    Const CSVFILEUSEHEADER = True
    'A munkalap ezen cellájától illeszti be az összesítést
    Const TABLETOPLEFTCORNER = "A1"

    Dim MyWorksheetName As String
    Dim MyCurrCSVFname As String
    Dim MyFileNumber As Long
    Dim MyCurrStr As String
    Dim CSVLineNdx As Long
    Dim MyStrs() As String
    Dim MyRowNdx As Long
    Dim NameFieldStartRange, IDFieldStartRange As Range
    Dim FindNameFieldRange, FindIDFieldRange As Range
    Dim FindNameRange, FindIDRange As Range

    'ellenőrizzük, hogy a megadott mappa létezik-e, ha nem, akkor nem fut le a kód
    If Dir(MYCSVFOLDER, vbDirectory) = "" Then
    MsgBox "A megadott mappa [" & MYCSVFOLDER & "] nem létezik." & vbCrLf & "Adj meg egy létező mappát..."
    Exit Sub
    End If

    'létrehozunk egy új munkalapot (itt másodpercre pontos idő lesz a nevében,
    'ezért nem ellenőrzöm, hogy létezik-e már adott néven munkalap)
    MyWorksheetName = "Ősszesítés_" & Format(Now, "yymmdd_hhmmss")
    Worksheets.Add(After:=Worksheets(Worksheets.Count)).Name = MyWorksheetName
    Worksheets(MyWorksheetName).Activate

    Application.ScreenUpdating = False

    MyRowNdx = 0

    Set NameFieldStartRange = Range(TABLETOPLEFTCORNER)
    Set IDFieldStartRange = Range(TABLETOPLEFTCORNER).Offset(0, 1)

    'megadott mappában végigszaladunk az összes CSV fájlon
    MyCurrCSVFname = Dir(MYCSVFOLDER & "*.CSV")
    Do While Len(MyCurrCSVFname) > 0
    MyFileNumber = FreeFile
    Open MYCSVFOLDER & MyCurrCSVFname For Input As MyFileNumber
    CSVLineNdx = 0
    'CSV fájlt egyenként, soronként feldolgozzuk
    While Not EOF(MyFileNumber)
    Line Input #MyFileNumber, MyCurrStr
    If CSVFILEUSEHEADER = True And CSVLineNdx = 0 Then
    Line Input #MyFileNumber, MyCurrStr
    CSVLineNdx = 1
    End If
    'ha üres sor van benne, azt kihagyjuk
    If MyCurrStr <> "" Then
    'legeslső adat esetén nincs mit összehasonlítani
    If MyRowNdx = 0 Then
    MyStrs = Split(MyCurrStr, MYDELIMITER)
    Range(TABLETOPLEFTCORNER).Offset(0 + MyRowNdx, 0) = MyStrs(0)
    Range(TABLETOPLEFTCORNER).Offset(0 + MyRowNdx, 1) = MyStrs(1)
    Range(TABLETOPLEFTCORNER).Offset(0 + MyRowNdx, 2) = MyStrs(2)
    Else
    'meghatározzuk a keresési tartományokat
    MyStrs = Split(MyCurrStr, MYDELIMITER)
    Set FindNameFieldRange = Range(NameFieldStartRange.Address & ":" & Chr(NameFieldStartRange.Column + &H40) & MyRowNdx)
    Set FindIDFieldRange = Range(IDFieldStartRange.Address & ":" & Chr(IDFieldStartRange.Column + &H40) & MyRowNdx)

    'keresünk egyező adatokat
    Set FindNameRange = FindNameFieldRange.Find(what:=MyStrs(0), LookIn:=xlValues, lookat:=xlWhole)
    Set FindIDRange = FindIDFieldRange.Find(what:=MyStrs(1), LookIn:=xlValues, lookat:=xlWhole)

    'ha van egyezés, akkor a találati tartomány sorában megkeressük az első üres cellát
    'és beleírjuk a megfelelő adatot
    If Not FindNameRange Is Nothing And Not FindIDRange Is Nothing Then
    Cells(FindNameRange.Row, Columns.Count).End(xlToLeft).Offset(0, 1).Value = MyStrs(2)
    MyRowNdx = MyRowNdx - 1
    Else
    Range(TABLETOPLEFTCORNER).Offset(0 + MyRowNdx, 0) = MyStrs(0)
    Range(TABLETOPLEFTCORNER).Offset(0 + MyRowNdx, 1) = MyStrs(1)
    Range(TABLETOPLEFTCORNER).Offset(0 + MyRowNdx, 2) = MyStrs(2)
    End If
    End If
    MyRowNdx = MyRowNdx + 1
    End If
    Wend
    Close MyFileNumber

    MyCurrCSVFname = Dir()

    Loop

    Application.ScreenUpdating = True

    End Sub

    Teszteld, remélem jó lesz. ;]

    [ Módosította: radi8tor ]

Új hozzászólás Aktív témák

Hirdetés