VisualBasic CSV-Datei einlesen über Makro

little-key

Cadet 2nd Year
Registriert
Jan. 2009
Beiträge
28
Mal ein ganz anderes Problem:

Eine Excel-Tabelle öffnet über ein Makro ein Fenster zur Auswahl

Private Sub Workbook_Open()
Pfad = "U:\Grosser\WWG\WWG_WSTA"
Shell "Explorer.exe " & Pfad, vbNormalFocus
End Sub

und dort befindet sich eine csv-Datei (Komma getrennt).

In dieser Date befinden sich unter anderm Nummern und Texte die auch so in Spalten angezeigt werden.
Eine Spalte ist eine Preisspalte (z.B. 3.35). Diese Zahlen werden grundsätzlich als Datum formatiert.
Ich habe schon alles versucht, aber keine Möglichkeit gefunden diese als Zahl (Preis) zu importieren/öffnen.

Kennt jemand eine Möglichkeit, Makrogesteuert?

Hier mal die Datei zum downloaden und ansehen/ausprobieren:

http://www.x5forum.home-wiekau.de/x5help/csv.zip

Gruß Mario
 
Also folgendes: Das hier ist eine Zeile deiner CSV Datei:

AN BLEIE, -SORTIMENTE, FUTTERKÖRBCHEN;EXO360020;Kugelblei 20g;U:\Projekte\Websites\_Grosser\Cart\EXO360020.jpg;Feb 91

Wo befinden sich da bitte Preise?
 
achso ging nur ums parsen des preises? ^^

willst du es in excel als preis darstellen, oder was meinst du damit?
denn in den speicher wird das sicherlich als string importiert ;)


Worksheets("Tabelle1").Range("A1:A5").NumberFormat = "#,##0.00 [$" & EUR & "]"
 
Zuletzt bearbeitet:
@ toeffi: er schrieb doch, dass Preise immer als Datum formatiert werden: ;Feb 91

@ little-key: in deiner CSV stehen die Preise noch normal und beim Importieren wird daraus ein Datum?

Dann hast du vermutlich als Dezimaltrennzeichen einen Punkt und kein Komma? Das müsstest du in den Optionen umstellen.
 

Anhänge

  • excel_dezimaltrennzeichen.jpg
    excel_dezimaltrennzeichen.jpg
    88,7 KB · Aufrufe: 425
Ich zitiere:
little-key schrieb:
Eine Spalte ist eine Preisspalte (z.B. 3.35). Diese Zahlen werden grundsätzlich als Datum formatiert.
Ergo: Feb 91 ist ein Preis welcher fälschlicherweise im Datumsformat angezeigt wird.
 
Naja wenn ich mir die CSV anschaue, dann hat er da ja überall sachen wie Feb, Apr,usw drinne, dann brauch er sich ja nich wundern wenn das als Datum formatiert wird.
Er kann ja auch einfach die Spalte nach dem Import neu formatieren.
 
Schreib mal in die CSV, dort wo aktuell das Datum steht, Komma getrennte Preise rein und importiere das. Dann siehst du das Problem. Und nachträglich formatieren geht nicht, weil aus einem Datum i.d.R. eine fünfstellige Zahl wird.
 
Probiers mal damit:
Code:
Private Sub Workbook_Open()

Dim sLwBuchstb As String
Dim sPfad As String
Dim sDatei As String

sLwBuchstb = "U"                [COLOR="Green"]' Laufwerksbuchstabe[/COLOR]
sPfad = "Grosser\WWG\WWG_WSTA"  [COLOR="green"]' Pfad zur CSV-Datei[/COLOR]
ChDrive sLwBuchstb              [COLOR="green"]' Wechselt auf Laufwerk sLwBuchstb[/COLOR]
ChDir sPfad                     [COLOR="green"]' Wechselt in Verzeichnis sPfad[/COLOR]
sDatei = Application.GetOpenFilename("CSV (*.csv), *.csv") [COLOR="green"]' Datei-Öffnen-Dialog für CSV-Dateien[/COLOR]

