2 Fragen zum Dateiaufruf Excel, dringend!

Hallo
habe zwei Fragen zum Aufruf einer Exceldatei mit VB6.

  1. Es kommt am Anfang immer die Frage Makros aktivieren, wie kan ich die Datei mit VB öffnen, damit diese Meldung gleich bestätigt wird, also Makros aktiviert werden.

  2. Die Makroaktivierung brauche ich, weil in der Tabelle ein Programm mit VB Skript eingebettet ist. Nun ist in der Spalte A ein CommandButton den ich starten möchte, er heisst CommandButton2.
    Wie kann ich den Knopf von VB aus starten???

  3. Danach wird das Skript ausgeführt und ist irgendwann fertig.
    Wie weiss ich wann, denn nach Ausführung des Knopfes rennt ja auch mein VB eventuell weiter und will die Tabelle schon wieder schliessen oder die nächste Aktion ausführen.

Wäre für schnelle Hilfe dankbar.

Mfg Werner

Hi Werner,

habe zwei Fragen zum Aufruf einer Exceldatei mit VB6.

Schön, daß es nicht 3 Fragen sind :smile:

  1. Es kommt am Anfang immer die Frage Makros aktivieren, wie
    kan ich die Datei mit VB öffnen, damit diese Meldung gleich
    bestätigt wird, also Makros aktiviert werden.

Ich hatte deine anderen Anfragen so verstanden, daß du eine Exceldatei hast, in der sich VBA-Code befindet, der dann bei Aufruf ein VB-Script startet. Bin grad verwirrt wer da wen öffnet.

  1. Die Makroaktivierung brauche ich, weil in der Tabelle ein
    Programm mit VB Skript eingebettet ist. Nun ist in der Spalte
    A ein CommandButton den ich starten möchte, er heisst
    CommandButton2.
    Wie kann ich den Knopf von VB aus starten???

Also sowas wie:
Application.Sendkeys „klick“ to CommandButton2

Hinter CommanButton2 verbirgt sich doch ein Makro, langt es nicht dieses Makro mit „Run“ zu starten!?

  1. Danach wird das Skript ausgeführt und ist irgendwann
    fertig.
    Wie weiss ich wann, denn nach Ausführung des Knopfes rennt ja
    auch mein VB eventuell weiter und will die Tabelle schon
    wieder schliessen oder die nächste Aktion ausführen.

Irgendwo habe ich einerseits Code der herausfindet wie lange ein externes Programm läuft, andrerseits auch Code der ein Programm startet und wartet bis es fertig ist und dann erst weiterläuft.

Wäre für schnelle Hilfe dankbar.

Sorry, bin erst heute Abend wieder am PC mit Excel und erst am WE wieder am PC mit Internet, kann also dauern :frowning:

Mfg Werner

Gruß
Reinhard

VBA , externe Programme starten, warten bis fertig
Hi Werner,

  1. Die Makroaktivierung brauche ich, weil in der Tabelle ein
    Programm mit VB Skript eingebettet ist. Nun ist in der Spalte
    A ein CommandButton den ich starten möchte, er heisst
    CommandButton2.
    Wie kann ich den Knopf von VB aus starten???

Ich habe mal rumprobiert. Du brauchst den CommanButton2 und eine Scxhaltfläche(Formular) der du das Makro „tt2“ zuweist.
Der Code funktioniert leider nur wenn CommandButton2 nicht aktiviert ist. Wie du u.a. an den auskommentierten Zeilen siehst, klappte kein Versuch den Code zum laufen zu bringen wenn CB2 aktiviert ist. Irgendwie fehlt da ein Befehl: If CommandButton2.HasFocus Then o.ä.
Code in das Dokumentmodul „Tabelle1“ kopieren.

Option Explicit

Private Sub CommandButton1\_Click()

End Sub

Private Sub CommandButton2\_Click()
MsgBox "gedrückt"
End Sub

Sub tt2()
'On Error GoTo Klicken
'Range("A1").Select
'Range("A1").Activate
'MsgBox IsError(CommandButton2.Activate)
On Error Resume Next
'Application.SendKeys "{ESC}"
CommandButton1.Activate
CommandButton2.Activate
 'MsgBox Selection.Address
 'CommandButton2.Activate
'Application.SendKeys "{Eingabe}"
'MsgBox TypeName(Selection)
'CommandButton2.SendKeys " "
'Klicken:
Application.SendKeys " "
End Sub
  1. Danach wird das Skript ausgeführt und ist irgendwann
    fertig.
    Wie weiss ich wann, denn nach Ausführung des Knopfes rennt ja
    auch mein VB eventuell weiter und will die Tabelle schon
    wieder schliessen oder die nächste Aktion ausführen.

Der erste Code startet ein Programm, wartet bis Programm fertig, dann läuft der Code weiter:

Option Explicit
'Quelle -ActiveVB.de
Private Declare Function CloseHandle Lib "kernel32" (ByVal \_
 hObject As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal \_
 dwDesiredAccess As Long, ByVal bInheritHandle As \_
 Long, ByVal dwProcessId As Long) As Long
Private Declare Function GetExitCodeProcess Lib "kernel32" \_
 (ByVal hProcess As Long, lpExitCode As Long) As Long
Private Declare Sub Sleep Lib "kernel32.dll" ( \_
 ByVal dwMilliseconds As Long)
Const STILL\_ACTIVE = &H103
Const PROCESS\_ALL\_ACCESS = &H1F0FFF
Dim TaskID&

Private Function IsActive() As Boolean
Dim Handle&, ExitCode&
Handle = OpenProcess(PROCESS\_ALL\_ACCESS, False, TaskID)
Call GetExitCodeProcess(Handle, ExitCode)
Call CloseHandle(Handle)
IsActive = IIf(ExitCode = STILL\_ACTIVE, True, False)
End Function


Sub start()
TaskID = Shell("notepad.exe", vbNormalFocus)
Do While IsActive
 DoEvents
 Sleep 250
Loop
MsgBox "Anwendung Läuft nicht mehr!"
End Sub

Der zweite Code (von Bernd Held) macht es ähnlich und misst die Zeit des Programmlaufes:

Option Explicit
Declare Function OpenProcess Lib "kernel32" \_
 (ByVal dwDesiredAccess As Long, \_
 ByVal bInheritHandle As Long, \_
 ByVal dwProcessId As Long) As Long
Declare Function GetExitCodeProcess Lib "kernel32" \_
 (ByVal L\_Prozess As Long, \_
 l\_Ende As Long) As Long
Public Const PROCESS\_QUERY\_INFORMATION = &H400
Public Const STILL\_ACTIVE = &H103
 
Sub StartenExternerAnwendung()
Dim Beginn As Double
Dim l As Long
Dim L\_Prozess As Long
Dim l\_Ende As Long
Beginn = Now
With Sheets("Tabelle2")
 .Range("A65536").End(xlUp).Offset(1, 0).Value = Now
 l = Shell("sol.exe", 1)
 L\_Prozess = OpenProcess(PROCESS\_QUERY\_INFORMATION, False, l)
 Do While l\_Ende = STILL\_ACTIVE
 GetExitCodeProcess L\_Prozess, l\_Ende
 DoEvents
 Loop
 .Range("B65536").End(xlUp).Offset(1, 0).Value = Format(Now - Beginn, "s")
End With
End Sub

Ps: Nochmals nachgefragt, was genau meinst du mit
„in der Tabelle ein Programm mit VB Skript eingebettet“ ?
Startest du eine mit VB erzeugte Exe oder startest du ein Makro mit VB A -Code?

Gruß
Reinhard

antwort
Hallo
ich beschreibs am besten nochmal kurz.
Ein Kollege hat seinen Code mittels VBA in das Exceldokument gelegt.
Normalerweise startet man in der Exceldatei den Code mit diesem Knopf.
So ich habe nun in VB schon ein Programm und würde die Exceldatei bzw. den Knopf von da aus starten, also muß ich das Exceldokument öffnen, meine Einträge aktualisieren (das habe ich beides schon) und dann das Programm starten indem ich den Knopf aktiviere.

Ich werde mal deinen Code ausprobiert, der Trick mit der MsgBox ist vielleicht gut zum testen. Was ich nicht ganz verstehe, wie weise ich das Makro einer Schaltfläche zu und wozu brauche ich das nun.

Ich habe mal rumprobiert. Du brauchst den CommanButton2 und
eine Scxhaltfläche(Formular) der du das Makro „tt2“ zuweist.

Mfg Werner

Geht nicht!!!
Hallo
das hilft mir nicht, dein Code beschreibt ja den Zugriff von dem VBASkript aus bzw. von VB auf entsprechende Schaltflächen.

Was ich aber brauche:
Den Code von VB aus!!! auf eine ExcelDatei und darin den CommandButton2. Wahrscheinlich geht das über Objekt und Applcation und Range oder was weiss ich, es ist wahrscheinlich eine Zeile.

Aber ich weiss den Code nicht!!! Helft mir bitte.

Mfg Werner

Hi Werner,

Was ich aber brauche:
Den Code von VB aus!!! auf eine ExcelDatei und darin den
CommandButton2. Wahrscheinlich geht das über Objekt und
Applcation und Range oder was weiss ich, es ist wahrscheinlich
eine Zeile.

ich lehn mich mal ganz weit aus dem Fenster … das geht gar nicht. :frowning:

Wenn Du mit VB ein Steuerelement einer fremden Anwendung ansprechen willst, brauchst Du deren Handle, Buttons in Excel haben aber keins.

Such Dir lieber eine Lösung über die Position im Fenster, denn die lage des Fensters (das ein handle hat) findest Du. Wenn Du weißt, wo da der Button sitzt, kannst Du da auch den Mauszeiger positionieren.

Gruß, Rainer

das muss irgendwie doch gehn
Hi,
wahrscheinlich bist du meine letzte hilfe, wie so oft,
ich muß ja nicht den Knopf drücken, es reicht mir ja in die SubForm zu kommen, wenn die Datei geöffnet ist.
Das muß doch irgendwie möglich sein.
Im Netz habe ich leider überhaupt nichts gefunden, leider, denn ich weiss nicht, nach welchem Stichpunkt ich suchen muß.

Könntest du nicht mal schaun Seufz

Mfg Werner

Nochne Idee
Hallo
grad ist mir noch ne erfolgversprechende Idee eingefallen, die klappen könnte. Ich kann mit VB ja die ExcelDatei öffnen und dann zB 1 oder 0 in eine Zelle schreiben.
Ich müßte nun noch definieren in dem VBA Skript, das wenn zB 1 drinsteht der CommandButton2 gestartet wird, das sollte sich doch irgendwie realisieren lassen über Timer, Veränderung des Zellwertes oder so.

Vielleicht weiss das ja jmd, das ist glaub ch die einzige Möglichkeit welche mir dann noch einfällt.

Mfg Werner

Hi Werner,

das Makro, das Du aufrufen willst, kannst Du doch auch bearbeiten? Bau das doch so um, daß Du es mit einer Tastenkombination starten kannst, dann kommst Du mit Sendkeys weiter. Geht das bei VBA direkt mit einem Button? Ich habe kein VBA, kann es nicht testen. In VB geht das mit einem ‚&‘ vor dem Zeichen, das verwendet werden soll. Der Button ‚Command&1‘ kann über die taste Alt+1 aktiviert werden.

Um das Ende der Bearbeitung mitzubekommen … den Fenstertitel (Me.Caption) kannst Du mit VB lesen. Wenn Du da eine Nachricht für VB reinschreiben kannst, hast Du etwas, was auswertbar ist.

Gruß, Rainer

Hallo, Werner!

Reden wir immer noch über die eine Datei, die Du mir mal geschickt hast?

Was ich aber brauche:
Den Code von VB aus!!! auf eine ExcelDatei und darin den
CommandButton2. Wahrscheinlich geht das über Objekt und
Applcation und Range oder was weiss ich, es ist wahrscheinlich
eine Zeile.

Vergiss einfach mal den CommandButton2. Der ruft ja nur eine weitere Prozedur auf. Verschiebe diese in ein globales Modul, mache sie zur Public Sub. (Verschiebe auch die dort aufgerufenen Funktionen vom Modul der Tabelle in ein globales Modul!)

Dann kannst Du (das, was Du vermutlich schon hast, also Datei öffnen, Werte eintragen, ganz grob mit skizziert) wie folgt auch die Prozedur aufrufen:

Sub Testprozedur()
 Dim wbDatei As Workbook

 Set wbDatei = Workbooks.Open("D:\Privat\w-w-w\Werner\Version3.6\_Script14.xls")
 ' Jetzt Deine Zellen aktualisieren...

 ' Jetzt aufrufen:
 Application.Run "Version3.6\_Script14.xls!cmdStart\_Click"
 ' Datei wieder schließen und fertig
 wbDatei.Close False
 MsgBox "Fertig"
End Sub

Diese Testprozedur kann in jeder anderen Datei stehen. Pfadnamen natürlich bitte anpassen…

Gruß, Manfred