Avatar billede spoi Nybegynder
25. januar 2007 - 19:50 Der er 21 kommentarer og
1 løsning

hente data fra tekstfil

Jeg skal hver fredag hente nogle data fra tre tekstfil og sætte dem ind i tre forskellige ark. Det er altid de samme tre teksfiler der hentes fra og den samme excelfil med de tre ark der hentes fra. Der er flere ark i regenarket som så automatisk beregner data ud fra data fra de tre filer der hentes ind.

Allerførst skal jeg i arkene slette de kolonne hvor tekstfilerne skal sættes ind. Feks A2 - Axxx, B2-Bxxx, G2-Gxxx. Overskrifterne skal blive stående.
På de tre ark er det forskellige kolonne der skal slettes. Tror jeg har styr på denne del. Dog kun ved at lave tre makroer og en kanp på hvert ark hvor der skal slettes. Kan det gøres enklere må i gerne give et hint.

Nå men problemet er nok mere hentning af data til de rette kolonner. Data på hver tekstfil er ;-separeret(mener jeg).
Hver række i tekstfilerne svarer til en række i excel arket.

Feks skal det først tal(i hver række) i tekstfil HOsalg.txt placeres på arket salg(Ark3) i kolonne G2-Gxxx.
Nr 5 tal skal feks placeres i A2-Axxx.
Giver dette mening

Fik et hint om at jeg skulle huske at fjerne tomme felter. Noget med de data jeg henter har reservert et antsl fleter for hver værdi som så bare er tomme hvis der ikke er nogen høj værdi. Giver det mening. Er lidt dårlig til at forklare det her.

Desuden ved jeg at nogle tal feks et sted står der 40.000000. Der skal der kun stå 40.



Fiktive eksempel
tekstfil HO-salg
0258;40,0000;6668;BM
3333;24.0000;7777;KM


Excel fil - Ark = Salg
              A      B      C    D  F    G
Kolonne2    6668    40          BM      0258
Kolonne3    7777    24          KM      3333

Derefter en sortering efter Data i Kolonne G

Er der nogen der kan og vil hjælpe mig med at løse dette? Jeg er ret meget nybegynder. Beklager hvis jeg er dårlig til at forklare. Ved heller ikke om jeg giver point nok.

LN
Avatar billede jhe-ting Nybegynder
26. januar 2007 - 09:20 #1
Der skal nok en del kodning til at lave en komplet løsning. Det er jeg frisk på.

Der er både komma og punktum som decimalseparator i dit eksempel!
Er det en tastefejl?

Hvis tekstfilen er konsekvent formateret kan man bruge tekst til kolonne.
Med Excel's indbyggede funktioner bliver det hele lidt enklere.

Afventer uddybning/svar før jeg går igang ...  :o)
Avatar billede spoi Nybegynder
26. januar 2007 - 09:34 #2
Hej
Nu har jeg lige kigget i tekstfilerne igen
Det er kommaseparerede filer og ikke smikolon separede filer.

'mht decimalseperatot er det punktum. Dvs 40.0000 og ikke 40,00000

Tak fordi du vil hjælpe ;O)

LN
Avatar billede jhe-ting Nybegynder
26. januar 2007 - 10:28 #3
Her er et par makro'er du kan starte med at eksperimentere med:


Option Explicit
Sub txt2col()
'
' txt2col Makro
'

'
    Selection.TextToColumns Destination:=Range("D1"), DataType:=xlDelimited, _
        TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
        Semicolon:=False, Comma:=True, Space:=False, Other:=False, FieldInfo _
        :=Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1)), TrailingMinusNumbers:= _
        True
End Sub
Sub fil2col()
'
' fil2col Makro
' import file
'

'
    With ActiveSheet.QueryTables.Add(Connection:= _
        "TEXT;C:\758425.csv", _
        Destination:=Selection)
        .Name = "758425"
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .RefreshStyle = xlOverwriteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = False
        .RefreshPeriod = 0
        .TextFilePromptOnRefresh = False
        .TextFilePlatform = 1252
        .TextFileStartRow = 1
        .TextFileParseType = xlDelimited
        .TextFileTextQualifier = xlTextQualifierDoubleQuote
        .TextFileConsecutiveDelimiter = False
        .TextFileTabDelimiter = False
        .TextFileSemicolonDelimiter = False
        .TextFileCommaDelimiter = True
        .TextFileSpaceDelimiter = False
        .TextFileColumnDataTypes = Array(1, 1, 1, 1)
        .Refresh BackgroundQuery:=False
    End With
End Sub
Avatar billede spoi Nybegynder
26. januar 2007 - 11:53 #4
Hmm der sket absolut intet.

Den eneste rettelse jeg har lavet er stinavnet

Lige den jeg tester på nu indelilder kun værdier kollonner i tekstfilen som skal ind i Kolonne A og C

Min rettelse
Sub txt2col()
'
' txt2col Makro
'

'
    Selection.TextToColumns Destination:=Range("D1"), DataType:=xlDelimited, _
        TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
        Semicolon:=False, Comma:=True, Space:=False, Other:=False, FieldInfo _
        :=Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1)), TrailingMinusNumbers:= _
        True
End Sub
Sub fil2col()
'
' fil2col Makro
' import file
'

'
    With ActiveSheet.QueryTables.Add(Connection:= _
        "TEXT;H:\Pipeline\HO-Inventsum.txt", _
        Destination:=Selection)
        .Name = "HO-Inventsum"
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .RefreshStyle = xlOverwriteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = False
        .RefreshPeriod = 0
        .TextFilePromptOnRefresh = False
        .TextFilePlatform = 1252
        .TextFileStartRow = 1
        .TextFileParseType = xlDelimited
        .TextFileTextQualifier = xlTextQualifierDoubleQuote
        .TextFileConsecutiveDelimiter = False
        .TextFileTabDelimiter = False
        .TextFileSemicolonDelimiter = False
        .TextFileCommaDelimiter = True
        .TextFileSpaceDelimiter = False
        .TextFileColumnDataTypes = Array(1, 1, 1, 1)
        .Refresh BackgroundQuery:=False
    End With
End Sub


LN
Avatar billede spoi Nybegynder
26. januar 2007 - 12:55 #5
fik nu lidt til at virke, på en teksfil med kun to kolonner men den lægger datai kolonne G7, H7 og nedefter og så tager den overskrifterne med. dvs første række i tekstfilen. Det skal den ikke. Den skal tage fra række 2. Overskrifterne står i forvejen i regnearket - og på dansk;O)

Del 2 kan jeg slet ikke få til at virke

Ln

Private Sub CommandButton1_Click()
'Sub filtocol()
'
' fil2col Makro
' import file
'

'
    With ActiveSheet.QueryTables.Add(Connection:= _
        "TEXT;H:\Pipeline\HO-Inventsum.txt", _
        Destination:=Selection)
        .Name = "HO-Inventsum"
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .RefreshStyle = xlOverwriteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = False
        .RefreshPeriod = 0
        .TextFilePromptOnRefresh = False
        .TextFilePlatform = xlWindows
        .TextFileStartRow = 1
        .TextFileParseType = xlDelimited
        .TextFileTextQualifier = xlTextQualifierDoubleQuote
        .TextFileConsecutiveDelimiter = False
        .TextFileTabDelimiter = False
        .TextFileSemicolonDelimiter = False
        .TextFileCommaDelimiter = True
        .TextFileSpaceDelimiter = False
        .TextFileColumnDataTypes = Array(1, 1, 1, 1)
        .Refresh BackgroundQuery:=False
    End With
End Sub
Avatar billede jhe-ting Nybegynder
27. januar 2007 - 00:18 #6
Hvilken version af excel skal det køre på?
Avatar billede spoi Nybegynder
29. januar 2007 - 07:27 #7
Excel 2000
Avatar billede jhe-ting Nybegynder
29. januar 2007 - 07:41 #8
Ret "Sub CommandButton1_Click()" så der på 3. linje står:

    Destination:=Range("A2") )

Så kommer data in på celle A2.
Avatar billede jhe-ting Nybegynder
29. januar 2007 - 07:44 #9
Funktionen skal dog kun køres en gang på hvert ark der skal importere data fra tekstfiler.
Der dannes så en querry der kan opdateres når det ønskes.
Avatar billede jhe-ting Nybegynder
29. januar 2007 - 08:18 #10
Opdatering af de importerede data gan gøres med én sætning:
    ActiveSheet.QueryTables.Item(1).Refresh BackgroundQuery:=False
Avatar billede spoi Nybegynder
29. januar 2007 - 09:36 #11
Hmm det sidste forstod jeg ikke.

Den lægger data fint nu men Det med opdateringen forstår jeg ikke.
Som det er nu kommer der nye data en gang om ugen. dvs der skal trykkes på knapperne en gang om ugen.

På sigt skal data hentes en gang i døgnet. Gerne automatisk når den tid kommer. Men det er ikke nu.

Indtil videre er det kun en gang om ugen at tekstfilerne ændres.

Hvad mener du med opdatering at der impoterede data?

Måske jeg skal have forklaret hvad en Query helt præcict er for at forstå det. Ja ved godt det sikkert er et rigtigt dumt ? Beklager.



LN
Avatar billede spoi Nybegynder
29. januar 2007 - 10:46 #12
Hej så har jeg på første ark fået det til at virke
I kolonne B er der dog alt for mange tal
Feks hvor der skal stå 180 står der 1800000000000000000
Dvs 16 tegn for meget.
Ved du hvorledes jeg kan fjerne disse? Har prøvet lidt men der sker ikke noget

LN
Avatar billede jhe-ting Nybegynder
29. januar 2007 - 22:22 #13
Re: 29/01-2007 07:44:57
Skrevet under forudsætning at data importeres fra SAMME tekstfil hver gang.

Hvis det er en ny fil hver gang, SKAL den gamle querry slettes, for at undgå et rod af 'døde' querryes.
Avatar billede jhe-ting Nybegynder
29. januar 2007 - 22:23 #14
Prøv denne makro for at se på QuerryTables


Sub ShowActiveQuerries()
    Dim idx As Integer
    Dim qrs As QueryTables
    Dim msg As String
   
    Set qrs = ActiveSheet.QueryTables
    msg = "Antal QueryTables = " & qrs.Count & vbLf
    For idx = 1 To qrs.Count
        msg = msg & idx & " : " & qrs.Item(idx).Name
        msg = msg & " : " & qrs.Item(idx).Connection & vbLf
    Next idx
    MsgBox msg
End Sub
Avatar billede jhe-ting Nybegynder
29. januar 2007 - 22:24 #15
Prøv at stille markøren på QueryTables og tast F1 for at se Excel Visualbasic hjælp
Avatar billede spoi Nybegynder
31. januar 2007 - 13:58 #16
Synes min makro er afsindig langsom. Kan det være rigtigt. Det er ca 5-6000 datalinier jeg henter ind. Men bare det at slette de eksisterende linier tager en hel krig.

LN
Avatar billede jhe-ting Nybegynder
31. januar 2007 - 14:03 #17
Hvis du bruger refresh skal de gamle værdier ikke slettes først.
Avatar billede spoi Nybegynder
31. januar 2007 - 16:36 #18
havd så hvis der i sidste uge var 6000 linier og i denne kune 5000. Vil der så ikke stadig stå de sidste 1000 linier fra sidste uge.

LN
Avatar billede spoi Nybegynder
31. januar 2007 - 16:37 #19
Det er ikke samme data der hentes ind hver uge men palceringen af dem er de samme.

LN
Avatar billede jhe-ting Nybegynder
31. januar 2007 - 20:54 #20
Efter refresh vil tabellen kun indeholde de aktuelle data fra import-filen.
Alle gamle data fra tidligere import glemmes.

Har de nye data samme drev:\sti\filnavn er det refresh du skal bruge.
Er det et nyt filnavn hver gang, skal man indstille egenskaben Connection til at referere til det nye filnavn, og derefter kalde refresh.
Avatar billede spoi Nybegynder
01. februar 2007 - 07:12 #21
Ok
er det denne jeg skal bruge?
ActiveSheet.QueryTables.Item(1).Refresh BackgroundQuery:=False
Og skal den bare ligge før koden ?

Ln
Avatar billede jhe-ting Nybegynder
01. februar 2007 - 15:03 #22
Ja - det kommer an på hvolken kode du mener.

Jeg forestiller mig det vil være smart at have en arbejdsmappe med et ark for hver import, og et overordnet ark hvor data analyseres/rapporteres.

I det overordnede ark kunne koden ligne følgende:

ActiveWorkbook.Sheets.Item("Sheet2").QueryTables.Item(1).Refresh BackgroundQuery:=False
ActiveWorkbook.Sheets.Item("Sheet3").QueryTables.Item(1).Refresh BackgroundQuery:=False
ActiveWorkbook.Sheets.Item("Sheet4").QueryTables.Item(1).Refresh BackgroundQuery:=False


Denne kode vil opdatere alle tre import-ark på en gang.
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
Excel kurser for alle niveauer og behov – find det kursus, der passer til dig

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