none
Excel 2016: ExecuteExcel4Macro bringt Excel zum Absturz RRS feed

  • Frage

  • Hi,

    nachdem ich auf Excel 2016 64bit migriert wurde, funktionieren einige VBA-Skripte nicht mehr, die unter Excel 2013 32bit einwandfrei liefen.

    Es geht dabei um die Ausführung von Excel4 Makros. Diese werden verwendet, um aus einem selbsterstellten Add-In heraus Daten aus verschiedenen geschlossenen Excel-Dateien zu sammeln. Der Befehl ExecuteExcel4Macro gibt dabei den Wert zurück.

    Nun stürzt Excel 2016 64bit genau beim Ausführen dieser Codezeile ab und startet dann neu. Selbst ein eigens erstellter Minimal-Code zeigt dasselbe Verhalten.

    Könnte dies an der 64bit-Version von Excel liegen? Ich habe lediglich Infos über Spezialbehandlungen von API-Funktionen bei 64bit gefunden. Fällt ExecuteExcel4Macro auch darunter? Wenn ja, gibt es ein Beispiel für den Aufruf?

    Hier das Codebeispiel, das auf ein XLSX namens "test_wb.xlsx" zugreift, welches in "Sheet1" in Zelle B2 einen Wert hat:

    ' -------------------------------------------------
    Sub Testbench()
        Const myPath = "C:\"          ' Pfad zur zum Daten XLSX
        Const myFile = "test_wb.xlsx" ' enthält Daten, auf die zugegriffen werden soll
        Const mySheet = "Sheet1"      ' ich habe eine englische Excel-Version
        Const myRef = "R2C2"          ' in test_wb.xlsx in Sheet1 steht in Zelle B2 z.B. "42", A1 Referenz verhält sich identisch
        
        Dim macroStr As String
        macroStr = "'" & myPath & "[" & myFile & "]" & mySheet & "'!" & myRef
                                      ' sieht so aus: 'C:\[test_wb.xlsx]Sheet1'!R2C2
        Dim val As Variant
        val = ExecuteExcel4Macro(macroStr) ' --> hier stürzt Excel 2016 64bit ab
        MsgBox val
    End Sub
    ' -------------------------------------------------

    In Excel 2013 32bit wurde entweder ein Wert (hier "42") returniert, oder "val" enthielt eine Fehlermeldung.

    Vielen Dank, Hermann


    Donnerstag, 23. März 2017 12:49

Antworten

  • Finales Feedback: das Problem ist gelöst durch Deinstallation und Neuinstallation des kompletten Office-Pakets. Bei mir Office 365 ProPlus 2016. Zuerst kann man auch ein Quick-Repair von Office versuchen, wenn das keinen Erfolg bringt, dann bleibt nur die Neuinstallation. Ein "Online Repair" geht auch, soll aber evtl. Nebeneffekte haben.

    • Als Antwort markiert Hermann Meyr Mittwoch, 4. Oktober 2017 14:03
    Mittwoch, 4. Oktober 2017 14:03

