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

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

Printed on: April 26, 2024 at 19:04 o'clock

Member: colinardo
Solution colinardo Feb 12, 2022 updated at 20:32:35 (UTC)
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
Member: OKIDOKI
OKIDOKI Feb 12, 2022 at 18:46:22 (UTC)
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 ((●'◡'●))
Member: OKIDOKI
OKIDOKI Feb 12, 2022 updated at 19:35:53 (UTC)
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?
Member: colinardo
Solution colinardo Feb 12, 2022 updated at 20:44:34 (UTC)
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
Member: OKIDOKI
OKIDOKI Feb 12, 2022 at 20:55:52 (UTC)
Goto Top
Oh Mann, ja natürlich!
Schlag Hand vor'n Kopf face-smile

Klappt hier jetzt auch einwandfrei - Danke dir!!!
Member: colinardo
colinardo Feb 12, 2022 at 20:56:50 (UTC)
Goto Top
Bidde bidde 👍
Member: holliknolli
holliknolli Feb 13, 2022 at 23:32:56 (UTC)
Goto Top
ist das nicht etwas kompliziert? Ginge das nicht mit VBA einfacher:
https://www.excelcampus.com/vba/copy-paste-another-workbook/
Member: colinardo
colinardo Feb 14, 2022 updated at 06:48:25 (UTC)
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 🤪
Member: OKIDOKI
OKIDOKI Feb 14, 2022 at 17:54:55 (UTC)
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!!!