Anzeige
Archiv - Navigation
1584to1588
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

CSV-Daten per UserForm einlesen

CSV-Daten per UserForm einlesen
18.10.2017 01:42:15
Marco
Guten Abend alle,
ich sitze schon eine weile am PC und überlege mir wie ich sinnvoll und effektiv Daten aus CSV-Dateien (es sind immer die gleichen Spalten) in Excel laden kann ohne immer wieder die gleichen Spalten auswählen zu müssen.
Ist es möglich per UserForm (siehe Bild) wie in meinem Beispiel eine beliebige CSV Datei die in einem Ordner in dem viele solcher Dateien sind auszuwählen und wenn ich dann auf den Button Kopieren klicke, das nur die Daten und Spalten aus der CSV Datei entnommen werden die ich will?
Userbild
Meine CSV Datei hat 16 Spalten. Ich benötige aber nur aus der Spalte 1 die Daten nach dem zweiten @ Symbol (die Daten sind wie folgt in der Spalte 1 aufgebaut: 000002353453453453@0000443532@99030948544), dann benötige ich noch die Daten aus den Spalten 3, 4, 6, 8, 9, 10, 12 und 13.
Die Spalten sollten dann in meinem Tabellenblatt in der folgenden Reihenfolge aufgeführt sein: 1, 3, 6, 4, 13, 8, 9, 10, 12
Ist das möglich oder zu aufwendig?
Viele Grüße Marco und gute Nacht

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: CSV-Daten per UserForm einlesen
18.10.2017 09:38:49
Peter(silie)
Hallo,
im click Event des Button Datei auswählen folgendes:

Private Sub blabla_Button_Click()
Dim varItem As Variant
varItem = File_Selection(False)
If IsArray(varItem) Then
If varItem(0) = "" Then Exit Sub
ImportCSV varItem(0), ThisWorkbook.Sheets(1) 'Worksheet anpassen!
Erase_Unwanted_Data
End if
End Sub 
In ein Modul oder in den Code der UserForm:

'//FileDialog and Return array of selections
Public Function File_Selection(ByVal MultiSelect As Boolean) As Variant
Dim items_(), varItem As Variant
Dim Dialog_ As Object
Dim counter As Long
Set Dialog_ = Application.FileDialog(msoFileDialogFilePicker)
With Dialog_
.Title = "Datei-Auswahl"
.AllowMultiSelect = MultiSelect
.ButtonName = "Auswählen"
If .Show = -1 Then
ReDim items_(.SelectedItems.count - 1)
For Each varItem In .SelectedItems
items_(counter) = varItem
counter = counter + 1
Next varItem
End If
End With
File_Selection = items_
End Function
'//Very Simple CSV-Data import
Public Function ImportCSV(ByVal CsvPath As String, ByVal ToWorksheet_ As Worksheet) As Boolean
Dim CSVWorkbook As Workbook
On Error GoTo ErrHandler
Set CSVWorkbook = Workbooks.Open(CsvPath)
CSVWorkbook.Sheets(1).UsedRange.Copy Destination:=ToWorksheet_.Cells(1)
Application.CutCopyMode = False
CSVWorkbook.Close False
ErrHandler:
End Function
Private Function Erase_Unwanted_Data() As Boolean
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets(1) 'Anpassen!
With ws
.Cells(1, 11).EntireColumn.Delete
.Cells(1, 7).EntireColumn.Delete
.Cells(1, 5).EntireColumn.Delete
.Cells(1, 2).EntireColumn.Delete
.Cells(1, 1).EntireColumn.Delete
End With
End Function
Sollte dir der CSV Import nicht gefallen, dann verwende einfach den Makro Rekorder.
Der wird dir einen anderen "besseren" Import Code geben.