[COLOR="green"]' Datei importieren[/COLOR]
With ActiveSheet.QueryTables.Add(Connection:="TEXT;" & sDatei, Destination:=Range("A1"))
    .Name = sDatei
    .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
    .TextFileSemicolonDelimiter = True [COLOR="green"]' Strichpunkt als Spalten-Trennzeichen[/COLOR]
    .TextFileColumnDataTypes = Array(1)
    .TextFileDecimalSeparator = "."    [COLOR="green"]' Punkt als Dezimaltrennzeichen (Standard Komma)[/COLOR]
    .TextFileThousandsSeparator = ","  [COLOR="green"]' Komma für Tausendergruppierung  (Standard Punkt)[/COLOR]
    .TextFileTrailingMinusNumbers = True
    .Refresh BackgroundQuery:=False
End With

[COLOR="Green"]' Datenverbindung zur csv-Datei löschen[/COLOR]
Application.DisplayAlerts = False ' Hinweise (zum Löschen) deaktivieren
lngCounter = InStrRev(sDatei, "\") + 1
strName = Mid(sDatei, lngCounter) ' Dateiname ohne Pfad
ActiveWorkbook.Connections(Mid(strName, 1, (Len(strName) - 4))).Delete
Application.DisplayAlerts = True ' Hinweise wieder aktivieren

End Sub
 
Zuletzt bearbeitet:
Hey, das funktioniert ja sogar "fast" perfekt.

Du bist ja echt Spitze.

Eine Fehlermeldung kommt noch:

Laufzeitfehler 438
Objekt unterstützt diese Eigenschaft oder Methode nicht.

Debuggen:
ActiveWorkbook.Connections(Mid(strName, 1, (Len(strName) - 4))).Delete


Mario
 
Ersetze in der Zeile
ActiveWorkbook.Connections(Mid(strName, 1, (Len(strName) - 4))).Delete​
mal den rot markierten Teil durch den Dateinamen in Anführungszeichen (ohne Pfad und ohne '.' und Dateiendung). Also
ActiveWorkbook.Connections("Dateiname").Delete​


Nur um zu sehen, ob es grundsätzlich funktioniert.

Du kannst dann mal im VBA-Editor mit F8 durch das Makro gehen, bis du an die fehlerhafte Stelle kommst und im Lokal-Fenster (Ansicht | Lokal-Fenster) schauen, was dort bei lngCounter und strName steht. Letzteres sollte der Dateiname mit Endung sein; lngCounter die Anzahl Zeichen des Pfades (ohne Dateiname).
makro.jpg

Welche Excel-Version nutzt du?
 
Also gemacht und bleibt an der gleichen Stelle hängen (Auch mit Dateinamen).

Ein Unterschied: Bei IngCounter steht bei mir 25

Was ich noch vergessen habe, falls wichtig: Ich benutze noch Excel 2002.
 
Zuletzt bearbeitet:
Das er hängen bleibt ist klar - ist ja das gleiche Makro :)

lngCounter ist wie gesagt die Zeichenanzahl des Pfades - ich hab da bei mir einen anderen zum Testen als du, also ist das ok.

Wichtig ist, das in strName der Dateiname steht.

Dann gibts zwei Möglichkeiten.

  1. Der Befehl zum Löschen der Verbindung heißt in Excel 2002 anders (also nicht ActiveWorkbook.Connections(...).Delete.

    Den richtigen Befehl könntest du aber rausfinden.

    Importiere dazu deine csv-Datei (irgendwo über das Menü Daten; Einstellungen bzgl. Trennzeichen usw sind egal). Dann startest du den Makrorekorder und löscht die Datenverbindung, die durch den Import erstellt wurde (sollte sich auch im Daten-Menü finden lassen). Danach die Aufzeichnung stoppen.


    Im VBA-Editor findest du dann das aufgezeichnete Makro und da sollte dann der richtige Befehl zum Löschen der Datenverbindung auftauchen.

  2. Es gibt gar keine Datenverbindung, deswegen kann sie auch nicht gelöscht werden - dann könntest du den ganzen letzten Code-Abschnitt auch entfernen.
 
Zuletzt bearbeitet:
Zurück
Oben