Geben Sie PtrSafe an, um beim Importieren der Windows-API sowohl 32-Bit- als auch 64-Bit-Excel zu verwenden
Erfahren Sie mehr über die PtrSafe-Deklaration der Windows-API. Beim Codieren mit Excel VBA können Sie die Ursachen und Lösungen von PtrSafe-bezogenen Fehlern überprüfen, die gelegentlich beim Importieren und Verwenden von Windows-APIs auftreten.
1. Beispielcode für das Auftreten von PtrSafe-Fehlern in der Windows-API
Dieser Code importiert und deklariert Windows API Sleep, OutputDebugString.
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Private Declare Sub OutputDebugString Lib "kernel32" Alias "OutputDebugStringA" (ByVal lpOutputString As String)
(Hinweis: Der obige Code ist Protokollierungsmuster: Verwendung von OutputDebugString und DebugView – Produktivitäts-Skill (prodskill.com) Dies ist der Code, der in eingeführt wurde.)
2. PtrSafe-Fehlermeldung der Windows-API
Beim Bearbeiten oder Kompilieren von VBA-Code tritt der folgende Fehler auf.
——————————————-
Microsoft Visual Basic für Applikationen
——————————————-Dies ist ein Kompilierungsfehler:
Sie müssen den Code in diesem Projekt aktualisieren, um ihn auf 64-Bit-Systemen verwenden zu können. Überprüfen und aktualisieren Sie die Declare-Anweisung und markieren Sie sie mit dem PtrSafe-Attribut.
3. Was verursacht PtrSafe-Fehler in der Windows-API
64-Bit wird seit MS-Office 2010 unterstützt, und dies tritt auf, weil das PtrSafe-Schlüsselwort angegeben werden muss, wenn danach die Windows-API in 64-Bit-Excel importiert wird.
![Compile error when you edit a VBA macro in the 64-bit version of an Office 2010 program](https://prodskill.com/wp-content/uploads/2022/09/image-205.png)
Einige Auszüge aus der obigen URL sind unten eingefügt.
Symptome
Betrachten Sie das folgende Szenario:
- Sie schreiben einen Makrocode für Microsoft Visual Basic für Applikationen (VBA), der Declare-Anweisungen verwendet.
- Ihr VBA-Makrocode verwendet Kompilierungskonstanten. Ihr Makrocode verwendet beispielsweise eine der folgenden Kompilierungskonstanten:
- #If VBA7
- #Wenn Win64
- Einen #Else-Baustein verwenden Sie in einem Bedingungsbaustein. Im #Else-Block verwenden Sie Syntax für eine Declare-Anweisung, die für die Ausführung in Microsoft Visual Basic für Applikationen 6.0 entwickelt wurde.
- Sie bearbeiten den Code in einer 64-Bit-Version eines Microsoft Office 2010-Programms.
- Sie versuchen, die Declare-Anweisung im #Else-Block zu ändern.
In diesem Szenario wird die folgende Fehlermeldung angezeigt:
Microsoft Visual Basic for Applications Compile error: The code in this project must be updated for use on 64-bit systems. Please review and update Declare statements and then mark them with the PtrSafe attribute.
4. So beheben Sie den Windows-API-PtrSafe-Fehler
Die VBA-Version von MS-Office 2010 ist 7.0 und die vorherige ist 6.x. Da das PtrSafe-Schlüsselwort ab VBA 7.0 erforderlich ist, kann der Windows-API-Importcode unterteilt und deklariert werden, je nachdem, ob die VBA-Version höher als 7.0 ist oder nicht.
Bezug: PtrSafe-Schlüsselwort (VBA) | Microsoft-Docs
Einige Auszüge aus der obigen URL sind unten eingefügt.
PtrSafe-Schlüsselwort
- Artikel
- 09/14/2021
- 2 Minuten zu lesen
- 5 Mitwirkende
Die PtrSafe Schlüsselwort wird in diesem Zusammenhang verwendet: Aussage erklären.
Erklären Aussagen mit PtrSafe Schlüsselwort ist die empfohlene Syntax. Deklarieren Sie Anweisungen, die enthalten PtrSafe funktionieren in der VBA7-Entwicklungsumgebung sowohl auf 32-Bit- als auch auf 64-Bit-Plattformen nur dann korrekt, wenn alle Datentypen in der Erklären -Anweisung (Parameter und Rückgabewerte), die 64-Bit-Mengen speichern müssen, werden für die Verwendung aktualisiert Lang Lang für 64-Bit-Integrale bzw LangPtr für Zeiger und Griffe.
Um die Abwärtskompatibilität mit VBA-Version 6 und früher sicherzustellen, verwenden Sie das folgende Konstrukt:
#If VBA7 Then Declare PtrSafe Sub... #Else Declare Sub... #EndIf
Bei Ausführung in 64-Bit-Versionen von Office Erklären Aussagen müssen die enthalten PtrSafe Stichwort. Der PtrSafe Schlüsselwort behauptet, dass a Erklären -Anweisung kann in 64-Bit-Entwicklungsumgebungen sicher ausgeführt werden.
Hinzufügen der PtrSafe Schlüsselwort zu a Erklären Aussage bedeutet nur, dass die Erklären Die Anweisung zielt explizit auf 64-Bit ab. Alle Datentypen innerhalb der Anweisung, die 64-Bit speichern müssen (einschließlich Rückgabewerte und Parameter), müssen weiterhin so geändert werden, dass sie 64-Bit-Mengen enthalten, indem sie beide verwenden Lang Lang für 64-Bit-Integrale bzw LangPtr für Zeiger und Griffe.
Sie müssen lediglich festlegen, ob eine „VBA7“-Konstante oder eine „Win64“-Konstante definiert ist.Verwenden Sie in diesem Fall die Compiler-Direktive #If-Syntax.
Der Code ist wie folgt aufgebaut:
'방법1 #If VBA7 Then '64bit Windows API import #Else '32bit Windows API import #End If '방법2 #If Win64 Then '64bit Windows API import #Else '32bit Windows API import #End If '방법1, 방법2는 동일한 효과가 있으므로 한 방법을 선택하면 됨
5. Beispielcode zum Beheben des Windows-API-PtrSafe-Fehlers
5.1. Falls es gemischt und in 32-Bit- und 64-Bit-Excel verwendet wird
#If VBA7 Then 'For 64 Bit Systems Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr) Private Declare PtrSafe Sub OutputDebugString Lib "kernel32" Alias "OutputDebugStringA" (ByVal lpOutputString As String) #Else 'For 32 Bit Systems Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Private Declare Sub OutputDebugString Lib "kernel32" Alias "OutputDebugStringA" (ByVal lpOutputString As String) #End If
5.2. Wenn es nur in 64-Bit-Excel verwendet wird
Wenn Sie sicher sind, dass es nur in 64-Bit-Excel verwendet wird, verwenden Sie nur eine Anweisung, die das PtrSafe-Schlüsselwort angibt.
Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr) Private Declare PtrSafe Sub OutputDebugString Lib "kernel32" Alias "OutputDebugStringA" (ByVal lpOutputString As String)