Anzeige
AW: CSV-Daten per UserForm einlesen
19.10.2017 17:11:57
Marco
Hallo Peter, danke für deine Hilfe. Ich habe deinen Code eingefügt aber ich glaube das noch etwas fehlt oder ich etwas falsch mache.
Aktuell habe ich nur das UserForm erstellt und den Button Abbrechen verlinkt. Aber der Button "Datei auswählen" und "Kopieren" sind nicht belegt. Ich weiß gerade nicht wie ich das machen soll. Ich dachte das wenn ich auf den Button Datei auswählen klicke öffnet sich ein Fenster in dem ich die Datei auswählen kann die ich importieren möchte. Danach steht der link im Textfeld. Wenn ich dann auf kopieren klicke werden die Daten in der Reihenfolge eingelesen wie ich es vorher erwähnt hatte.
Wenn ich jetzt aber deinen Code hernehme und nur auf Kopieren klicke erhalte ich diese Fehlermeldung "Fehler beim Kompilieren - Sub oder Function nicht definiert"
Grüße Marco
Anzeige
AW: CSV-Daten per UserForm einlesen
19.10.2017 18:15:41
Peter(silie)
Hallo,
Wenn dein button nicht blabla_button heißt, geht es nicht.
Hier eine Mappe mit UF, 2 Buttons und dem Code...: https://www.herber.de/bbs/user/117094.xlsm
Lies dir den Code durch und durchlaufe ihn schritt für schritt mit dem Debugger.
AW: CSV-Daten per UserForm einlesen
19.10.2017 20:01:31
Marco
Tut mir echt leid Peter aber ich bekomme es selbst mit deiner Datei nicht hin. Ich habe einen Button erstellt mit dem ich das UserForm1 bei mir aufrufe.
Code:
Sub Daten_einlesen()
UserForm1.Show
End Sub

Dann habe ich zum einlesen der Datei diesen Code geschrieben:
Private Sub Datei_einlesen_Click()
'Filepath = Application.GetOpenFilename("Text Files (*.csv), *.csv")
If Filepath  False Then
PFAD.TextBox3 = Filepath
End If
End Sub
Und danach habe ich den Button zum importieren der Daten so geschrieben + deinen Code den du am Anfang gepostet hast:
Private Sub Speichern_Click()
If Me.TextBox1.Text = "" Then Exit Sub
ImportCSV varItem(0), ThisWorkbook.Sheets(1) 'Worksheet anpassen!
Erase_Unwanted_Data
End Sub

'//FileDialog and Return array of selections
Public Function File_Selection(ByVal MultiSelect As Boolean) As Variant
Dim items_(), varItem As Variant
Dim Dialog_ As Object
Dim counter As Long
Set Dialog_ = Application.FileDialog(msoFileDialogFilePicker)
With Dialog_
.Title = "Datei-Auswahl"
.AllowMultiSelect = MultiSelect
.ButtonName = "Auswählen"
If .Show = -1 Then
ReDim items_(.SelectedItems.Count - 1)
For Each varItem In .SelectedItems
items_(counter) = varItem
counter = counter + 1
Next varItem
End If
End With
File_Selection = items_
End Function
'//Very Simple CSV-Data import
Public Function ImportCSV(ByVal CsvPath As String, ByVal ToWorksheet_ As Worksheet) As Boolean
Dim CSVWorkbook As Workbook
On Error GoTo ErrHandler
Set CSVWorkbook = Workbooks.Open(CsvPath)
CSVWorkbook.Sheets(1).UsedRange.Copy Destination:=ToWorksheet_.Cells(1)
Application.CutCopyMode = False
CSVWorkbook.Close False
ErrHandler:
End Function
Private Function Erase_Unwanted_Data() As Boolean
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets(1) 'Anpassen!
With ws
.Cells(1, 11).EntireColumn.Delete
.Cells(1, 7).EntireColumn.Delete
.Cells(1, 5).EntireColumn.Delete
.Cells(1, 2).EntireColumn.Delete
.Cells(1, 1).EntireColumn.Delete
End With
End Function
Aber es funktioniert nicht. Ich habe sogar deine Datei hergenommen und einfach einen Button hinzugefügt, aber ich erhalte immer die gleiche Meldung "Fehler beim Kompilieren: Sub oder Function nicht definiert"
Beispiel: https://www.herber.de/bbs/user/117100.xlsm
Anzeige
Mein Fehler
20.10.2017 08:24:49
Peter(silie)
Hallo,
mein Fehler, es liegt an varItem(0) in CommandButton2_Click()
da gibt es die Variable nicht.
Der Code von Button2 muss so aussehen:
Private Sub CommandButton2_Click()
If Me.TextBox1.Text = "" Then Exit Sub
ImportCSV TextBox1.Text, ThisWorkbook.Sheets(1) 'Worksheet anpassen!
Erase_Unwanted_Data
End Sub