Alle Antworten

  • Hallo allerseits,

    mittlerweile bin ich von der 64-bit-Version auf die 32-bit-Version umgestiegen, was zumindest einige Probleme gelöst hat. Leider nicht das oben beschriebene. Excel stürzt auch in der 32-bit-Version ab, wenn obige ExecuteExcel4Macro-Zeile ausgeführt wird. Immerhin ist die 32-bit-Version vor dem Absturz etwas kommunikativer. Im obigen Beispiel gibt es folgende Fehlermeldung:

    • Run-time error '-2147417848 (80010108)':
      Automation error
      The object invoked has diconnected from its clients.

    Wer kann mir dabei helfen?

    Hermann

    Freitag, 7. April 2017 15:07
  • mittlerweile bin ich von der 64-bit-Version auf die 32-bit-Version umgestiegen, was zumindest

    The object invoked has diconnected from its clients.

    Aha, dann liegt das Problem wohl an einer anderen Stelle.

    Mach mal 2 Beispieldateien, teste das Verhalten und wenn es immer noch auftritt, dann Zip die Dateien, lad das Zip auf einen Online-File-Hoster wie www.dropbox.com und poste den Download-Link hier. Dann schau ich mir das mal an.

    Andreas.

    Samstag, 8. April 2017 10:43
  • Hallo Andreas,

    vielen Dank für die Antwort. Unten ist der Link zu einem ZIP, welches 2 Dateien enthält, das xlsm mit dem Makro und das "Daten"-xlsx. Fehlermeldungen erscheinen allerdings - wenn überhaupt - nur beim Debuggen, wenn ich die entsprechende Zeile im Einzelschritt ausführe. Diese zwei Meldungen hatte ich auch schon:

    "Automation error" (und irgendein kurzer Einzeiler mit "object exceeded" oder ähnlich, war leider schon weg)

    "Run-time error '1004': Method 'ExecuteExcel4Macro' of object '_Global' failed" (zeitgleich mit "Excel has stopped working", klicken im Fehlerdialog auf "Debug" oder "End" schließt nur das Fenster, bevor der Absturz fortgeführt wird)

    Letzere hätte ich bei falschem Makroaufruf ohne Absturz erwartet.

    https://www.dropbox.com/s/5agq8x44522as06/test_xl4macros_with_xl2016.zip?dl=0

    Danke für die Hilfe,

    Hermann

    Mittwoch, 12. April 2017 08:38
  • https://www.dropbox.com/s/5agq8x44522as06/test_xl4macros_with_xl2016.zip?dl=0

    Also das ganze hat wahrscheinlich nichts mit Excel am Hut, sondern mit Windows, bzw. den Rechten oder den sonstigen Sicherheitstools die Du laufen hast.

    Zugriff auf Daten in C:\ unter Windows 10 sind schon perse kritisch und funktionieren idR nicht. Ich bin Admin und darf das, daher ging selbst das bei mir ohne Probleme.

    Kopier mal beide Dateien in Dein "Dokumente" Verzeichnis, da hast Du als User idR alle Rechte und dann lass einfach mal dieses Makro laufen:

    Option Explicit
    
    Sub Test()
      Dim V As Variant
      Dim Reference As String
      'Standardaufruf
      Reference = "'@Path\[@File]@Sheet'!@Cell"
      
      'Pfad ersetzen
      Reference = Replace(Reference, "@Path", ThisWorkbook.Path)
      'Dateiname ersetzen
      Reference = Replace(Reference, "@File", "test_wb.xlsx")
      'Tabellenname ersetzen
      Reference = Replace(Reference, "@Sheet", "Sheet1")
      'Zellbezug in A1-Schreibweise ersetzen
      Reference = Replace(Reference, "@Cell", "B2")
      
      'Aufruf
      With Application
        V = .ExecuteExcel4Macro(.ConvertFormula(Reference, xlA1, xlR1C1, True))
      End With
      'Anzeigen
      MsgBox V
    End Sub

    Das sollte ohne Änderung funktionieren. Wenn Du planst das via UDF aufzurufen dann geht das nur mit einem Umweg, dazu musst Du zwingend eine 2te Instanz erzeugen.

    Function DDE(ByVal Reference As String) As Variant
      Static XL As Application
      On Error Resume Next
      'Issue: When called as UDF and Reference is a cell, Excel supress the 1st ' if any
      If InStr(Reference, "'!") > 0 And Left$(Reference, 1) <> "'" Then Reference = "'" & Reference
      If XL Is Nothing Then Set XL = CreateObject("Excel.Application")
      DDE = XL.ExecuteExcel4Macro(Application.ConvertFormula(Reference, xlA1, xlR1C1, True))
    End Function

    Für umfangreichere Abfragen gibt es die "Pull" function von "Harlan Groove", die ruft auch jeden Wert einzeln ab, erzeugt jedoch für Matrixformeln automatisch eine Schleife.

    Andreas.

    Mittwoch, 12. April 2017 15:58
  • Sorry für die späte Rückmeldung. Ferienzeit...

    Vielen Dank für deine Mühe. An den Rechten sollte nicht liegen, die sind auf Admin. Von C:\users\<username>\documents aus zeigt sich daher das gleiche Bild. Mit dem von dir vorgeschlagenen Code ändert sich auch nichts.

    Windows ist noch in Version 7 installiert.

    Ein guter Hinweis könnte sein, dass bei einem Crosscheck auf Rechnern einiger Kollegen die Antwort wie erwartet "42" ist.  Kein Absturz, korrekte Ausführung. Irgendetwas scheint daher nicht in Ordnung mit meinem System oder der Office-Installation. Evtl. ist beim Umstieg von 64bit auf 32-bit Office irgendetwas hängen geblieben. Ein Fall für die IT-Abteilung...?

    Falls neue Erkenntnisse auftauchen, werde ich die posten.

    Danke auch für die UDF und den Hinweis auf Harlan Grove. Ich werde das mal gegen meine aktuelle Implementierung checken, sobald es wieder möglich ist.

    Hermann

    Update: auf anderen Rechnern läuft das Script auch unter Excel 2016 64-bit. Scheint ein lokales Problem zu sein.
    Freitag, 21. April 2017 07:54
  • Finales Feedback: das Problem ist gelöst durch Deinstallation und Neuinstallation des kompletten Office-Pakets. Bei mir Office 365 ProPlus 2016. Zuerst kann man auch ein Quick-Repair von Office versuchen, wenn das keinen Erfolg bringt, dann bleibt nur die Neuinstallation. Ein "Online Repair" geht auch, soll aber evtl. Nebeneffekte haben.

    • Als Antwort markiert Hermann Meyr Mittwoch, 4. Oktober 2017 14:03
    Mittwoch, 4. Oktober 2017 14:03