okidoki
Goto Top

Excel-Inhalte kopieren mtls. bat

Liebe Scripter,

ich würde gerne die Inhalte eines Excel Tabellenblattes mithilfe einer kleinen Batch in eine andere Datei kopieren.
Dabei gibt es viele leere Zellen und einige Kreuze "x".
Leider gelingt mir dies nicht und ich würde gerne wissen, was ich falsch mache:

set "pfad=%~dp0"  
set "script=%pfad%print.vbs"  
set "datei=%pfad%worksheets.xlsx  
set "datei1=%pfad%worksheets1.xlsx  

 >%script%	ECHO Set objXLS = WScript.CreateObject("Excel.Application")  
>>%script%	ECHO objXLS.Workbooks.open %datei%
>>%script%	ECHO objXLS.%datei%("Tabelle1").Range("A1:D4").Copy _ destination:=%datei1%("Tabelle1").Range("A1")  
>>%script%	ECHO objXLS.Quit
"%script%"  
del "%script%"  

Content-ID: 1898290553

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

Ausgedruckt am: 19.11.2024 um 17:11 Uhr

colinardo
Lösung colinardo 12.02.2022 aktualisiert um 21:32:35 Uhr
Goto Top
Moin.
Arghhh da kommt mir ehrlich gesagt das Mittagessen wieder hoch face-smile. Da ist einiges im Argen von fehlenden Anführunsgzeichen etc. pp ...
@echo off
set "pfad=%~dp0"  
set "script=%pfad%print.vbs"  
set "datei=%pfad%worksheets.xlsx"  
set "datei1=%pfad%worksheets1.xlsx"  

 >%script% (
	echo Set objXLS = CreateObject^("Excel.Application"^)  
	echo objXLS.DisplayAlerts = false
 	echo set wb = objXLS.Workbooks.open^("%datei%"^)  
	echo set wb1 = objXLS.Workbooks.open^("%datei1%"^)  
 	echo wb.Sheets^("Tabelle1"^).Range^("A1:D4"^).Copy wb1.sheets^("Tabelle1"^).Range^("A1"^)  
	echo wb1.Close^(true^)
	echo wb.Close^(false^)
	echo objXLS.DisplayAlerts = true
 	echo objXLS.Quit
        echo set objXLS = Nothing
)

"%script%"  
del "%script%"  
Schreib das doch gleich in ein VBS face-smile.

Grüße Uwe
OKIDOKI
OKIDOKI 12.02.2022 um 19:46:22 Uhr
Goto Top
Moin Uwe,
damit dir nicht auch noch das Abendessen wieder hoch kommt wollte ich mich erst einmal bedanken für deine Mühe, trotz der Einbettung face-smile
Leider gibt es noch das Problem, dass Worksheets1 nicht geschlossen wird, sondern wenn man es anklickt, die Datei nur schreibgeschützt geöffnet werden kann.
Bewirken folgende Befehle, dass beide Dateien geschlossen werden?
	echo wb.Close false
	echo wb1.Close true

Btw: Es ist doch auch notwendig, dass die Dateien noch gespeichert werden, oder?
...
	echo wb.save
	echo wb1.save
...

Ich würde mich sehr freuen, wenn du noch einmal drauf guckst face-smile Und ich habe für deinen Magen noch einen wohltuenden Bonbon ((●'◡'●))
OKIDOKI
OKIDOKI 12.02.2022 aktualisiert um 20:35:53 Uhr
Goto Top
... ich glaube jetzt läuft es:
@echo off
set "pfad=%~dp0"  
set "script=%pfad%print.vbs"  
set "datei=%pfad%worksheets.xlsx"  
set "datei1=%pfad%worksheets1.xlsx"  

 >%script% (
	echo Set objXLS = CreateObject^("Excel.Application"^)  
	echo objXLS.DisplayAlerts = false
 	echo set wb = objXLS.Workbooks.open^("%datei%"^)  
	echo set wb1 = objXLS.Workbooks.open^("%datei1%"^)  
 	echo wb.Sheets^("Tabelle1"^).Range^("A1:C8"^).Copy wb1.sheets^("Tabelle1"^).Range^("A1"^)  
	echo wb1.save
	echo wb1.Close 0
	echo wb.save
	echo wb.Close 0
	echo objXLS.DisplayAlerts = true
	echo set appXLS = Nothing
	echo set obXLS = Nothing
 	echo objXLS.Quit
)

"%script%"  
del "%script%"  

... oder ist noch irgendetwas verquer?
colinardo
Lösung colinardo 12.02.2022 aktualisiert um 21:44:34 Uhr
Goto Top
Es ist doch auch notwendig, dass die Dateien noch gespeichert werden, oder?
Jain, du änderst ja nur das zweite Sheet, also musst du auch nur dieses speichern, das andere nicht, da ändert sich ja nichts, da du dort nur raus kopierst. Das explizite Speichern mit Save kannst du natürlich machen aber das erledigen die Close Befehle auch gleich mit, der Boolean Wert dahinter legt fest ob ja oder nein, bei true wird gespeichert bei false nicht.
https://docs.microsoft.com/de-de/office/vba/api/excel.workbook.close

Klappt hier im Test einwandfei.

echo set appXLS = Nothing
echo set obXLS = Nothing
echo objXLS.Quit
Hier stimmt die Reihenfolge und die Variablennamen nicht,
außerdem musst du das Objekt hinterher leeren nicht vor dem Aufruf einer Methode des selben.
echo objXLS.Quit
echo set objXLS = Nothing
OKIDOKI
OKIDOKI 12.02.2022 um 21:55:52 Uhr
Goto Top
Oh Mann, ja natürlich!
Schlag Hand vor'n Kopf face-smile

Klappt hier jetzt auch einwandfrei - Danke dir!!!
colinardo
colinardo 12.02.2022 um 21:56:50 Uhr
Goto Top
Bidde bidde 👍
holliknolli
holliknolli 14.02.2022 um 00:32:56 Uhr
Goto Top
ist das nicht etwas kompliziert? Ginge das nicht mit VBA einfacher:
https://www.excelcampus.com/vba/copy-paste-another-workbook/
colinardo
colinardo 14.02.2022 aktualisiert um 07:48:25 Uhr
Goto Top
Zitat von @holliknolli:

ist das nicht etwas kompliziert? Ginge das nicht mit VBA einfacher:
https://www.excelcampus.com/vba/copy-paste-another-workbook/

Im Endeffekt ist das ja VBA, der TO will den VBA Quelltext warum auch immer in einer Batch verwursten, ob das für ihn sinnvoll ist muss er dann für sich entscheiden 🤪
OKIDOKI
OKIDOKI 14.02.2022 um 18:54:55 Uhr
Goto Top
... was es alles für Seiten gibt! Danke für den zusätzlichen Link face-smile
Btw: Es existiert bereits eine Batch, in die das eingefügt wird - und wunderbar läuft face-smile face-smile face-smile
denn, dann müsste ich wieder meinen vorhandenen Code in vba umwandeln, was es irgendwie auch nicht einfacher macht, da dieser reibungslos läuft!
Das Problem ist grundsätzlich, wenn man verschiedene Quellen hat, die alle sauber zusammen zu bringen - und vielleicht nicht unbedingt ein Hochleistungs-Programmierer ist ... leider!
Ich beneide euch!!!