AW: Mein Fehler
20.10.2017 09:56:16
Marco
Danke jetzt ist das Problem gelöst, aber es hat sich ein neues ergeben. Wenn ich auf Daten importieren klicke werden die Daten eingelesen, aber nicht Spalten aufgeteilt sondern alles in eine Zelle untereinander unter einander geschrieben.
Des Weiteren erhalte ich diese Meldung wenn ich auf Importieren klicke:
Fehlermeldung "Kann Datensatz nicht lesen" - "Excel hat festgestellt, dass "Dateiname.csv" eine SYLK-Datei ist, aber es kann die Datei nicht laden. Entweder ist die Datei fehlerhaft, oder es ist kein gültiges SYLK-Dateiformat. Klicken Sie OK, um die Datei in einem anderen Format zu öffnen.
Wenn ich die Daten aber per Hand einfüge funktioniert es ohne Probleme. Ich habe das mal aufgezeichnet kann es aber leider nicht in deinen Code einbauen. Kannst du mir da vielleicht weiterhelfen? Die Spalten konnte ich leider nicht im Vorfeld anordnen ka wie das funktioniert.
    With ActiveSheet.QueryTables.Add(Connection:= _
"TEXT;C:\Users\hase\Desktop\Stand 12\201710021629173005.csv\201710021629173005.csv" _
, Destination:=Range("$D$10"))
.CommandType = 0
.Name = "201710021629173005"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.TextFilePromptOnRefresh = False
.TextFilePlatform = 850
.TextFileStartRow = 1
.TextFileParseType = xlDelimited
.TextFileTextQualifier = xlTextQualifierDoubleQuote
.TextFileConsecutiveDelimiter = False
.TextFileTabDelimiter = False
.TextFileSemicolonDelimiter = True
.TextFileCommaDelimiter = False
.TextFileSpaceDelimiter = False
.TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
.TextFileTrailingMinusNumbers = True
.Refresh BackgroundQuery:=False
End With
End Sub
Gruß Marco
Anzeige
AW: huhu Peter
21.10.2017 16:42:34
Marco
Hast du mich vergessen =(
AW: huhu Peter
24.10.2017 04:37:46
fcs
Hallo Marco,
´
das Problem "CSV-Datei wird als SYLK erkannt" um das sich Microsoft seit Jahren nicht kümmert.
https://annalear.ca/2010/06/10/why-excel-thinks-your-csv-is-a-sylk/
Das Problem kann man umschiffen indem man im Makro vorübergehend die Alarm-Meldungen deaktiviert.
Das 2. Problem - Text einer Zeile jeweils in einer Zelle - hängt damit zusammen dass VBA-Makros standardmäßig vom US-Format für das Trennzeichen zwischen Feldern/Spalten ausgehen. Dies ist das Komma.
Verwendet man deutsche bzw. System-Einstellungen beim Erstellen der CSV dann ist das Trennzeichen das Semikolon.
Damit der Import unter VBA funktioniert muss für das Öffnen der CSV-Datei der Parameter "Local" auf True gesetzt werden.
Vorsicht: Bei Zahlen werden dann auch das Komma bzw. der Punkt als Dezimalzeichen bzw. 1000er-Zeichen interpretiert. Wenn es hier in deinen CSV-Dateien anders ist, dann müssen die CSV-dateien als Textdateien geöffnet werden mit individuellen Einstellungen für diese Parameter.
Ich hab das in deiner Datei in den Makros entsprechend angepasst.
Zusätzlich werden in Spalte 1 (A) die Inhalte bis einschließlich 2. @ entfernt und die Spalten werden in die gewünschten Reihenfolge umgestellt
https://www.herber.de/bbs/user/117179.xlsm
Gruß
Franz
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige