unkwownuser
Goto Top

VBS - in vorhandenes Workbook schreiben?

Hallo liebes administrator.de Forum,

ich habe eine technische Frage, ob mein Vorhaben so funktioniert und wie man es am besten realisiert
Es geht darum, dass wenn Excel bereit geöffnet ist, das VBScript in die vorhande Mappe schreibt, andernfalls soll Excel über das Script gestartet werden.


Gruß,
unkwownuser

Content-Key: 128081

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

Printed on: May 4, 2024 at 19:05 o'clock

Member: H41mSh1C0R
H41mSh1C0R Oct 28, 2009 at 09:32:38 (UTC)
Goto Top
Hi,

Ja das geht. =)

Mehr bekomm ich aus meiner Glaskugel nicht an Information. ^^

Realisierung:

Stichwort: ActiveWindow

Für den Fall das Excel nicht offen ist.

Set oExcel = CreateObject("Excel.Application")  
oExcel.visible = true
Set oWbk = oExcel.Workbooks.Open (fname, false, true)

Das passende Excelfile eintragen --> *freu*

Gruß
Mitglied: 76109
76109 Oct 28, 2009 at 12:02:51 (UTC)
Goto Top
Hallo unkwownuser!

Ja, das ist technisch möglich, aber nicht unbedingt sinnvoll, da ja mehrere Arbeitsmappen geöffnet sein können.....

In diesem Beispiel, wird mit Hilfe der Shell-Funktion ein Excel-Fenster aktiviert, sofern Excel geöffnet ist. Der Shell-Rückgabewert Result gibt an: Excel geöffnet True/False

Dim Shell, Result

Set Shell = WScript.CreateObject("WScript.Shell")  

Result = Shell.AppActivate("Microsoft Excel")  

If Result = True Then
    MsgBox "Excel ist geöffnet"    
Else
    MsgBox "Excel ist nicht geöffnet"   
End if

Gruß Dieter
Member: unkwownuser
unkwownuser Oct 28, 2009 at 12:21:07 (UTC)
Goto Top
Hallo Dieter, hallo H41mSh1C0R,

zu H41mSh1C0R:
Den Code, falls Excel nicht geöffnet ist, habe ich schon. Mir geht es nur darum, wie ich das realisiere.
zu Dieter:
Ich stelle mir das anders vor. Das Script überprüft ist Excel geöffnet. Wenn ja, schreibe in die geöffnete Arbeitsmappe. Ich trenne das dann mit Offset's.
Wenn Excel nicht geöffnet ist, macht er die Standardprozedur.


Gruß,
unkwownuser
Mitglied: 76109
76109 Oct 28, 2009 at 12:39:40 (UTC)
Goto Top
Hallo unkwownuser!

Ich verstehe leider nicht ganz was Du meinst? Vielleicht so was:
Dim Excel, Shell, Result, Wks

Set Shell = WScript.CreateObject("WScript.Shell")  

Result = Shell.AppActivate("Microsoft Excel")  

Set Excel = CreateObject("Excel.Application")  

If Result = True Then
    Set Wks = Excel.ActiveSheet 
Else
    Excel.Workbooks.Add:  Excel.Visible = True
    Set Wks = Excel.ActiveSheet 
End if

Gruß Dieter
Member: unkwownuser
unkwownuser Oct 28, 2009 at 14:37:56 (UTC)
Goto Top
Hallo Dieter,

der Code sieht ja mal nicht schlecht aus.
Nochmal ein kurzes Beispiel.
Man hat ein VBScript, das Texte schreibt, Styles definiert usw.
Jetzt kommt der Knackpunkt. Wenn Excel bereits geöffnet ist, soll er das VBScript in der geöffneten Arbeitsmappe ausführen.
Wenn Excel nicht gestartet ist, soll er Excel starten und das VBScript ausführen.


Gruß,
unkwownuser
Mitglied: 76109
76109 Oct 28, 2009 at 14:55:46 (UTC)
Goto Top
Hallo unkwownuser!

Eigentlich ist das doch genau das, was meine Codebeispiele darstellen. Oder stehe ich irgendwie auf ner Leitung? face-smile

Gruß Dieter
Member: unkwownuser
unkwownuser Oct 28, 2009 at 15:13:45 (UTC)
Goto Top
Hallo Dieter,

soweit schon, ich stand gerade aufm Schlauch face-smile
Ich habe mal einen Test gemacht. Aber irgendwo hängt es noch.

Set Shell = WScript.CreateObject("WScript.Shell")  
Result = Shell.AppActivate("Microsoft Excel")  
Set xExcel = CreateObject("Excel.Application")  

