Opsplitning af tekstfiler til mindre filer med Excel VBA
På denne side viser jeg, hvordan man med VBA kan opdele en tekstfil i mindre filer med et brugerdefineret antal (maksimum) linjer eller rækker.
Makroen indeholder eksempler på, hvordan man indlæser et brugervalgt filnavn, hvordan filens tekst kan indlæses i et array med 1 linje pr. række med VBA-funktionen "Split()," hvordan man kan skrive indholdet af et array til en tekststreng med linjeskift samt skrive filen til disken.
Du kan markere koden med musen, kopiere den med CTRL+c og sætte den ind i et VBA-modul med CTRL+v. Bruger du en lille skærm, kan nogle af kodelinjerne være ombrudte, men linjeskiftene er OK, når du indsætter koden i et VBA-modul.
Det kom sig egentlig af, at jeg ville analysere logfiler for min hjemmeside med Excel. Disse logfiler kan være endog meget store, og da jeg bruger Excel 2003, hvor der "kun" er plads til 65.536 rækker, så jeg mig om efter en løsning, som kunne opdele logfilerne i spiselige portioner.
Jeg fandt flere forslag på nettet, men jeg kunne ikke få dem til at fungere. Måske var jeg ikke grundig nok, måske for utålmodig, men det gjorde, at jeg i stedet skrev min egen makro.
Det kan sikkert gøres smartere, men det virker for mig og går rimelig hurtigt. De nye filer gemmes i samme katalog som originalfilen og får samme navn + et nummer (navn1.txt, navn2.txt osv.).
Koden kan også bruges på .csv-filer, så skal man blot ændre "txt" til "csv".
Sub SplitTextFile()
Dim sFile As String
Dim sText As String
Dim lStep As Long
Dim vX, vY
Dim iFile As Integer
Dim lCount As Long
Dim lIncr As Long
Dim lMax As Long
Dim lNb As Long
Dim lSoFar As Long
On Error GoTo ErrorHandle
sFile = Application.GetOpenFilename()
If sFile = "False" Then Exit Sub
lStep = Application.InputBox("Max antal rækker/linjer?", Type:=1)
lStep = lStep - 1
sText = _
CreateObject("Scripting.FileSystemObject").OpenTextFile(sFile).ReadAll
vX = Split(sText, vbLf)
sText = ""
Do While lSoFar < UBound(vX)
If UBound(vX) - lSoFar >= lStep Then
ReDim vY(lStep)
lMax = lStep + lSoFar
Else
ReDim vY(UBound(vX) - lSoFar)
lMax = UBound(vX)
End If
lNb = 0
For lCount = lSoFar To lMax
vY(lNb) = vX(lCount)
lNb = lNb + 1
Next
lSoFar = lCount
iFile = FreeFile
lIncr = lIncr + 1
Open sFile & "-" & lIncr & ".txt" For Output As #iFile
Print #iFile, Join$(vY, vbCrLf)
Close #iFile
Loop
Erase vX
Erase vY
Exit Sub
ErrorHandle:
MsgBox Err.Description & " Procedure SplitTextFile"
End Sub
Det var det. Originalfilen er nu delt op i mindre filer med det antal linjer, brugeren definerede. Den sidste fil vil dog næsten altid være mindre end de øvrige.
Relateret
|