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-Key: 4504459639

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

Printed on: May 24, 2024 at 20:05 o'clock

Mitglied: 4400667902
4400667902 Nov 04, 2022 updated at 12:25:01 (UTC)
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.
Member: Fat.Mike
Fat.Mike Nov 04, 2022 at 14:50:07 (UTC)
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?
Mitglied: 4400667902
4400667902 Nov 04, 2022 updated at 15:19:54 (UTC)
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.
Member: Fat.Mike
Fat.Mike Nov 07, 2022 at 12:24:45 (UTC)
Goto Top
Hallo ukulele,

danke für deine Tipps.
Member: Fat.Mike
Fat.Mike Nov 07, 2022 at 13:43:55 (UTC)
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.
Mitglied: 4400667902
4400667902 Nov 07, 2022 updated at 14:28:20 (UTC)
Goto Top
Genau das macht der erste Code oben ja
Member: TK1987
TK1987 Nov 08, 2022 updated at 15:32:34 (UTC)
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
Member: Fat.Mike
Fat.Mike Nov 11, 2022 at 09:00:44 (UTC)
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
Member: TK1987
Solution TK1987 Nov 11, 2022 updated at 10:07:53 (UTC)
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