Avatar billede pejsen Nybegynder
22. september 2008 - 17:05 Der er 49 kommentarer og
1 løsning

Genere 1 CSV fil udfra 2 excel filer (VBA)

Hej

Jeg har 2 excel -filer med data i x-antal kolonner.
Ordre.csv (Indeholder kolonner A:AN)
Ordrelinje.csv (Indeholder kolonner A:AN)

Mit ønske er at lave noget automatic i VBA, som henter disse 2 filer og kovertere dem til 1 CSV-fil(adskillelsestegn komma) i format .txt

De er altid navngivet med samme navn hhv. Ordre.csv og Ordrelinje.csv.

Jeg har brug for følgende kolonner i ny fil kaldt Import.txt:
Fra Ordre.csv: A, B, F, Q
Fra Ordrelinje.csv: A,C,D,E

Kolonne A er et fælles ID
Kolonne Q skal være i format DD-MM-YYYY

Der er kolonne-overskrifter i de 2 CSV-filer, men Import.txt skal ikke indholde kolonne-overskrifter.

Ordre.csv og Ordrelinje.csv bliver altid ekporteret ud fast til en fast mappe.

Prodceduren skal gøres flere gange om dagen.
Det er ikke mig selv, som håndtere den arbejdsgang, så derfor skal funktion være nem.

Er det muligt??

Spørgsmålet er også oprettet i kategorien: Regneark: Excel.


Pejsen
Avatar billede pejsen Nybegynder
22. september 2008 - 17:55 #1
Rettelse:

Ordrelinje.csv (Indeholder kolonner A:AN) -> Ordrelinje.csv (Indeholder kolonner A:L)

Prodceduren -> Proceduren
Avatar billede kabbak Professor
22. september 2008 - 18:23 #2
noget i denne stil, ikke testet


