3.5k Aufrufe
Gefragt in Tabellenkalkulation von fedjo Experte (2.2k Punkte)
Hallo Excelfreunde,
wie bringe ich eine geöffnete Excel- Datei mit VBS in den Vordergrund?

Mit Set xlApp = GetObject(, "Excel.Application")
xlApp.visible = True
kommt die Datei nicht in den Vordergrund.

Vielleicht habt ihr eine Lösung.
Gruß
fedjo

16 Antworten

0 Punkte
Beantwortet von
Hallo Fedjo,

also bei mir klappt das auch schon durch xlApp.visible = True. Warum
das bei dir nicht funktioniert, weiß ich nicht. Um aber wirklich darauf
zugreifen zu können brauchst du noch die Zeilen

hWnd = FindWindow("XLMain", 0)
SendMessage(hWnd, 1042, 0, 0)

Damit weist du Windows an, das Excel-Fenster (und hier liegt die
Betonung auf Fenster) für den Zugriff von extern freizugeben.

Schau auch mal hier nach.
Der Teil ist zwar für VB-Express geschrieben, sodass hier auf das
Schlüsselwort Set beim zuweisen von Workbook und Worksheet
verzichtet werden musste, aber sonst ist der Code auch in anderen VB-
Programmen verwendbar.

Gruß Mr. K.
0 Punkte
Beantwortet von
Ach so ja,

wie du in dem Thread siehst sind die Funktionen FindWindow und
SendMessage Windows-API-Funktionen die ganz oben im Modul vor
der ersten Sub deklariert werden müssen

Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal
lpClassName As String, ByVal lpWindowName As Long) As Long
Declare Function SendMessage Lib "user32" Alias "SendMessageA"
(ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long,
ByVal lParam As Long) As Long
0 Punkte
Beantwortet von
...und die eigentliche Frage hab ich mal wieder nicht beantwortet :-(

um die Datei in den Vordergrund zu bekommen, brauchst du die Zeile

xlApp.Workbooks("MeineDatei.xlsx").Activate

So. Jetzt sollte meine Antwort aber vollständig sein.

Nochmal Grüße
Mr. K.
0 Punkte
Beantwortet von fedjo Experte (2.2k Punkte)
Hallo Mr. K.,
Danke für die schnelle Antwort.
Funktioniert bei mir so nicht, wollte nur eine einfache Lösung, wo
die Excel Datei in den Vordergrund kommt und auf eine Zelle zugreifen kann. (Windows10, Excel2007)

Versuch:
Set xlApp = GetObject(, "Excel.Application")
xlApp.visible = True
xlApp.Workbooks("MA2016.xlsm").Activate
hWnd = FindWindow("XLMain", 0)
SendMessage(hWnd, 1042, 0, 0)

Fehler:
Zeile 5
Zeichen 30
Beim Aufrufen einer Unterroutine (Sub)
dürfen keine Klammern verwendet werden.
Code:800A0414
Quelle:Kompilierungsfehler in
Microsoft VBScript

Gruß
fedjo
0 Punkte
Beantwortet von
Tja, von welchem Programm aus, willst du denn auf Excel
zugreifen?

solltest du deinen Code innerhalb von Excel ausführen, brauchst du
das alles nicht. Dann reicht nur Workbooks("MA2016.xlsm").Activate

die Api-Funktionen solltest du am besten direkt nach GetObject
einsetzen. Also so:

Set xlApp = GetObject(, "Excel.Application")
hWnd = FindWindow("XLMain", 0)
SendMessage(hWnd, 1042, 0, 0)
xlApp.visible = True
xlApp.Workbooks("MA2016.xlsm").Activate

Was deinen Fehler angeht, bin ich etwas ratlos, da das (mal wieder)
bei mir einwandfrei funktioniert. Probier aber mal als Alternative:
SendMessage hWnd, 1042, 0, 0
oder
x = SendMessage(hWnd, 1042, 0, 0)
Vielleicht reicht das schon aus.

Mr. K.
0 Punkte
Beantwortet von fedjo Experte (2.2k Punkte)
Von SAP eine Copy und in Excel einfügen und wieder SAP Fenster anzeigen.

Bei deinen Vorschlägen habe ähnliche Fehlermeldungen.

fedjo
0 Punkte
Beantwortet von
Welche SAP-Version? R2 / R3 / R4 / R5 / R6 oder vielleicht B1? Im
Normalfall bietet SAP in allen Versionen bereits einen Excel-Export
jedweder Liste von Haus aus an. Schon mal deinen SAP-Berater
kontaktiert?

Leider weiß ich nicht, ob man im SAP überhaupt Windows-API
Funktionen verwenden kann. Wie lautet denn die Fehlermeldung bei
den Alternativen?

und wie öffnest du die ExcelDatei (bzw. Dateien) eigentlich? Ich war die
ganze Zeit davon ausgegangen, dass Excel bereits offen ist und du nur
mal eben was rüberschieben willst. Oder hast du vielleicht sogar
mehrere Instanzen offen? Das kann zu Problemen führen. In diesem
Fall greift SendMessage leider nur auf die zuerst geöffnete Instanz von
Excel zu. Zwar gibt es auch Möglichkeiten auf die anderen Instanzen zu
gelangen , das ist aber hochkompliziert und nur für absolute Profis
verständlich.
0 Punkte
Beantwortet von
und nur für absolute Profis verständlich.

Sollte heißen, darauf näher einzugehen, würde den Thread unnötig
lang werden lassen, da hierzu eine Menge Befehle nötig sind, die in
einem separaten Thread besser aufgehoben wären.

Vielleicht muss man die Windows-API-Funktionen im SAP ja doch nicht
ganz oben sondern an gänzlich anderer Stelle deklarieren. Wie gesagt,
da kenne ich mich nicht aus. Ich weiß nur, dass der Zugriff von Visual
Basic Express und von anderen Office-Anwendungen (wie Word, oder
Access) auf diese Weise funktioniert.

Eine andere Möglichkeit könnte auch die verwendete Windows-Version
sein. Ich weiß z.B. nicht, ob es in Windows 10 noch die User32.dll gibt,
wo all diese tollen Funktionen drin stecken. Wenn das jemand weiß,
bitte melden.
0 Punkte
Beantwortet von fedjo Experte (2.2k Punkte)
Die SAP-Version ist hier nicht wichtig, da von SAP ja nur ein Text mit
Strg+C kopiert wird, und dann die Excel Datei in Vordergrund gebracht werden sollte, ein Makro sollte dann den Eintrag übernehmen und dann die SAP Seite wieder anzeigen.

Sollte eigentlich nicht so kompliziert werden.
0 Punkte
Beantwortet von
ist es eigentlich auch nicht. Allerdings musst du den Code, der die
Excel-Datei in den Vordergrund bringen und den kopierten Wert dort
einfügen soll ja irgendwo hinterlegen. Ich war davon ausgegangen,
dass du das im SAP machst. Denn Excel weiß ja nicht, dass es sich
angesprochen fühlen muss, wenn du im SAP STRG+C drückst. Wie
genau man aber im SAP eine benutzerdefinierte Programmierung
macht, weiß ich aber eben nicht, da hab ich bei unserem SAP keine
Zugriffsrechte drauf und werde die auch nicht bekommen.

Daher nochmal die Frage. Liegt es nur am SendMessage oder
funktinoierten die Windows-API-Funktionen allgemein bei dir nicht?
Welcher Fehler kommt bei den von mir vorgeschlagenen Varianten?
...