Hirdetés

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

  • Fferi50

    Topikgazda

    válasz Misi_D #45226 üzenetére

    Szia!
    Egy lehetőség, logikai szinten leírva:
    Az első előfordulást beteszed a munkalap következő sorába. A következő előfordulásnál megkeresed, hol van a munkalapon, megnézed a másik változó értéke milyen, ha nagyobb, akkor kicseréled a sort az újra, ha nem, akkor hagyod békében.
    Ezt csinálod végig a fájlon.
    Előny, hogy akkor is használható, ha a csv fájlban nem sorban vannak az ID-k.
    A munkalapon kereshetsz a Range.Find metódussal vagy kereső függvényekkel egyaránt.
    A beolvasásnál a kinput változóban a teljes sor kerül. Ebből neked kell meghatározni, hol az id és a számodra szükséges változó adata. Ha tudod, hogy hanyadik oszlopban van, akkor pl. használhatod a Split függvényt, amelyik a megadott határoló (pl. pontosvessző - ; - ) szerint egy tömbbe transzformálja a szöveget. A tömb indexe 0-val indul. Innen már meg tudod kapni a keresett adatokat.
    Egy példa:
    Sub beolvaso()
    Dim utja As String, fnev As String, kinput As String, fc As Byte, cl As Range, bejott, holvan As Range
    utja = "C:\Users\user\Documents"
    fnev = "\xxx.csv"
    fc = FreeFile()
    Open utja & fnev For Input As #fc
    Set cl = ActiveSheet.Cells(1, 1) 'az aktív munkalap első cellájába kerül az első adat
    'ha nem ide szeretnéd, akkor változtasd meg a Cells paramétereit
    Do While Not EOF(fc)
    Line Input #fc, kinput
    bejott = Split(kinput, ";") 'egy tömbbe transzformáljuk a bejött adatot
    'megkeressük az azonosítót az első oszlopban. Ha nem ide tetted, akkor írd át az oszlop számát
    'ha nem az input első adata az ID akkor bejott(0) paraméterét írd át a megfelelő oszlopra
    Set holvan = ActiveSheet.Columns(1).Find(what:=bejott(0), LookIn:=xlValues, lookat:=xlWhole)
    If holvan Is Nothing Then  'ha még nincs, akkor bejegyezzük az első szabad sorba
       'cl.Value = kinput 'ez a sor egy cellába tenné a teljes inputot
       Range(cl, cl.Offset(0, UBound(bejott))).Value = bejott ' így viszont külön cellába kerülnek az értékek
       Set cl = cl.Offset(1, 0) 'ez lesz a következő üres sor első cellája
    Else
       If holvan.Offset(0, 2).Value < bejott(2) Then 'ha a változó nem a második az adatok között, akkor
       'mindkét 2-est írd át megfelelőre - az offset és a tömb paramétere is 0-tól indul.
          Range(holvan, holvan.Offset(0, UBound(bejott))).Value = bejott 'kicseréljük az újra
       End If
    'MsgBox kinput
    End If
    Loop
    Close #fc
    MsgBox "Az input kész!"
    End Sub

    Remélem, sikerül.
    Üdv.

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