If Result = True Then
	Set ActiveWorkbook = xExcel.ActiveSheet
	Sub setValue(ByRef ColumnNumber, ByRef RowNumber, ByRef Value)
		xExcel.ActiveWorkbook.ActiveSheet.Cells(RowNumber, ColumnNumber) = value
	End Sub
Else
	xExcel.Workbooks.Add
	xExcel.Visible = True
	Set ActiveWorkbook = xExcel.ActiveSheet
	Sub setValue(ByRef ColumnNumber, ByRef RowNumber, ByRef Value)
		xExcel.ActiveWorkbook.ActiveSheet.Cells(RowNumber, ColumnNumber) = value
	End Sub
End If

Call setValue(3, 3, "Test")  


Gruß,
unkwownuser
Mitglied: 76109
76109 Oct 28, 2009 at 16:29:34 (UTC)
Goto Top
Hallo unknownuser!

War zu schnell, muss erst noch was ausprobierenface-smile

Gruß Dieter
Mitglied: 76109
76109 Oct 28, 2009 at 18:04:04 (UTC)
Goto Top
Hallo unknownuser!

Also, stand ich wohl doch auf der Leitungface-smile

Sorry, der Teil mit dem bereits geöffnetten Workbook funktioniert nicht und bis jetzt habe ich noch keinen Weg gefunden, das Object zu selectieren???.

Auch nach zahlreichen Versuchen, war es mir nicht möglich, auf die geöffnette Arbeitsmappe im aktiven Fenster zuzugreifen.

Einfacher wäre es, wenn die offene Datei schon mal gespeichert war und bereits einen Dateinamen hat. Mit neuer Mappe geht es offensichtlich nicht.face-sad

Gruß Dieter
Member: unkwownuser
unkwownuser Oct 29, 2009 at 07:23:12 (UTC)
Goto Top
Hallo Dieter,

dann ist das Vorhaben, wohl doch nicht möglich.
Aber die Hoffnung stirbt zuletzt.
Ich danke dir für die Unterstützung.


Gruß,
unkwownuser
Member: unkwownuser
unkwownuser Oct 29, 2009 at 14:31:44 (UTC)
Goto Top
Hallo Dieter,

ich glaube die Lösung zu haben.

Set Shell = WScript.CreateObject("WScript.Shell")  
Result = Shell.AppActivate("Microsoft Excel")  

If Result = True Then
	Set xExcel = GetObject(, "Excel.Application")  
	Set ActiveWorkbook = xExcel.ActiveSheet
	Sub setValue(ByRef ColumnNumber, ByRef RowNumber, ByRef Value)
		xExcel.ActiveWorkbook.ActiveSheet.Cells(RowNumber, ColumnNumber) = value
	End Sub
Else
	Set xExcel = CreateObject("Excel.Application")  
	xExcel.Workbooks.Add
	xExcel.Visible = True
	Set ActiveWorkbook = xExcel.ActiveSheet
	Sub setValue(ByRef ColumnNumber, ByRef RowNumber, ByRef Value)
		xExcel.ActiveWorkbook.ActiveSheet.Cells(RowNumber, ColumnNumber) = value
	End Sub
End If

Call setValue(3, 3, "Test")  


Gruß,
unkwownuser
Mitglied: 76109
76109 Oct 29, 2009 at 15:48:04 (UTC)
Goto Top
Hallo unknownuser!

Toll, Spitzenleistungface-smile

Diese Konstellation hatte ich so ähnlich versucht. Mit dem Komma gab's dann aber Probleme z.B. GetObject("",...)...

Die Sub muss nicht in die If-Schleife. Das jeweile ActiveWorkbook.ActiveSheet wird in beiden Fällen durch die Variable Wks repräsentiert.

Und noch eine Anmwerkung zu ByRef. Das macht nur Sinn, wenn es sich um Objecte, Datei-Strings oder Strings handelt. Verwende bei Zahlenwerten ByVal.

Set Shell = WScript.CreateObject("WScript.Shell")  
Result = Shell.AppActivate("Microsoft Excel")  

If Result = True Then
	Set xExcel = GetObject(, "Excel.Application")  
	Set Wks = xExcel.ActiveWorkbook.ActiveSheet
Else
	Set xExcel = CreateObject("Excel.Application")  
	xExcel.Workbooks.Add
	xExcel.Visible = True
	Set Wks = xExcel.ActiveWorkbook.ActiveSheet
End If

Call setValue(3, 3, "Test")  

Sub setValue(ByVal ColumnNumber, ByVal RowNumber, ByRef Value)
    Wks.Cells(RowNumber, ColumnNumber) = value
End Sub

Weiter soface-smile

Gruß Dieter