Excel .csv keresési találat sorának meghatározása
2010-11-19T22:06:21+01:00
2010-11-20T09:18:34+01:00
2022-08-03T04:05:34+02:00
Niko
Sziasztok!

VBA-ban szeretném megcsinálni, hogy egy .CSV file-ban adatot keresek InStr-el. minden szép, de nekem az is kellene, hogy az adatot (iktatószám, tehát csak 1 lehet belóle) melyik sorban találta meg.

Mellékelem a kódot. A STOP-nál nem áll meg, pedig az vinné ki a ciklusból... viszont a megtalált adatokat szépen beírja a cellákba a helyükre...
Tudtok segíteni egy kicsit, hogy mi a baja?

Azért muszáj a cellába való beírás után még egy egyenlőséggel rábiztosítani, mert InStr-t használok.


sordb = 0
Open "e:\texto\visszakérés\DT_k_függö.csv" For Input As #1

Do Until EOF(1)

Input #1, sor$
sordb = sordb + 1

If InStr(sor$, keresettadat$) > 0 Then

cellak = Split(sor$, ";")
For oszlop = 0 To UBound(cellak)
Sheets("Lezárás").Cells(33, oszlop + 1) = cellak(oszlop)
a = a + 1
Next
If keresettadat$ = Sheets("Lezárás").Cells(33, 2) Then Sheets("Lezárás").Cells(34, 1) = sordb: Exit Do: Close #1: Stop
End If
Loop

Reset
Mutasd a teljes hozzászólást!
Köszi a kiegészítést én ilyen szépen nem tudtam volna megfogalmazni

Egyébként
Az "Option explicit" arra való, hogy a program ne is akarjon elindulni (és nem leáll annál a sornál),


Én is így értettem, csak nem úgy írtam.
Természetesen a fordításkor áll le annál a sornál....
Mutasd a teljes hozzászólást!

  • Gondolom ha teljesült a feltétel, beírta amit akart és utána Exit Do van, akkor szépen kilép a ciklusból és nem megy tovább a Stop-pig.

    Minek a Stop? Debuggolod? Az első IF-nek a hol a lezárása? Option Explicit nincs bekapcsolva? (már javasoltam múltkor)


    Mutasd a teljes hozzászólást!
  • Szia!

    Megvan a hiba ... ne tudd meg ...

    Mivel CSV-t olvasok be és az iktatószám (pl 00050) előfordulhat máshol is a sorban, ezért úgy biztosítottam a tuti találatot, hogy így kerestettem a CSV-ben: ;00050; Hát a cellákba írt találattal persze, hogy nem egyezett meg ...

    VBA-ban nagyon gyenge vagyok, mint látod. Ez az Option Explicit mit segít elő?

    Köszönöm ez eddigieket is !!!
    Mutasd a teljes hozzászólást!
  • A kérdésedre is válaszolva: a STOP-ot csak azért tettem be, hogy lássam hol megy ki a ciklusból.
    Mutasd a teljes hozzászólást!
  • A module legelején írd be, az legyen az első sor.
    Option Explicit

    Vagy pedig a Tools/Options/Require Variable Declaration melett bepipálod. Akkor ez minden újonan létrehozott modulban beírja automatikusan.


    A változók deklarációját teszed vele kötelezővé.
    Dim kulcsszó megadása kell (Dim Változónév As Típus)

    Ha nincs deklarálva változó, akkor leáll annál a sornál.
    Elősegíti, hogy átlátható legyen a programod, ha véletlenül elírsz egy változónevet azt megtalálja...

    Most te magad oldottad meg a problémádat, tied a 0 pont
    Mutasd a teljes hozzászólást!
  • Akkor pontosítsunk pár dolgot az Otion explicit-el kapcsolatban.

    Az "Option explicit" arra való, hogy a program ne is akarjon elindulni (és nem leáll annál a sornál), amíg a használt változóidat nem definiáltad. Ha megpróbálod a kódot futtani, akkor egyenként megmutatja, hogy melyik változó nincs definiálva.
    Ami ugye ezért szerencsés, mert a
    EgyikVáltozó=1
    másikváltozó=1
    msgbox EygikVáltozó+MásikVálozó
    kódban nem kell "órákat" keresned, hogy miért 0 az eredmény.

    Hasonlóan segíthet az is, ha a definiáláskor a változó nevében írsz nagy és kisbetűt is, amikor meg a kódba gépeled, akkor csak kicsivel írod.

    dim EgySzepValtozo
    x=EgySzepValtozo

    A vastagított betüket a VBE írja át nagyra, így amikor ellépsz a sorról máris tudod, hogy jól írtad-e. (És az Option explicit-re már nincs is feltétlenül szükség, bár célszerű a használata)

    -----
    Dim kulcsszó megadása kell

    Ez úgy önmagában nagyon részigazság.
    Ha a változókat definiálni akarod (akár mert beállítottad, hogy kötelező, akár csak mert miért ne ), akkor a lehetőségek:

    Modul lap elején (az első eljárás elött) lehet
    Public, Global, Dim, Private
    Az eljárásokon belül
    Dim és Static

    És nem kell a tipus definiálása se, bár célszerű

    ---

    A sor$ forma helyett inkább
    dim strSor as string
    formát használd és szokd meg, mert kevesebb gondod lesz a beidegződésekkel, ha esetleg továbblépsz a programozásban.
    (És a kollégádnak se kell emlékezni a &#!% jelentésére.
    ---
    For oszlop = 0 To UBound(cellak)
    Sheets("Lezárás").Cells(33, oszlop + 1) = cellak(oszlop)
    a = a + 1
    next
    helyett inkább:
    sheets("lezaras").Range(Cells(33, 1), Cells(33, UBound(cellak) + 1)) = cellak
    a=a+UBound(cellak) ' Bár nem tudom minek az "a".
    A ciklus elég lassú megoldás a VBA -ban.
    Ha meg tudod (egy csv-nél általában igen), hogy hány oszlop, akkor:
    sheets("lezaras").Range("A33:X33") = cellak
    forma

    ----
    Azért muszáj a cellába való beírás után még egy egyenlőséggel rábiztosítani, mert InStr-t használok

    Ha nem kell az az adat, akkor inkább a split után a beírás elött csinálj egy if-et cellak(2)=keresettadat$-ra, és ha kell csak akkor írd bele.

    Mutasd a teljes hozzászólást!
  • Köszi a kiegészítést én ilyen szépen nem tudtam volna megfogalmazni

    Egyébként
    Az "Option explicit" arra való, hogy a program ne is akarjon elindulni (és nem leáll annál a sornál),


    Én is így értettem, csak nem úgy írtam.
    Természetesen a fordításkor áll le annál a sornál....
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd