VBScript ruft Excel-VBA-Makro 1x auf, es wird aber 2x ausgeführt...

  • VBScript

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von petaod.

    VBScript ruft Excel-VBA-Makro 1x auf, es wird aber 2x ausgeführt...

    Liebe Leute von vb-paradise,

    nachdem ich stundenlang getestet und probiert und gegoogelt habe, gebe ich auf... Ich brauche eure Hilfe.
    Ich habe ein VBScript und rufe damit ein VBA Makro auf (Code unten). Das Problem dabei ist: Das Makro wird 2x ausgeführt, obwohl ich es in VBScript nur 1x aufrufe!

    Konkret: Ich habe eine .bat-Datei, die ein VBScript zusammen mit einem command-line-Argument aufruft (+ redirect des outputs in eine Datei). Die .bat-Datei sieht so aus:

    Quellcode

    1. CScript //nologo "C:\Mein Ordner\MeinScript.vbs" "VBA Argument" >> "C:\Mein Ordner\Mein Errlog.log"


    Sowohl .bat-Datei als auch VBScript werden automatisch generiert. Die .bat-Datei wird dann von einem externen Programm ausgeführt.
    Das VBScript geht davon aus, dass eine bestimmte Excel-Datei bereits geöffnet ist und ruft in dieser Excel-Arbeitsmappe dann ein Makro auf. Dabei wird das command-line-Argument ("VBA Argument" im Code oben) an das Excel VBA Makro übergeben.
    Hier der VBScript Code:

    Visual Basic-Quellcode

    1. Set XLHandle = GetObject(, "Excel.Application")
    2. XLHandle.DisplayAlerts = False
    3. XLHandle.Visible = False
    4. On Error Resume Next
    5. sWbkPath = "C:\Ein Pfad\"
    6. sWbkName = "temp 123.xls"
    7. sWbkFullName = "'" & sWbkPath & sWbkName & "'!"
    8. sMacroName = "Test2" & "(" & Chr(34) & WScript.Arguments(0) & Chr(34) & ")"
    9. sMacroName = sWbkFullName & sMacroName
    10. 'WScript.echo sMacroName
    11. XLHandle.Run sMacroName
    12. boolRC = Err.Number <> 0
    13. On Error GoTo 0
    14. If boolRC Then
    15. WScript.Echo Time() & ": Run Excel Macro, Failed to call macro | Incorrect or not existing macro"
    16. Else
    17. WScript.Echo Time() & ": Run Excel Macro, Successfully invoked macro"
    18. End If
    19. Set XLHandle = Nothing



    Wie gesagt, der Code funktioniert prinzipiell, das Excel-Makro wird mit dem korrekten Argument ausgeführt - aber eben 2 Mal statt nur 1 Mal...
    Könnt ihr mir hier irgendwie weiterhelfen? Was ist hier falsch??

    Vielen Dank!
    Jakob

    Edit by ~blaze~:
    Falsches Forum
    -->*Thema verschoben*

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „~blaze~“ ()

    Hallo,

    @petaod: nein - Workbook_Open ist leer. Daran kann es also nicht liegen...

    @blaze: Danke für's Verschieben - hatte wohl beim ersten Posting noch nicht die volle Übersicht... :-o


    Wäre dankbar, wenn noch wem was einfällt!
    Jakob
    Liebe vb-paradise-community,

    erstmal vielen Dank an alle, die sich über mein Problem den Kopf zerbrechen... Ich bin auch schon kurz vor dem Verzweifeln. Alle Versuche, das Ganze in den Griff zu kriegen, sind bisher fehlgeschlagen.

    @petaod: VBA bzw. VBE ignoriert meine Codezeile mit dem Stop-Befehl ganz einfach. So, als ob da gar nichts von einem Stop stehen würde... Ist das normal!?

    @peterfido: Ja, auch bei händischem Starten der batch-Datei. Und auch bei händischem Anwerfen der vbs-Datei von der command-line mit dem gleichen Befehl wie in der batch-Datei.

    Ich habe versucht, Minimalversionen des Verhaltens / des Fehlers zu konstruieren. Hier die Details:
    • aufgerufen wird eine Excel-Datei, die nur ein Modul mit dem Code der Test-Sub enthält. Die Test-Sub (namens "Test") schreibt nur Debug.Print mit Uhrzeit und Übergabewert.
    • diese Datei wird via vbs so aufgerufen

    Quellcode

    1. Set XLHandle = GetObject(, "Excel.Application")
    2. XLHandle.Run "Test(1)"

    • Dabei wird die Routine "Test" zwei Mal ausgeführt...
    • Versucht habe ich auch (per batch-Datei und auch händisch via command line):

    Quellcode

    1. CScript //nologo C:\MeinPfad\MeinVBS.vbs

    • Reboot und Neustart von Excel (Version 2003) hab ich natürlich auch schon versucht - ihr könnt es euch schon denken: ohne Erfolg...

    Das Ganze ist Teil eines doch etwas größeren Automatisierungs-Projekts, und jetzt scheint das Projekt auf Grund einer solchen Lappalie zu scheitern. Das darf doch gar nicht wahr sein... Ich bin wirklich etwas verzweifelt und zerknirscht... Wäre sehr froh und dankbar, wenn jemand weiter weiß!

    Jakob
    Kleine Neuigkeit...

    Habe noch weiter rumprobiert...

    Ein neuer Versuch - es ist inzwischen ein arges trial-and-error geworden - zeigt, dass der folgende Code funktioniert:

    Quellcode

    1. Set XLHandle = GetObject(, "Excel.Application")
    2. XLHandle.Run "Test", "blabla"

    Wobei "blabla" das Argument für das Excel-Makro ist.
    So funktioniert es also erstmal. Warum die Klammer dazu führt, dass das Makro 2 Mal gestartet wird - keinen blassen Schimmer!

    ABER - das löst mein Problem leider noch nicht...!
    Denn der Code oben funktioniert nur bei konstantem Argument. D.h. dieser Code funktioniert nicht:

    Quellcode

    1. Set XLHandle = GetObject(, "Excel.Application")
    2. sArgument = WScript.Arguments(0)
    3. XLHandle.Run "Test", sArgument


    So: meine Frage ist also jetzt:
    Wie kann ich der .Run-Methode ein dynamisches Argument übergeben??


    Vielen Dank nochmal!
    Jakob

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „bluesea“ ()

    So liebe Leute,
    ich nochmal... Sorry wenn ich vielleicht nerve, aber dieser Beitrag ist hoffentlich auch für andere hilfreich:
    Ich hab die Lösung gefunden! Durch Rumprobieren...

    Also, in VBScript war alles korrekt. Keine Änderung.
    Aaber: Man muss im VBA-Makro darauf aufpassen, dass das erwartete Argument unbedingt Datentyp Variant ist, nicht String, Integer oder sonst was. Jetzt funktioniert es einwandfrei!!

    Liebe Grüße und hoffentlich hilft das auch anderen Leuten.
    Jakob

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „bluesea“ ()

    bluesea schrieb:

    VBE ignoriert meine Codezeile mit dem Stop-Befehl ganz einfach
    Ich erinnere mich ganz dunkel an etwas.
    Du musst, glaube ich, Excel und die IDE offen haben, damit der Breakpoint wirkt.
    Aber du hast es jetzt ja auch so gelöst.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --