ich bin kompletter Neuling bezüglich großer Arbeit in VBA, jetzt hat mich jedoch eine Auswertung erreicht, die wöchentlich laufen soll und Daten aus einer Datenbank (csv) in Excel überführen soll.
Ich habe hierzu eine Batch-Datei, die den kompletten Abruf der Daten aus der Datenbank übernimmt, dies wird in zwei csv-Dateien übergeben, die Daten in der csv-Datei sind Komma-getrennt.
Die Batch-Datei leert am Anfang den Ordner, wo nachher die beiden csv-Dateien abgelegt werden, damit kein Alt-Datenmüll da liegt.
Nun möchte ich gerne ein Template erstellen, dieses soll folgendes können:
1. Die beiden csv-Dateien öffnen
2. Den Inhalt der csv-Dateien importieren (Trennung mit den Kommata auflösen), dies am besten hintereinander in ein Tabellenblatt. In der ersten Zeile sind bei beiden Dateien die Überschriften. Die erste Datei (alias ED) heißt zum Beispiel Bezeichnung_22.04.2021.csv und die ist (nach der Konvertierung der csv-Datei) 7 Spalten breit (also A bis G). Die zweite Datei (alias ZD) heißt Bezeichnung_22.04.2021-E.csv und ist 11 Spalten breit (also A bis K), wobei die Spalte A (ZD), die gleichen Daten enthält, wie die Spalte A (ED) + die Spalte B (ZD) hat die gleichen Daten, wie die Spalte F (ED). Die beiden Spalten wurden für eine Sortierung der Datenbank und für einen vllt. nötigen SVerweis (falls ich es mit VBA nicht auf die Kette bekomme) ins Leben gerufen.
Hintereinander sollen also nur Spalte A bis G von ED und Spalte C bis K von ZD.
Die Menge der Zeilen kann variieren, dürfte aber nie mehr als 50 sein.
3. Wenn jetzt beide Tabellen hintereinander in einem Tabellenblatt sind, sollen Zeilen gelöscht werden, wenn Spalte B, C, D und E der Zeile leer sind.
4. Jetzt müssten noch Spalten hinzugefügt werden mit jeweils einer Überschrift.
5. Zu guter Letzt fehlt eig. nur noch ein Filter in der Zeile 1...
Ich weiß, dass das ein riesen Batzen an Anfragen ist, aber vllt. kann mir ja einer helfen... Ich stehe leider vollkommen auf meiner Unwissenheit.
Danke im Voraus...
Ich habe jetzt schon folgenden VBA-Code, der zieht aber nur beide csv-Dateien in die offene Excel-Tabelle und konvertiert die csv.
'**************************************************************
Option Explicit
Sub ImportFile()
Dim sPath As String
sPath = ThisWorkbook.Path & "\Datei1.csv"
tPath = ThisWorkbook.Path & "\Datei2.csv"
copyDataFromCsvFileToSheet sPath, ",", "Tabelle1"
copyDataFromCsvFileToSheets tPath, ",", "Tabelle2"
End Sub '**************************************************************
Private Sub copyDataFromCsvFileToSheet(parFileName As String, _
parDelimiter As String, parSheetName As String)
Dim Data As Variant
Data = getDataFromFile(parFileName, parDelimiter)
If Not isArrayEmpty(Data) Then
With Sheets(parSheetName)
.Cells(1, 1).Resize(UBound(Data, 1), UBound(Data, 2)) = Data
End With
End If
End Sub
'**************************************************************
Private Sub copyDataFromCsvFileToSheets(parFileName As String, _
parDelimiter As String, parSheetName As String)
Dim Data As Variant 'Array for the file values
Data = getDataFromFile(parFileName, parDelimiter)
If Not isArrayEmpty(Data) Then
With Sheets(parSheetName)
.Cells.ClearContents
.Cells(1, 1).Resize(UBound(Data, 1), UBound(Data, 2)) = Data
End With
End If
End Sub
'**************************************************************
Public Function isArrayEmpty(parArray As Variant) As Boolean
If IsArray(parArray) = False Then isArrayEmpty = True
On Error Resume Next
If UBound(parArray)
'**************************************************************
Private Function getDataFromFile(parFileName As String, _
parDelimiter As String, _
Optional parExcludeCharacter As String = "") As Variant
Dim locLinesList() As Variant 'Array
Dim locData As Variant 'Array
Dim i As Long 'Counter
Dim j As Long 'Counter
Dim locNumRows As Long 'Nb of rows
Dim locNumCols As Long 'Nb of columns
Dim fso As Variant 'File system object
Dim ts As Variant 'File variable
Const REDIM_STEP = 10000 'Constant
Set fso = CreateObject("Scripting.FileSystemObject")
On Error GoTo error_open_file
Set ts = fso.OpenTextFile(parFileName)
On Error GoTo unhandled_error
ReDim locLinesList(1 To 1) As Variant
i = 0
Do While Not ts.AtEndOfStream
If i Mod REDIM_STEP = 0 Then
ReDim Preserve locLinesList _
(1 To UBound(locLinesList, 1) + REDIM_STEP) As Variant
End If
locLinesList(i + 1) = Split(ts.ReadLine, parDelimiter)
j = UBound(locLinesList(i + 1), 1) 'Nb of columns in present row
If locNumCols "" Then
For i = 1 To locNumRows
For j = 0 To UBound(locLinesList(i), 1)
If Left(locLinesList(i)(j), 1) = parExcludeCharacter Then
If Right(locLinesList(i)(j), 1) = parExcludeCharacter Then
locLinesList(i)(j) = _
Mid(locLinesList(i)(j), 2, Len(locLinesList(i)(j)) - 2)
Else
locLinesList(i)(j) = _
Right(locLinesList(i)(j), Len(locLinesList(i)(j)) - 1)
End If
ElseIf Right(locLinesList(i)(j), 1) = parExcludeCharacter Then
locLinesList(i)(j) = _
Left(locLinesList(i)(j), Len(locLinesList(i)(j)) - 1)
End If
locData(i, j + 1) = locLinesList(i)(j)
Next j
Next i
Else
For i = 1 To locNumRows
For j = 0 To UBound(locLinesList(i), 1)
locData(i, j + 1) = locLinesList(i)(j)
Next j
Next i
End If
getDataFromFile = locData
Exit Function
error_open_file: 'Returns empty Variant
unhandled_error: 'Returns empty Variant
End Function