Clever-Excel-Forum

Normale Version: csv-Datei in vorhandene Exceldatei einlesen
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Seiten: 1 2 3 4 5
Hallo snb,

ganz so doof, wie du mich darstellen willst, bin ich nicht!

Selbstverständlich habe ich deinen Code-Vorschlag an meine Bedingungen angepasst, aber für einen ordentlichen Programmierer gehört auch, dass die Variablen deklariert sind und nicht irgendwie im Raum schweben.
Soviel habe ich als "VBA-Anfänger" bereits gelernt und gelehrt bekommen...
Option Explicit ist Pflicht und On Error Resum Next tabu! Fehlermeldungen sind zu behandeln und nicht zu unterdrücken!

Und trotz der Anpassung auf die richtigen Dokumente (Sheets("Konvert") anstelle Sheet1) läuft dein Code nicht!
Hallo Günter,

Problem bei snb's code ist der "Unicode text". Nur "Text" sollte funktionieren.
(27.11.2015, 19:08)Glausius schrieb: [ -> ]aber für einen ordentlichen Programmierer gehört auch, dass die Variablen deklariert sind und nicht irgendwie im Raum schweben.

Das sind nur Märchen (schau mal z.B. 'Python' an).
Nur wenn die 'scope ' Private' oder 'Public' ist sind Deklarationen nicht redundant.


Und: Vielen Dank für deine Vorschläge, wäre auch nett gewesen.
Hallo Günter,

Problem bei snb's code ist der "Unicode text". Nur "Text" sollte funktionieren.
Hallo André,

danke für die Ergänzung zu snb's-Code, jetzt liest er problemlos ein, aber ich habe nicht die Daten in den Spalten Datum, sondern nur als Standardwerte.
Irgenwie ist es verhext. Klappt das eine, fubnktioniert das andere nicht und umgekehrt!
Na, vielleicht gibt es noch eine Lösung für Beides - die Hoffnung stirbt bekanntlich zu letzt!
Hallo Günter,

ich würde nach Einlesen der Datei ein kleines Makro drüberlaufen lassen, sodaß die Spalten
entsprechend meiner Vorstellungen quasi zwangsbeglückt neu formatiert werden.

Das scheint mir die einfachste Lösung für Dein Problem zu sein.
Hallo Alle, insbesondere Peter,

ich habe nur eine Anpassung an Uwes Code bei meiner Ergänzung vornehmen müssen, es war logisch, dass Excel bei der alten Konstruktion immer dann, wenn es auf eine Zahl gestoßen ist, die in ein Datum umwandeln wollte, weil der Rest der If-Abfrage dann nicht mehr bearbeitet wurde.

Da klar ist, dass nur in den ersten beiden Zellen ein Datum steht, ist der Code so ergänzt worden
Code:
        For j = 0 To UBound(arHilf)
            If IsDate(arHilf(j)) And (j = 0 Or j = 1) Then
                arData(i, j) = CDate(arHilf(j))
            ElseIf IsNumeric(arHilf(j)) Then
                arData(i, j) = CDbl(arHilf(j))
            Else
                arData(i, j) = arHilf(j)
            End If
        Next

und er läuft nun einwandfrei!
Hallo Günter,

ich bleibe mal bei der anderen Version und der Lösung für das Datumsproblem.

Zu Deiner Frage - Zahlen bis Komma 12 versucht Excel bei Eintrag über VBA in ein Datum zu wandeln, jeweils den ersten des Monats.

Wir haben
Zahlen ohne Komma - in Zahl, passt.
Zahlen mit Komma - in Zahl, passt nicht immer.
Datum - soll bleiben, passt nicht

Manchmal hilft eine kleine Logiktabelle. Derzeit werden alle numerischen Daten gewandelt.
Ich möchte aber nur Zahlen wandeln, auch die, die ein Komma enthalten und nicht als Datum interpretiert werden können.
Ich müsste also 3 Bedingungen prüfen.

Arbeitsblatt mit dem Namen 'Tabelle1'
 ABCD
6was soll'sZahlZahl mit KommaDatum
7ISNUMERICTTT
8AND   
9IS NOT DATETFF
10OR INSTR ","FTF
11SUMMETTF
12    
13CDBLTTF
Diese Tabelle wurde mit Tab2Html (v2.5.0) erstellt. ©Gerd alias Bamberg



Code:
Sub CSV_Datei_einlesen()
   Set fdDialog = Application.FileDialog(msoFileDialogFilePicker)
   With fdDialog
       .Filters.Add "CSV-Dateien", "*.CSV", 1
       .Title = "Bitte Datei auswählen"
       .AllowMultiSelect = False
       If .Show = -1 Then
           strDatei = .SelectedItems(1)
       Else
           Exit Sub
       End If
   End With
   Set objTextFile = CreateObject("Scripting.FileSystemObject").OpenTextFile(strDatei, 1, False)
   strInhalt = objTextFile.ReadAll
   objTextFile.Close
   varErgebnis = Split(strInhalt, vbCrLf)
   icnt = UBound(Split(varErgebnis(0), ";")) 'Fuer flexible Anzahl Datenspalten
   ReDim ardata(0 To UBound(varErgebnis), 0 To icnt)
   For i = 0 To UBound(varErgebnis)
       arHilf = Split(varErgebnis(i), ";")
       If UBound(arHilf) = icnt Then   'aus 15 wurde 16 und aus 16 icnt
           For j = 0 To icnt ' und auch hier ersetzt icnt die 16 die 15
               'und dann pruefen wir mal etwas mehr
               If IsNumeric(arHilf(j)) And (Not IsDate(arHilf(j)) Or InStr(arHilf(j), ",") > 0) Then
                   ardata(i, j) = CDbl(arHilf(j))
               Else
                   ardata(i, j) = arHilf(j)
               End If
           Next
       End If
   Next
   Sheets("Konvert").Range("A1").Resize(UBound(ardata, 1) + 1, UBound(ardata, 2) + 1) = ardata
End Sub
Hallo André,

DAS ist die komplette Lösung - fantastisch!
Meine Lösung wandelte nur ein Datum, wenn es in einer bestimmten Zelle steht, deine Lösung erstellt dann ein Datum aus der Zelle, wenn es ein Datum ist in welcher Zelle es auch in dem Arry steht - Klasse Lösung
Danke! Jetzt bin ich unabhängig und kann an meinem Projekt weiter!

Wünsche dir ein schönes Wochenende - bei uns schneit es gerade.
Hallo Günter,

wie sieht es denn damit aus?

Option Explicit

Sub CSV_Datei_einlesen_Uwe_2()
 Dim strDatei As String
 strDatei = Application.GetOpenFilename("CSV-Dateien (*.csv), *.csv")
 If Not CVar(strDatei) = False Then
   Application.ScreenUpdating = False
   With Workbooks.Open(Filename:=strDatei, Local:=True)
     .Sheets(1).Cells.Copy ThisWorkbook.Sheets("Konvert").Cells(1)
     .Close False
   End With
   Application.ScreenUpdating = True
 End If
End Sub

Gruß Uwe
Seiten: 1 2 3 4 5