Freigeben über


Sie müssen den Rückgabetyp explizit in einem VBA-Makro deklarieren, das Sie in einer 64-Bit-Umgebung ausführen.

Zusammenfassung

Wenn Sie versuchen, Code auszuführen, der einige Rückruffunktionen verwendet, um einige APIs in Microsoft Visual Basic for Applications (VBA) in einer 64-Bit-Version von Microsoft Office zu deklarieren, schlägt der Code fehl. Bei einer 32-Bit-Version von Microsoft Office schlägt dieser Code jedoch nicht fehl. Dieses Problem tritt auf, weil der Rückgabetyp in einer 64-Bit-VBA-Anwendung explizit deklariert werden muss. 

Hinweis Wenn der Rückgabetyp nicht explizit deklariert wird, wird der Wert mithilfe des Datentyps Variant behandelt.

Weitere Informationen

Führen Sie die folgenden Schritte aus, um dieses Problem zu testen, das im Abschnitt "Zusammenfassung" erwähnt wird:

  1. Öffnen Sie ein Word-Dokument in einer 64-Bit-Version von Microsoft Word 2010.
  2. Zum Öffnen des VBA-Editors klicken Sie auf der Registerkarte "Entwicklertools" im Menüband auf Visual Basic.
  3. Führen Sie die folgenden Schritte aus, um ein neues Modul im VBA-Editor zu erstellen:
    1. Klicken Sie mit der rechten Maustaste auf "Dieses Dokument " unter der Projektstruktur , die sich im oberen linken Bereich des VBA-Editors befindet.
    2. Wählen Sie "Einfügen" aus, und klicken Sie dann auf "Modul".
    3. Unter der Projektstruktur wird ein neuer Modulknoten angezeigt, und für das neue Modul wird ein VBA-Codefenster geöffnet.
    4. Kopieren Sie den folgenden Code, und fügen Sie den Code dann in das VBA-Codefenster für das neue Modul ein.
Option Explicit
Dim iCounter As Integer
Dim lngTimerID As Long
Dim BlnTimer As Boolean

Declare PtrSafe Function SetTimer Lib "user32" (ByVal hwnd As Long, _
 ByVal nIDEvent As Long, _
 ByVal uElapse As Long, _
 ByVal lpTimerFunc As LongPtr) As Long

Declare PtrSafe Function KillTimer Lib "user32" (ByVal hwnd As Long, _
 ByVal nDEvent As Long) As Long

Sub TimerProc(ByVal hwnd As Long, _
 ByVal uMsg As Long, _
 ByVal idEvent As Long, _
 ByVal dwTime As Long)
iCounter = iCounter + 1
End Sub 

Private Sub ToggleTimer()
 If BlnTimer = False Then
 lngTimerID = SetTimer(0, 0, 200, AddressOf TimerProc)
 If lngTimerID = 0 Then
 MsgBox "Timer not created. Ending program"
 Exit Sub
 End If
 BlnTimer = True
 Else 
lngTimerID = KillTimer(0, lngTimerID)
 If lngTimerID = 0 Then
MsgBox "Could not kill the timer"
 End If
 BlnTimer = False
 MsgBox " Timer Count " & iCounter
 End If

End Sub

Sub Macro1()
 ToggleTimer
End Sub   
  1. Klicken Sie zum Ausführen des Codes im VBA-Editor auf "Ausführen ", oder wählen Sie im Menü "Ausführen" den Befehl "Sub\Benutzerformularausführen " aus. Klicken Sie dann im daraufhin angezeigten Dialogfeld auf "Makro1 ausführen ". 
  2. Ändern Sie dann den Code, der wie folgt aussieht, von einer Sub-Prozedur in eine Funktionsprozedur:
Sub TimerProc(ByVal hwnd As Long, _
 ByVal uMsg As Long, _
 ByVal idEvent As Long, _
 ByVal dwTime As Long)

iCounter = iCounter + 1
End Sub
After you have changed the Sub procedure to a Function procedure, the code resembles the following:

Function TimerProc(ByVal hwnd As Long, _
 ByVal uMsg As Long, _
 ByVal idEvent As Long, _
 ByVal dwTime As Long)

iCounter = iCounter + 1
End Function   
  1. Führen Sie den Code erneut aus, und dann wird die folgende Fehlermeldung angezeigt:

Microsoft Word versucht, Ihre Informationen wiederherzustellen. Dies kann einige Minuten dauern.

Der Rückgabetyp darf nicht vom Datentyp Variant sein. Diese Einschränkung gilt nur für die Rückruffunktionen in VBA, die Sie in einer 64-Bit-Umgebung ausführen. Diese Einschränkung gilt nicht für die Declare-Anweisungen zum Aufrufen externer API-Methoden. In VBA, das Sie in einer 32-Bit-Umgebung ausführen, können Sie eine Function-Prozedur verwenden, die den Datentyp Variant und eine Sub-Prozedur für API-Rückrufe verwendet, die einen Void-Wert, einen Integer-Datentyp mit 16 Bit oder einen Long-Datentyp mit 32 Bit zurückgeben können. Daher führen die oben genannten Schritte nicht zu dem Fehler, wenn Sie den Code in VBA in einer 32-Bit-Umgebung ausführen. Dieses Problem tritt aufgrund von Zeigeränderungen in VBA auf, die Sie in einer 64-Bit-Umgebung ausführen. Daher müssen Rückruffunktionen explizit mithilfe des richtigen Rückgabetyps in der 64-Bit-Umgebung deklariert werden. Dieses Verhalten erfordert, dass TimerProc, das im oben erwähnten Beispiel enthalten ist, als Sub-Prozedur und nicht als Funktionsprozedur deklariert wird.