Avatar billede pejsen Nybegynder
23. september 2008 - 19:47 Der er 12 kommentarer og
1 løsning

Blanke data udlæses i tCSV-fil (Kabaks kode)

Hej
Kabak har lavet denne fortrinelig kode ,men jeg har et problem

Public Sub Hent_FletOgGem()
    Dim Ordre() As Variant, Ordrelinje() As Variant, Import() As Variant, X As Long, I As Long, Sti As String
  Dim OK As Boolean
    X = 0
    Sti = "H:\Skrivebord\Temp\OK\"
    Open Sti & "Ordre.csv" For Input As #1
    Do
        Line Input #1, linje
        ReDim Preserve Ordre(X)
        Ordre(X) = Split(Replace(linje, Chr(34), ""), ";")
'        Ordre(X) = Split(linje, ";")
        X = X + 1
    Loop Until EOF(1)
    Close #1

    X = 0
    Open Sti & "Ordrelinje.csv" For Input As #1
    Do
        Line Input #1, linje
        ReDim Preserve Ordrelinje(X)
        Ordrelinje(X) = Split(Replace(linje, Chr(34), ""), ";")
        X = X + 1
    Loop Until EOF(1)
    Close #1

    ReDim Import(UBound(Ordrelinje), 7)  ' klargør gemmevariabel

    For I = 1 To UBound(Ordrelinje, 1)
    OK = False
        For X = 1 To UBound(Ordre, 1)

    If (Ordrelinje(I)(2)) = "" Then Exit For ' hvis tom rykkes til næste Ordrelinje

            If Ordre(X)(0) = Ordrelinje(I)(0) Then
              Import(I, 0) = Ordre(X)(0)    ' A
                Import(I, 1) = Ordre(X)(1)    ' B
                Import(I, 2) = Ordre(X)(5)    ' F
                Import(I, 3) = Format(Ordre(X)(16), DD - MM - YYYY)  ' Q
                Import(I, 4) = Ordrelinje(I)(2)  ' C
                Import(I, 5) = Ordrelinje(I)(3)    ' D
                Import(I, 6) = Ordrelinje(I)(4)    ' E
              OK = True
                Exit For

          End If

Next
'        If Not OK Then Import(I, 0) = "No Match"

    Next

    Open Sti & "Import.txt" For Output As #1
    For I = 1 To UBound(Import, 1)
        For X = 0 To UBound(Import, 2)
            If X <> UBound(Import, 2) Then
                Print #1, """"; Import(I, X); """"; ";";
            Else
                Print #1, Import(I, X)
            End If
        Next
    Next

    Close #1
    Msgbox "kørsel udført"
End Sub

Men der et problem i nedenstående linje
idet at når if linjen udlæser "Exit for" så skriver den til output-filen, godt nok uden data men der kommer en linje med 7 semikoloner

"965";"683";"Roblon A/S ";"39734";"2";"
"";"";"";"";"";"";"";
"";"";"";"";"";"";"";

Hvordan udgår jeg at den skriver den linje, som den skal springe over, til outputfilen?

Pejsen

If (Ordrelinje(I)(2)) = "" Then Exit For ' hvis tom rykkes til næste Ordrelinje

            If Ordre(X)(0) = Ordrelinje(I)(0) Then
              Import(I, 0) = Ordre(X)(0)    ' A
                Import(I, 1) = Ordre(X)(1)    ' B
                Import(I, 2) = Ordre(X)(5)    ' F
                Import(I, 3) = Format(Ordre(X)(16), DD - MM - YYYY)  ' Q
                Import(I, 4) = Ordrelinje(I)(2)  ' C
                Import(I, 5) = Ordrelinje(I)(3)    ' D
                Import(I, 6) = Ordrelinje(I)(4)    ' E
              OK = True
                Exit For
Avatar billede kabbak Professor
23. september 2008 - 22:01 #1
prøv igen med

  If IsEmpty((Ordrelinje(I)(2))) Then Exit For ' hvis tom rykkes til næste Ordrelinje
Avatar billede pejsen Nybegynder
23. september 2008 - 22:18 #2
Nej.. så udløser den ikke " Then Exit For"

Debuggen viser følgende '(Ordrelinje(I)(2)="" ', men springer ned til
If Ordre(X)(0) = Ordrelinje(I)(0) Then
Avatar billede kabbak Professor
23. september 2008 - 22:21 #3
Min fejl, den skal fanges i skrivningen

Open Sti & "Import.txt" For Output As #1
    For I = 1 To UBound(Import, 1)
        For X = 0 To UBound(Import, 2)

If IsEmpty(Import(I)(4)) Then Exit For

            If X <> UBound(Import, 2) Then
                Print #1, """"; Import(I, X); """"; ";";
            Else
                Print #1, Import(I, X)
            End If
        Next
    Next

    Close #1
