VBA Werte aus anderer Arbeitsmappe beziehen
#31
Hi Uwe,

ich glaube den Fehler gefunden zu haben. Die Datei die ich einlesen möchte ist eine CSV Datei und deshalb die Typenunverträglichkeit.

Gruß Ole
Antworten Top
#32
Hallo Ole,

Naja, nach 31 Beiträgen stellt sich heraus, dass es sich um eine CSV Datei handelt.
Diese CSV muss natürlich mit PQ importiert + verarbeitet werden oder per VBA als Textdatei via ADODB.Stream unter Beachtung UTF-8 oder UTF-16 Format gelesen und ins Array geschrieben werden.

Gruß Uwe
Antworten Top
#33
Zitat:Naja, nach 31 Beiträgen stellt sich heraus, dass es sich um eine CSV Datei handelt.

Dann spricht ja noch mehr dafür, es vollständig mit PQ zu machen, wobei unter diesen Voraussetzungen meine Lösung wohl auch etwas angepasst werden muss.
Antworten Top
#34
Hi Uwe,

sorry dass ich nicht auf die Datei-Endung geachtet habe.
Ich habe jetzt einmal beide Beispieldateien hochgeladen, da ich den Fehler einfach nicht weg bekommen.
Wie kann ich denn die CSV Datei über VBA einbinden?

Ich habe die eine Datei auch als xlsx gespeichert, aber das Array will und will sich nicht füllen.


Gruß Ole


Angehängte Dateien
.csv   Prognose KW 16.csv (Größe: 350,78 KB / Downloads: 4)
.xlsb   Vergleich FC-Prognose-HC-Diff April 2025 Test.xlsb (Größe: 919,92 KB / Downloads: 4)
Antworten Top
#35
Hi ws53,

mit PQ kenne ich mich leider nicht aus.

Sorry und beste Grüße
Ole
Antworten Top
#36
Hallo
Einfacher geht es wohl kaum eine csv mit PQ einzulesen. 
Diesen Teil entsprechend ändern wo die csv gespeichert ist:  "G:\Prognose KW 16.csv"
PHP-Code:
let in
    Table
.TransformColumnTypes(Table.PromoteHeaders(Csv.Document(File.Contents("G:\Prognose KW 16.csv"),[Delimiter=";"Columns=6
    Encoding=1252QuoteStyle=QuoteStyle.None]), [PromoteAllScalars=true]), List.Transform({0..Table.ColumnCount(Table.PromoteHeaders(
    Csv.Document(File.Contents("G:\Prognose KW 16.csv"),[Delimiter=";"Columns=6Encoding=1252QuoteStyle=QuoteStyle.None]), 
    [PromoteAllScalars=true])) - 1},each if 0 then {Table.ColumnNames(Table.PromoteHeaders(Csv.Document(File.Contents(
    "G:\Prognose KW 16.csv"),[Delimiter=";"Columns=6Encoding=1252QuoteStyle=QuoteStyle.None]), [PromoteAllScalars=true])){_}, 
    Int64.Type} else if 1 then {Table.ColumnNames(Table.PromoteHeaders(Csv.Document(File.Contents("G:\Prognose KW 16.csv"),
    [Delimiter=";"Columns=6Encoding=1252QuoteStyle=QuoteStyle.None]), [PromoteAllScalars=true])){_}, type time} else 
    {Table.ColumnNames(Table.PromoteHeaders(Csv.Document(File.Contents("G:\Prognose KW 16.csv"),[Delimiter=";"Columns=6
    Encoding=1252QuoteStyle=QuoteStyle.None]), [PromoteAllScalars=true])){_}, type text})) 
Viele Grüße
PIVPQ
Antworten Top
#37
Hallo PIVPQ,

ich danke dir für deine Hilfe, doch weiß ich nicht, wo ich diesen Code einbinden kann.

Sorry, aber trotzdem Danke!
Antworten Top
#38
Hallo Ole,
 
anbei die Änderungen.

.xlsb   Vergleich FC-Prognose-HC-Diff April 2025 Test.xlsb (Größe: 922,25 KB / Downloads: 3)
 
Trotzdem beschäftige dich mit PQ.
Es ist sehr gutes OnBoard Mittel zum Importieren und viel viel mehr.
 
Gruß Uwe
Antworten Top
#39
Hallo Ole,

ich habe grad gesehen, dass ich vergessen hatte die Textwerte in A und B in echtes Datum umzuwandeln, damit der Vergleich auch sauber funktioniert.
Tausche diese Prozedur aus:
Code:
Sub CSVLadenInArray()
    Dim ZeileAusImport$, row_number&, i&, iSp&
    Dim objStream As Object
    Dim ZeilenNummer
    DateiName = Tabelle10.Range("A52") & Tabelle10.Range("A51")
    Set objStream = CreateObject("ADODB.Stream")
    With objStream
        .Charset = "utf-8"
        .Open
        If DateiName = "" Then DateiOeffnen
        If Dir(DateiName) <> "" Then
            .LoadFromFile (DateiName)
        Else
            DateiOeffnen
            If DateiName = "Falsch" Then Exit Sub
            .LoadFromFile (DateiName)
        End If
        .LineSeparator = 10
    End With
    row_number = 1
   
    Do Until objStream.EOS
        ZeileAusImport = objStream.ReadText(-2)
        ZeilenNummer = Split(ZeileAusImport, ";")
        If iSp < UBound(ZeilenNummer) Then iSp = UBound(ZeilenNummer)
        row_number = row_number + 1
    Loop
    Set objStream = Nothing
    ReDim arr(1 To row_number - 1, 1 To iSp + 1)
   
    Set objStream = CreateObject("ADODB.Stream")
    With objStream
        .Charset = "utf-8"
        .Open
        If DateiName = "" Then DateiOeffnen
        If Dir(DateiName) <> "" Then
            .LoadFromFile (DateiName)
        Else
            DateiOeffnen
            If DateiName = "Falsch" Then Exit Sub
            .LoadFromFile (DateiName)
        End If
        .LineSeparator = 10
    End With
    row_number = 1
   
    Do Until objStream.EOS
        ZeileAusImport = objStream.ReadText(-2)
        ZeilenNummer = Split(ZeileAusImport, ";")
        If row_number = 1 Then  ' 1. Zeile auslassen
        Else
            For i = 0 To UBound(ZeilenNummer)
                If i > 1 Then
                    arr(row_number - 1, i + 1) = Replace(ZeilenNummer(i), """", "", 1, 10)  ' mit 1. Zeile: arr(row_number, i + 1)
                Else
                    arr(row_number - 1, i + 1) = CDate(Replace(ZeilenNummer(i), """", "", 1, 10))
                End If
            Next i
        End If
        row_number = row_number + 1
    Loop
    Set objStream = Nothing
    DatenAuslesen
End Sub

Gruß Uwe
Antworten Top
#40
Moin Uwe,

ganz, ganz recht herzlichen Dank. Durch diese Änderung hat er auch nicht mehr die Mitteilung gebracht, dass für das Datum aktuell keine Daten vorliegen.

Danke das du dir für mich die ganze Zeit genommen hast und ja, ich werde mich definitiv um PowerQuery kümmern, da es wirklich die Arbeit erleichtert.

Ganz herzliche Grüße von
Ole

18
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste