Just nu i M3-nätverket
Jump to content

Hämta data från textfil


stealthx

Recommended Posts

Hej, jag är nybörjare vad gäller VBA och skulle vara mycket tacksam för hjälp med följande fråga.

 

Jag vill till ett arbetsblad föra in data från olika textfiler. Datan jag söker efter i textfilen kommer ligga placerad på fyra olika rader, där de två första raderna är placerade efter varandra men skilda från de två sista raderna som är placerade efter varandra. Låt oss säga att de första två raderna jag söker efter inleds med texten " 5000" och de två sista raderna inleds med "TO 3824".

 

Min fråga är därför: Hur skall jag göra för att hitta dessa rader och kopiera dem till mitt arbetsblad?

 

 

 

Link to comment
Share on other sites

Är det inte alltför stora textfiler är det troligen enklast att importera filen till ett tomt blad i arbetsboken och sedan använda Excels eminenta Find funktion för att hitta det område du är intresserat av.

 

är du VBA-kunnig/programmeringskunnig, finns en enkel grund att starta ifrån; spela in ett makro där du gör detta!

 

1: Starta inspelning.

2: Importera textfilen.

3: Starta Sök (menyn redigare)

4: Sök reda på det du vill ha.

5: Kopiera det.

6: Stoppa makro

 

7+: Modifiera koden så att den blir mer generell och passar bättre för dina behov. Ta bort alla Select och Activate satser bland annat. Du bör ha de flesta av de verktyg du behöver i koden.

 

samt - fråga här om du behöver mer hjälp om det.

 

Ett annat sätt är att via VBA stega igenom filen ifråga, rad för rad sökande den nyckel du givit. Lite krångligare, säkerligen långsammare men klarar av det oavsett storlek på fil. Fast samtidigt ett litet roligare problem att lösa än det ovan..

 

Duger detta som en start? Har du fler frågor? Shoot!

 

 

/T

 

Even when we know we´ll never find the answers, we have to keep on asking questions.

 

Link to comment
Share on other sites

Hej och tack för svaret!

 

Eftersom jag tänkte att jag ska läsa in data från en mängd olika filer i en och samma knapptryckning verkar alternativet där man stegar igenom filen med VBA´s hjälp bäst. Jag har kommit en bit på väg och lyckas hämta de två raderna som jag känner inledningstexten på. Dock vill jag ju också klistra in efterföljande rad men vet inte hur jag ska lösa det på ett bra sätt.

 

Här är den kod jag skrivit, där läses data in från bara en fil, men tanken är att jag senare ska läsa in data från många filer.

 

Private Sub GetFaultData_Click() 'Hämtar felfallsdata från textfiler

Dim station As String

Dim station2 As String

Dim fil As String

 

station = InputBox("Stationsnummer")

fil = "c:\data\Z101" & station & ".txt"

station2 = InputBox("Stationsnummer mötande station")

 

Range("C15:N18").Select

Selection.Delete

 

Open fil For Input As #1

If Err <> 0 Then

MsgBox "Filen finns inte eller kan inte hittas", vbOKOnly

Else

TextToFind1 = "TO " & station2

TextToFind2 = station

Do Until EOF(1)

Line Input #1, data

If InStr(1, data, TextToFind2) Then

Range("D15") = data

Range("D15").Select

Selection.TextToColumns Destination:=Range("D15:N15")

 

ElseIf InStr(1, data, TextToFind1) Then

Range("C17") = data

Range("C17").Select

Selection.TextToColumns Destination:=Range("C17:N17")

End If

 

Loop

Close #1

Range("D15").Select

Selection.TextToColumns Destination:=Range("D15:N18")

End If

Range("O14").Select

Selection.Insert

End Sub

 

 

 

 

Link to comment
Share on other sites

Snygga till din kod lite, tagit bort alla Select-satser som är helt onödiga och enbart stjäl prestanda. Sedan lagt till ett exempel på hur du skulle kunna ta nästa rad, eller raderna emellan de två sökorden. En enkel princip.

 

För att förbereda för flera filer - gör om proceduren till en som tar fyra argument:

1: Fil att söka i

2: Sökord 1

3: Sökord 2

4: Startcell att skriva i.

 

Du får med detta en del ändringar till det bättre nedan (jag har inte gjort dessa)

Istället för att ange exakta cellreferenser som nedan kan du använda relativa mot given startcell, ex.v.

myRange.Offset(rad, kolumn)

är mycket enkel och trevlig att arbeta med. För att ange ett område blir det kanske lite krångligare då du blir tvungen att ange det i stil med:

Range(myRange.Offset(rad, kolumn), myRange.Offset(rad, kolumn+2))

Fast enklare blir det om du skriver

With myRange
  Range(.Offset(rad, kolumn), .Offset(rad, kolumn+2))
End With

 

Private Sub GetFaultData_Click() 'Hämtar felfallsdata från textfiler
   Dim station As String
   Dim station2 As String
   Dim fil As String
   Dim blNext As Boolean
   station = InputBox("Stationsnummer")
   fil = "c:\data\Z101" & station & ".txt"
   station2 = InputBox("Stationsnummer mötande station")

   Range("C15:N18").Delete
   blNext = False
   Open fil For Input As #1
   If Err <> 0 Then
       MsgBox "Filen finns inte eller kan inte hittas", vbOKOnly
   Else
       TextToFind1 = "TO " & station2
       TextToFind2 = station
       Do Until EOF(1)
           Line Input #1, data
           If InStr(1, data, TextToFind2) Then
               blNext = True
               Range("D15") = data
               Range("D15").TextToColumns Destination:=Range("D15:N15")
           ElseIf InStr(1, data, TextToFind1) Then
               blNext = True
               Range("C17") = data
               Range("C17").TextToColumns Destination:=Range("C17:N17")
           ElseIf blNext Then
               'nästa rad
               blNext = False
           End If
       Loop
       Close #1
       Range("D15").TextToColumns Destination:=Range("D15:N18")
   End If

   Range("O14").Insert
End Sub

 

är du med i vad jag gjort och vad jag föreslår? Och ja - för att veta vilken cell du ska stega till härnäst kan du göra om proceduren ovan så att den returnerar antalat rader den fogat till dokumentet...

 

 

/T

 

Even when we know we´ll never find the answers, we have to keep on asking questions.

 

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.



×
×
  • Create New...