fat.mike
Goto Top

Excel-Datei mit Powershell oder VBA auslesen und in einer anderen Excel-Datei schreiben

Hallo zusammen,

ich habe ein kleines Problem wo ich einfach nicht weiterkomme. Es gibt im Netz genügend Beispiele aber ich habe es bis jetzt nicht so hinbekommen, dass es für mich praktisch wäre.

Ich habe zwei Excel-Dateien A und B und ich müsste von A Dateien aus einem bestimmten Bereich auslesen,deren Zeilenanzahl aber variabel ist und diese Werte in der Excel-Datei B schreiben.

Also ich suche einen Wert z.B 2021 aus der Spalte A,B und C aber nur bis 2021 und nicht weiter. Da komme ich mit dem
Range Befehl nicht weiter, da sich die Zeilenanzahl immer wieder mal ändert.

2021 ULM OTTO
2021 ULM OTTO
2021 ULM OTTO
2021 ULM OTTO
2021 ULM OTTO
2021 ULM OTTO
2021 ULM OTTO
2021 ULM OTTO
2022 ULM OTTO
2022 ULM OTTO
2022 ULM OTTO


ich bräuchte wohl eine Schleife und ein Array dafür......
Vielleicht hat ja jemand eine Idee wie man das Umsetzen könnte
danke euch

Content-ID: 4504459639

Url: https://administrator.de/contentid/4504459639

Ausgedruckt am: 24.11.2024 um 22:11 Uhr

4400667902
4400667902 04.11.2022 aktualisiert um 13:25:01 Uhr
Goto Top
Moin.
bsp. mit VBA im ersten Workbook
Sub Gefiltert_kopiert()
    Dim otherWorkbook As Workbook
    Set otherWorkbook = Workbooks.Open("C:\daten\Mappe2.xlsx")  
    Application.ScreenUpdating = False
    With ThisWorkbook.Sheets(1)
        If .AutoFilterMode = True Then .AutoFilterMode = False
        With .UsedRange
            .AutoFilter 1, "2021"  
            .Offset(1, 0).SpecialCells(xlCellTypeVisible).Copy Destination:=otherWorkbook.Sheets(1).Cells(Rows.Count, "A").End(xlUp).Offset(1, 0)  
        End With
        .AutoFilterMode = False
    End With
    otherWorkbook.Close True
    Application.ScreenUpdating = True
End Sub

Oder Quell CSV

screenshot

und Powershell
Import-CSV "D:\data\quelle.csv" -Delimiter ";" | ?{$_.Jahr -eq '2021'} | export-csv "D:\data\ziel.csv" -Delimiter ";" -NoTypeinformation -Encoding UTF8  
uk.
Fat.Mike
Fat.Mike 04.11.2022 um 15:50:07 Uhr
Goto Top
Hi,

danke für den Tipp. Ich werde es Mal mit VBA testen. Kann ich das Powershell Script auch als Excel import verwenden?
4400667902
4400667902 04.11.2022 aktualisiert um 16:19:54 Uhr
Goto Top
Zitat von @Fat.Mike:
Kann ich das Powershell Script auch als Excel import verwenden?
?? Zum Anhängen der Daten an eine bestehende CSV einfach den Parameter -Append von Export-CSV verwenden.
Fat.Mike
Fat.Mike 07.11.2022 um 13:24:45 Uhr
Goto Top
Hallo ukulele,

danke für deine Tipps.
Fat.Mike
Fat.Mike 07.11.2022 um 14:43:55 Uhr
Goto Top
Leider komme ich nicht weiter. Ich versuche mal mein Problem besser zu beschreiben.

Ich versuche mit Powershell bestimmte Werte aus einem Excel-Worksheet zu kopieren und in eine andere Excel-Datei zu schreiben. Wenn meine Zeilen starr sind und sich nicht erweitern, dann klappt das mit ".range" ganz gut
Mein Problem ist immer, dass meine Zeilen (nicht die Spalte) variabel sind und sich permanent ändert.