Public Sub Hent_FletOgGem()
    Dim Ordre() As Variant, Ordrelinje() As Variant, Import() As Variant, X As Long, I As Long, Sti As String
    X = 0
    Sti = "c:\Data\"
    Open Sti & "Ordre.txt" For Input As #1
    Do
        Line Input #1, linje
        ReDim Preserve Ordre(X)
        Ordre(X) = Split(linje, ",")
        X = X + 1
    Loop Until EOF(1)
    Close #1

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

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

    For I = 1 To UBound(Ordrelinje, 1)
        For X = 1 To UBound(Ordre, 1)
            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) = Ordrelinje(X)(2)    ' C
                Import(I, 4) = Ordrelinje(X)(3)    ' D
                Import(I, 5) = Ordrelinje(X)(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 X <> UBound(Import, 2) Then
                Print #1, Import(I, X) & ",";
            Else
                Print #1, Import(I, X)
            End If
        Next
    Next

    Close #1
End Sub
Avatar billede kabbak Professor
22. september 2008 - 18:27 #3
ret selv .txt til .csv i koden på de 2 input tabeller.

Antal kolonner finder den selv ud af på input filerne,bemærk at A = 0 , B = 1 osv.
Avatar billede pejsen Nybegynder
22. september 2008 - 19:14 #4
Hej Kabbak

Jeg kan næsten gennemskue din kode, men output filen indeholder kun 5 kommaer i 51 rækker.

Jeg mener jeg har ændret de rigtige steder.

Public Sub Hent_FletOgGem()
    Dim Ordre() As Variant, Ordrelinje() As Variant, Import() As Variant, X As Long, I As Long, Sti As String
    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(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(linje, ",")
        X = X + 1
    Loop Until EOF(1)
    Close #1

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

    For I = 1 To UBound(Ordrelinje, 1)
        For X = 1 To UBound(Ordre, 1)
            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) = Ordre(X)(16)    ' Q
                Import(I, 4) = Ordrelinje(X)(2)    ' C
                Import(I, 5) = Ordrelinje(X)(3)    ' D
                Import(I, 6) = Ordrelinje(X)(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 X <> UBound(Import, 2) Then
                Print #1, Import(I, X) & ",";
            Else
                Print #1, Import(I, X)
            End If
        Next
    Next

    Close #1
End Sub
Avatar billede kabbak Professor
22. september 2008 - 19:18 #5
mener du at der kun er 5 i alt, eller er der 5 per række
Avatar billede kabbak Professor
22. september 2008 - 19:21 #6
eller mener du at der ingen tekst er imellem kommaerne ??
Avatar billede pejsen Nybegynder
22. september 2008 - 19:22 #7
5 pr række - ialt 51 rækker
Avatar billede pejsen Nybegynder
22. september 2008 - 19:23 #8
Der ingen data imellem kommaerne.

Den ser sådan ud

,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
Avatar billede kabbak Professor
22. september 2008 - 19:25 #9
Så er der ingen match imellem  A kolonnen i Ordre.csv og Ordrelinje.csv

Tjek der
Avatar billede pejsen Nybegynder
22. september 2008 - 19:27 #10
skal der stå ReDim Import(UBound(Ordrelinje), 16)  ' klargør gemmevariabel
nu da jeg har sat en ekstra linie ind
Avatar billede kabbak Professor
22. september 2008 - 19:29 #11
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(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(linje, ",")
        X = X + 1
    Loop Until EOF(1)
    Close #1

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

    For I = 1 To UBound(Ordrelinje, 1)
        For X = 1 To UBound(Ordre, 1)
            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) = Ordre(X)(16)    ' Q
                Import(I, 4) = Ordrelinje(X)(2)    ' C
                Import(I, 5) = Ordrelinje(X)(3)    ' D
                Import(I, 6) = Ordrelinje(X)(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
End Sub

Prøv denne
Avatar billede pejsen Nybegynder
22. september 2008 - 19:30 #12
Jo i begge filer i kolonne A er der mange match
Avatar billede kabbak Professor
22. september 2008 - 19:31 #13
ReDim Import(UBound(Ordrelinje), 6)

Betyder at der er plads til 7 kolonner, den første er 0
Avatar billede kabbak Professor
22. september 2008 - 19:32 #14
Er det skrevet på samme måde begge steder Store bogstaver begge steder, eller er det tal ??
Avatar billede kabbak Professor
22. september 2008 - 19:34 #15
der bliver lavet lige så mange linjer i Import, som der er i Ordrelinje
Avatar billede pejsen Nybegynder
22. september 2008 - 19:36 #16
Ok retter den til 6

Kollone A er tal

Filen ser sådan ud nu

No Match,,,,,,,,,,,,,,,,
No Match,,,,,,,,,,,,,,,,
No Match,,,,,,,,,,,,,,,,
No Match,,,,,,,,,,,,,,,,
No Match,,,,,,,,,,,,,,,,
No Match,,,,,,,,,,,,,,,,
No Match,,,,,,,,,,,,,,,,
No Match,,,,,,,,,,,,,,,,
No Match,,,,,,,,,,,,,,,,
No Match,,,,,,,,,,,,,,,,
No Match,,,,,,,,,,,,,,,,
Avatar billede kabbak Professor
22. september 2008 - 19:37 #17
For I = 1 To UBound(Ordrelinje, 1)
  OK = False
        For X = 1 To UBound(Ordre, 1)
            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) = Ordre(X)(16)    ' Q
                Import(I, 4) = Ordrelinje(X)(2)    ' C
                Import(I, 5) = Ordrelinje(X)(3)    ' D
                Import(I, 6) = Ordrelinje(X)(4)    ' E
              OK = True
                Exit For

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



Jeg glemte en linje
det er

OK = False

sæt den ind som vist her
Avatar billede pejsen Nybegynder
22. september 2008 - 19:38 #18
Ja,det er korrekt, der er 51 linjer i Ordrelinje
Avatar billede kabbak Professor
22. september 2008 - 19:39 #19
Prøv at rette

  If Ordre(X)(0) = Ordrelinje(I)(0) Then

til

If Val(Ordre(X)(0)) = Val(Ordrelinje(I)(0)) Then
Avatar billede kabbak Professor
22. september 2008 - 19:43 #20
Prøv at sende de 2 csv filer til mig, så tester jeg her

kabbak snabela tiscali dot dk
Avatar billede pejsen Nybegynder
22. september 2008 - 19:54 #21
Når jeg debugger linjen

If Val(Ordre(X)(0)) = Val(Ordrelinje(I)(0)) Then

kan jeg se at
Val(Ordre(X)(0))=""950"" med 2 "", men

Val(Ordrelinje(I)(0))= "950" vises kun med 1 "

Hvad skyldes det?
Avatar billede kabbak Professor
22. september 2008 - 20:02 #22
Prøv
    If Val(Replace(Ordre(X)(0), Chr(34), "")) = Val(Ordrelinje(I)(0)) Then
Avatar billede pejsen Nybegynder
22. september 2008 - 20:16 #23
Det var bedre, men nu kommer der fejl i
Import(I, 2) = Ordre(X)(5)    ' F "Subscript out of range"
Avatar billede pejsen Nybegynder
22. september 2008 - 20:30 #24
Er det fordi kolonne 4(E) i Ordre er tom??
Avatar billede kabbak Professor
22. september 2008 - 20:33 #25
Ordre(X)(5) = Kolonne F, husk at A = 0
Avatar billede kabbak Professor
22. september 2008 - 20:34 #26
Læste ikke ordentlig, hvis bare kommaerne er der, så skulde det være underordnet
Avatar billede kabbak Professor
22. september 2008 - 20:36 #27
Men ellers betyder fejlen, som du siger, der er ikke så mange kolonner i variablen
Avatar billede pejsen Nybegynder
22. september 2008 - 20:40 #28
Kommaerne er der

Her er den linje i Ordre, den stopper ved.
Det er "Roblon A/S " hvor det går galt

"950";"683";"0";"40";"";"Roblon A/S ";"Kjeldgaardsvej 6";
Avatar billede pejsen Nybegynder
22. september 2008 - 20:49 #29
Er dette korrekt??
Hvis jeg skal have data på plads 3 i format DD-MM-YYYY

Import(I, 3) = Ordre(X)(16) = Format(Import(I, 3), DD - MM - YYYY) ' Q
Avatar billede pejsen Nybegynder
22. september 2008 - 20:51 #30
Øhh.. undskyld plads 4
Avatar billede kabbak Professor
22. september 2008 - 23:33 #31
Dette er komma separerede filer

"950","683","0","40","","Roblon A/S ","Kjeldgaardsvej 6",

dette er semikolon separerede filer

"950";"683";"0";"40";"";"Roblon A/S ";"Kjeldgaardsvej 6";

Hvilken slags er det vi arbejder med, koden går ud fra at det er komma
Avatar billede pejsen Nybegynder
23. september 2008 - 00:16 #32
Det er semikolon, da de er lavet i excel
Avatar billede pejsen Nybegynder
23. september 2008 - 00:17 #33
Men kan der være et problem vis der ikke er quotes "" i filen. Det er der nemlig  ikke i "Ordrelinje"
Avatar billede pejsen Nybegynder
23. september 2008 - 01:05 #34
så fandt jeg fejlen
Følgende skal rettes til:
Import(I, 4) = Ordrelinje(X)(2) ---> Import(I, 4) = Ordrelinje(I)(2) ' C
Import(I, 5) = Ordrelinje(X)(3) ---> Import(I, 5) = Ordrelinje(X)(3) ' D
Import(I, 6) = Ordrelinje(X)(4) ---> Import(I, 6) = Ordrelinje(X)(4) ' E
Avatar billede pejsen Nybegynder
23. september 2008 - 01:06 #35
så fandt jeg fejlen
Følgende skal rettes til:
Import(I, 4) = Ordrelinje(X)(2) ---> Import(I, 4) = Ordrelinje(I)(2) ' C
Import(I, 5) = Ordrelinje(X)(3) ---> Import(I, 5) = Ordrelinje(I)(3) ' D
Import(I, 6) = Ordrelinje(X)(4) ---> Import(I, 6) = Ordrelinje(I)(4) ' E
Avatar billede pejsen Nybegynder
23. september 2008 - 01:33 #36
Jeg vil gerne have en IF-sætning med, som ser på om kolonne 3 har nogen værdi hvis den er blank skal den springe videre til næste linje.

If Ordrelinje(I)(2) > "" Then ??????????? ' Springe videre til næste linje

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) = Ordre(X)(16)    ' Q
                Import(I, 4) = Ordrelinje(X)(2)    ' C
                Import(I, 5) = Ordrelinje(X)(3)    ' D
                Import(I, 6) = Ordrelinje(X)(4)    ' E
              OK = True
                Exit For
Avatar billede kabbak Professor
23. september 2008 - 08:13 #37
For I = 1 To UBound(Ordrelinje, 1)
OK = False
        For X = 1 To UBound(Ordre, 1)
          If IsEmpty(Ordrelinje(I)(2)) Then Exit For ' hvis tom gås 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) = Ordre(X)(16)    ' 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
Avatar billede kabbak Professor
23. september 2008 - 08:15 #38
Når den nu er ; semikolon separeret, så skal linjerne med

Split(linje, ",")

være

Split(linje, ";")
Avatar billede kabbak Professor
23. september 2008 - 08:15 #39
et svar ;-))
Avatar billede pejsen Nybegynder
23. september 2008 - 11:40 #40
Tak for hjælpen...

Sidste ting , hvorfor skriver den true i Import.txt, nå jeg laver nedeståeden formatændring

Import(I, 3) = Ordre(X)(16) = Format(Ordre(X)(16), DD - MM - YYYY) ' Q  ' Q
Avatar billede pejsen Nybegynder
23. september 2008 - 12:33 #41
Hej igen

Nedenstående linje forsætter selvom Cellen er tom. Jeg tror igen, det er de 4 tekstkvalifiktorer, som er problemet : """"

If IsEmpty(Ordrelinje(I)(2)) Then Exit For ' hvis tom gås til næste Ordrelinje

Ordrelinje(I)(2) = """"

Kan man ikke lave noget med:
If Not IsNumeric..??

Kollone C indeholder kun positive tal og blanke ""
Avatar billede kabbak Professor
23. september 2008 - 14:34 #42
If Not IsNumeric(Ordrelinje(I)(2)) Then Exit For ' hvis tom gås til næste
Ordrelinje.

Jeg er ikke sikker på at den fanger værdien, hvis du har "" i den
Import(I, 3) =  Format(Ordre(X)(16), DD - MM - YYYY) ' Q  ' Q
Avatar billede pejsen Nybegynder
23. september 2008 - 16:28 #43
If Not IsNumeric(Ordrelinje(I)(2)) Then Exit For ' hvis tom gås til næste Ordrelinje.

Nej, det kunne jeg ikke få til at  fungere

Hvad med replace ""?
Avatar billede kabbak Professor
23. september 2008 - 16:45 #44
du fortalte 22/09-2008 19:54:40 at det var Ordre, der var galt med "" i og ikke Ordrelinje
Avatar billede pejsen Nybegynder
23. september 2008 - 16:51 #45
ja, men det samme gør sig gældende i Ordrelinje, men jeg kan intet se når jeg åbner filen. her er et eksempel:
Kan se at kolonne 3, indmellem indeholder et ekstra mellemrum

"750";"1";"1";"Diverse drejning af ,400";"0,00";"0,00";"";"2";"";""
"752";"1";"2 ";"CNC drejning af 10 Stk.  Stormglas samt fod, aksel.
"753";"1";"2";"CNC drejning af RF-Pind";"60,00";"18,00";"0,00";"0,00";"";"1";"";""
"753";"2";"2 ";"Afkortning og afgratning af Rustfri aksel
"753";"3";"";"Begge Incl Materiale AISI 316";"";"";"0,00";"0,00";"";"";"";""
Avatar billede kabbak Professor
23. september 2008 - 17:03 #46
Jeg tror at vi skal prøve at fange det i opløbet, her.
ret
Ordre(X) = Split(linje, ",")
til
  Ordre(X) = Split(Replace(linje, Chr(34), ""), ",")

og den anden

Ordrelinje(X) = Split(linje, ",")
til

Ordrelinje(X) = Split(Replace(linje, Chr(34), ""), ",")

Ret selv til Simikolon, hvis det ikke er kommasepareret
Avatar billede pejsen Nybegynder
23. september 2008 - 17:38 #47
OK, men de skal tilføjes igen i Outputfilen.
Hvordan gør vi det?
Avatar billede pejsen Nybegynder
23. september 2008 - 17:50 #48
Det må hvis være sådan her

X <> UBound(Import, 2) Then
                Print #1, Import(I, X) & """"; ";"; """";
            Else
                Print #1, Import(I, X)
            End If
        Next
Avatar billede pejsen Nybegynder
23. september 2008 - 18:46 #49
Det ved at være en lang tråd, denne her.

Jeg vil gerne tilføje en "-" & et fortløbende nr., bagved ved hver værdi i kolonne 2,

Her er output-filen
Kolonne 2 =  "701"
"984";"701";"Preben Christensen";"39729";"2";"Ring for emblem i Alu.";"150";
"984";"701";"Preben Christensen";"39729";"2";"Skive for emblem i Alu.";"150";
"984";"701";"Preben Christensen";"39729";"2";"Ring for emblem i Messing";"150";
"984";"701";"Preben Christensen";"39729";"2";"Skive for emblem i Messing";"150";
"984";"701";"Preben Christensen";"39729";"2";"Ring for emblem i Rustfri 304";"10";
"984";"701";"Preben Christensen";"39729";"2";"Skive for emblem i Rustfri 304";"10";

"984";"701-1";
"984";"701-2";
"984";"701-3";
"984";"702-1";
"984";"702-2";
"984";"702-3";
osv.

Skal jeg oprette et ny spørgsmål til dig??
Avatar billede kabbak Professor
23. september 2008 - 22:31 #50
J = 1 ' Husk at dim J as integer
    For I = 1 To UBound(Ordrelinje, 1)
        OK = False
        For X = 1 To UBound(Ordre, 1)
            If Ordre(X)(0) = Ordrelinje(I)(0) Then
        '************************** ny ***************
            If Ordre(X)(1) = Ordre(X - 1)(1) And I > 1 Then
                J = J + 1
            Else
                J = 1
            End If
        ' **************************ny slut
                Import(I, 0) = Ordre(X)(0)    ' A
                Import(I, 1) = Ordre(X)(1) & "-" & J  ' B ' Tilføjet til enden
                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
                Exit For
            End If
        Next
    Next
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