Excel VBA - Konvertierung ohne Endung

Status
Dieses Thema wurde gelöst! Zur Lösung gehen…

jerry0110

Erfahrenes Mitglied
Hallo zusammen,

ich möchte gerne aus einer CSV eine XLS machen.
Dafür habe ich mein Standard Script.

Visual Basic:
Sub CSV()
  Dim sFile As String, sPath As String, iFree As Integer
  Dim arrCSV, arrTmp, arrXLS(), i As Long, j As Integer, n As Long
  Dim zFile As String
  Dim myDate As Date
 
  sPath = ThisWorkbook.Path & "\Buchungen an Stammdaten\"      'anpassen
  sFile = Dir(sPath & "*.csv")
  zFile = sFile
    
  Application.ScreenUpdating = False
  Application.Calculation = xlCalculationManual
  Do While Len(sFile)
 
    iFree = FreeFile
    Open sPath & sFile For Input As iFree
    arrCSV = Split(Input(LOF(iFree), iFree), vbCrLf)
    Close iFree
    
    For i = 0 To UBound(arrCSV)
      arrTmp = Split(arrCSV(i), ";")
      n = Application.Max(n, UBound(arrTmp))
    Next
    
    For j = 0 To UBound(arrTmp)
        arrXLS(i + 1, j + 1) = arrTmp(j)
    Next
    
    ReDim arrXLS(1 To UBound(arrCSV) + 1, 1 To n + 1)
    For i = 0 To UBound(arrCSV)
      arrTmp = Split(arrCSV(i), ";")
      For j = 0 To UBound(arrTmp)
        arrXLS(i + 1, j + 1) = arrTmp(j)
      Next
    Next
    
    With Workbooks.Add
      .Sheets(1).Cells(1, 1).Resize(UBound(arrXLS), UBound(arrXLS, 2)) = arrXLS
      .SaveAs sPath & zFile, FileFormat:=xlWorkbookDefault
      .Close
    End With
    
    sFile = Dir
  Loop

Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
End Sub

Es gibt maximal 2 CSV Dateien. Aber zu 99% immer nur ein.

Was es machen soll ist, dass er den gleichen Namen der CSV auch als XLS nehmen soll.
Wenn ich das Scipt aber durchlaufen lasse, dann macht er mir die Datei ohne ".xls"-Endung.
Wenn ich aber bei zFile einen festen Namen hinschreibe, dann macht er mir ein ".xls" dahinter.
Warum?
 
Zeile 9: Du weist zFile direkt sFile zu (Das Ergebnis der Dir-Funktion), und das enthält bereits eine Endung namens "csv"
Ich würde an deiner Stelle explizit zusätzlich sFile in Namen und Endung auftrennen (Split über "." - UBound davon ist Endung, alles darunter der Name). Dann aus dem Namensteil (LBound bis UBound -1) und einem Literal "xls" bzw. ".xls" (Frage: Wieso nicht "xlsx"?) deinen XLS-Namen zusammenbauen.
 
Voher hatte ich Zeile 9 folgendes Stehen.

Visual Basic:
zFile = Left(sFile, Len(sFile) - 4)

XLS habe ich genommen, weil hier in meiner Firma alles in XLS gespeichert wird. Ich möchte lieber nicht sagen warum :)

Und UBound oder LBound hab ich noch nie benutzt. Ich guck mal was das macht oder was ich machen muss.
 
Zuletzt bearbeitet:
Urrgghh..... der Left-Len-Murks bei Dateinamen. Kann ich leiden wie Bauchweh.

LBound/Ubound gibt dir den unteren bzw. oberen Index eines Arrays zurück.
Bsp. sTest="Das ist ein Test" --> arrTest=Split(sTest, " ") ergibt
arrTest(0)="Das"
arrTest(1)="ist"
arrTest(2)="ein"
arrTest(3)="Test"
LBound(arrTest) --> 0
UBound(arrTest) --> 3

Anstatt Split kannst du auch die InStrRev-Funktion nehmen.
MyFile="Seltsam.diese.Datei.ist.benannt.csv"
Debug.Print InStrRev(MyFile, ".") ergibt 32
-->
zFile=Left(MyFile, InStrRev(MyFile, ".")) & "xls"
Debug.Print zFile --> Seltsam.diese.Datei.ist.benannt.xls
 
Status
Dieses Thema wurde gelöst! Zur Lösung gehen…
Zurück