Beispiel:
Das Worksheet hat eine Spalte A:10 in dem die Werte als Überschrift z.B 1000 angebeben sind.
Ich bräuchte die Werte Werte A:10 bis A:? + die Werte G:10 bis G:? natürlich von der gleichen Zeile usw. und kopiere das in eine andere Excel-Tabelle.
4400667902
4400667902 07.11.2022 aktualisiert um 15:28:20 Uhr
Goto Top
Genau das macht der erste Code oben ja
TK1987
TK1987 08.11.2022 aktualisiert um 16:32:34 Uhr
Goto Top
Moin Mike,

mit Powershell wie folgt:
# Quell- und Zieldatei
$Source = 'C:\Pfad\zur\Quelldatei.xlsx'  
$Target = 'C:\Pfad\zur\Ausgabedatei.xlsx'  

# Excel öffnen
$XL = New-Object -ComObject Excel.Application

# Interaktive Meldungen deaktivieren
$XL.DisplayAlerts = $false

# Mappen öffnen
$SourceBook = $XL.Workbooks.Open($Source,0,$true)
$TargetBook = $XL.Workbooks.Add()

# Zeilen, bei denen SpalteA=2021
$Rows = $SourceBook.ActiveSheet.UsedRange.Rows | Where-Object {$_.Columns["A"].Value2 -eq "2021"}  

# Kopiere Zeilen in Zieldatei
For ($i=1;$i -le $Rows.Count;$i++) { [void]$Rows[$i-1].Copy($TargetBook.ActiveSheet.Rows($i)) }

# Zieldatei speichern
$TargetBook.SaveAs($Target)

# Arbeitsmappen schließen
$SourceBook.Close()
$TargetBook.Close()

# Bereitstellung der Comobjekte aufheben
do {$i = [System.Runtime.InteropServices.Marshal]::ReleaseComObject($XL)} until ($i -le 0)
rv XL,SourceBook,TargetBook,Rows,i

Alternativ kannst du die Zieldatei natürlich auch am geöffnet lassen und einfach mit folgender Zeile Excel sichtbar machen:
$XL.Visible = $true

Gruß Thomas
Fat.Mike
Fat.Mike 11.11.2022 um 10:00:44 Uhr
Goto Top
Hi TK1987,

ja super! das sieht gut aus.
Bei meiner Mappe habe ich mehrere Blätter und jetzt versuch ich ein bestimmtes Blatt auszulesen. Ich dachte das geht mit "$XL.Sheets.Item("Tabelle1") oder WorkSheets.item(2)

Ich verstehe die Syntax nicht ganz....
Vielleicht kennt ja jemand ein gutes Tutoriel für mich
TK1987
Lösung TK1987 11.11.2022 aktualisiert um 11:07:53 Uhr
Goto Top
Moin,

Zitat von @Fat.Mike:
Bei meiner Mappe habe ich mehrere Blätter und jetzt versuch ich ein bestimmtes Blatt auszulesen. Ich dachte das geht mit "$XL.Sheets.Item("Tabelle1") oder WorkSheets.item(2)
das geht so auch, ABER:
Die Variable $XL in meinem Skript ist natürlich erst mal nur das Excel-Programm.

Du willst ein Blatt einer Mappe lesen - also solltest du natürlich besser die Variable der entsprechenden Mappe (in meinem Skript oben z.B. $SourceBook) zu nutzen - sonst hast du bei mehreren geöffneten Mappen ggfs. das Problem, das mehrere Sheets existieren die "Tabelle1" heissen. Meine favorisierte Syntax sieht so aus:
$SourceBook.Worksheets["Tabelle1"]  

Vielleicht kennt ja jemand ein gutes Tutoriel für mich
gibt es haufenweise, z.B.: techexpert.tips/de/powershell-de/powershell-erstellen-einer-excel-tabelle/
Es empfiehlt sich natürlich (wie eigentlich immer in Powershell), das Ganze mal Schritt für Schritt in der Konsole zu machen und dort einfach auch mal ein bisschen rum zu experimentieren, statt es einfach nur als Skript laufen zu lassen.

Gruß Thomas