Avatar billede pejsen Nybegynder
23. september 2008 - 22:21 #4
Så du mit kommentar i tidligere spørgsmål.

http://www.eksperten.dk/spm/846334
Avatar billede kabbak Professor
23. september 2008 - 22:22 #5
du kan fjerne den anden

  If (Ordrelinje(I)(2)) = "" Then Exit For ' hvis tom rykkes til næste Ordrelinje
Avatar billede pejsen Nybegynder
23. september 2008 - 22:27 #6
skal
If IsEmpty((Ordrelinje(I)(2))) Then Exit For ' hvis tom rykkes til næste Ordrelinje
stadigvæk indsættes

den kommer med fejl "Subscript out of range" på 'If IsEmpty(Import(I)(4)) Then Exit For'
Avatar billede kabbak Professor
23. september 2008 - 22:34 #7
det var vanen fra de andre variabler

If IsEmpty(Import(I,4)) Then Exit For
Avatar billede pejsen Nybegynder
23. september 2008 - 22:34 #8
den ignorere ""

Skal jeg sende filerne til dig???
Avatar billede kabbak Professor
23. september 2008 - 22:35 #9
kabbak snabela tiscali dot dk
Avatar billede kabbak Professor
23. september 2008 - 23:41 #10
prøv

Public Sub Hent_FletOgGem()
    Dim Ordre() As Variant, Ordrelinje() As Variant, Import() As Variant, X As Long, I As Long, Sti As String
    Dim J As Integer, oldOrdreNR As Long
    X = 0

    Sti = "H:\Skrivebord\Temp\OK\"
    Open Sti & "Ordre.csv" For Input As #1
    Do
        Line Input #1, linje
        ReDim Preserve Ordre(X)
        Ordre(X) = Split(Replace(linje, Chr(34), ""), ";")
        X = X + 1
    Loop Until EOF(1)
    Close #1

    X = 0
    Open Sti & "Ordrelinje.csv" For Input As #1
    Do
        Line Input #1, linje
        ReDim Preserve Ordrelinje(X)
        Ordrelinje(X) = Split(Replace(linje, Chr(34), ""), ";")
        X = X + 1
    Loop Until EOF(1)
    Close #1

    ReDim Import(UBound(Ordrelinje), 7)  ' klargør gemmevariabel

    oldOrdreNR = 1

    For I = 1 To UBound(Ordrelinje, 1)
        For X = 1 To UBound(Ordre, 1)
            If Ordre(X)(0) = Ordrelinje(I)(0) Then
                If Val(Trim(Ordre(X)(1))) = oldOrdreNR Then
                    J = J + 1
                Else
                    J = 1
                End If

                oldOrdreNR = Val(Trim(Ordre(X)(1)))
                Import(I, 0) = Ordre(X)(0)    ' A
                Import(I, 1) = Ordre(X)(1) & "-" & J  ' B
                Import(I, 2) = Ordre(X)(5)    ' F
                Import(I, 3) = Format(Ordre(X)(16), "DD-MM-YYYY", vbMonday, vbFirstFourDays)    ' Q
                Import(I, 4) = Ordrelinje(I)(2)  ' C
                Import(I, 5) = Ordrelinje(I)(3)    ' D
                Import(I, 6) = Ordrelinje(I)(4)    ' E
                Exit For
            End If
        Next
    Next

    Open Sti & "Import.txt" For Output As #1
    For I = 1 To UBound(Import, 1)
        For X = 0 To UBound(Import, 2)
            If IsEmpty(Import(I, 2)) Then Exit For
            If X <> UBound(Import, 2) Then
                Print #1, """"; Import(I, X); """"; ";";
            Else
                Print #1, Import(I, X)
            End If
        Next
    Next

    Close #1
    Msgbox "Kørsel udført", , "Flet CSV-filer"
End Sub
Avatar billede pejsen Nybegynder
24. september 2008 - 00:12 #11
Har rettet følgende, så nu virker det

For X = 0 To UBound(Import, 2)
            If IsEmpty(Import(I, 2)) Then Exit For
            If X <> UBound(Import, 2) Then

til

For X = 0 To UBound(Import, 2)
            If (Import(I, 4)) = "" Then Exit For
            If X <> UBound(Import, 2) Then
Avatar billede kabbak Professor
24. september 2008 - 08:06 #12
godt,jeg havde set at det skulle være
IsEmpty(Import(I, 4)), men havde glemt at rette

Er datoer i orden, og tallene i kolonne B, var det sådan det skulle være.
Avatar billede pejsen Nybegynder
24. september 2008 - 17:29 #13
Ja, det ser rigtigt fint ud.. :-)

Forstår bare ikke at linie
  If IsEmpty(Import(I, 4)) Then Exit For
ikke slår ud på ""

Tusinde tak for hjælpen
Får måske brug for hjælp til dato afgrænsning af data til output filen, fra
Ordre(X)(9)> NOW()  (kolonne J)

Pejsen
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester