Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: declare ptrsafe automatisch korrigieren

declare ptrsafe automatisch korrigieren
04.02.2022 11:33:45
JoJo
Ich habe viele Excel-Dateien mit Makros.
Mit der Umstellung auf 365 kommt beim Öffnen eine Fehlermeldung, wenn im Code eine Declare Anweisung enthalten ist.
Diese muss um den Zusatz ptrsafe ergänzt werden.
Kann man per VBA alle Excel-Dateien in einem festgelegten Pfad durchgehen und
im zugehörigen Code
Declare durch
Declare ptrsafe
ersetzen (+ speichern),
so dass beim nächsten Öffnen keine Fehlermeldung mehr kommt?
Anzeige

2
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: declare ptrsafe automatisch korrigieren
04.02.2022 12:17:31
Nepumuk
Hallo JoJo,
so einfach geht das nicht, denn mit PtrSafe ist es nicht getan. Da müssen auch die Deklarationen der Parameter und der Rückgabewerte angepasst werden. Zudem musst du die Variablen welche die Rückgabewerte aufnehmen anpassen.
Beispiel alte Version:

Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" ( _
ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long
Private Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongA" ( _
ByVal hwnd As Long, _
ByVal nIndex As Long, _
ByVal dwNewLong As Long) As Long
Die neue Version:

Private Declare PtrSafe Function FindWindow Lib "user32.dll" Alias "FindWindowA" ( _
ByVal lpClassName As String, _
ByVal lpWindowName As String) As LongPtr
Private Declare PtrSafe Function SetWindowLongPtr Lib "user32.dll" Alias "SetWindowLongPtrA" ( _
ByVal hwnd As LongPtr, _
ByVal nIndex As Long, _
ByVal dwNewLong As LongPtr) As LongPtr
Gruß
Nepumuk
Anzeige
AW: declare ptrsafe automatisch korrigieren
04.02.2022 14:01:53
volti
Hallo zusammen,
da hat Nepumuk ja auch gleich eine der Exclusive-Funktionen rausgekramt, die neben dem alten 32-Bit Excel VBA6 auch im neuen Excel VBA7 noch zwischen 32 und 64 Bit unterscheidet.
Den in Deiner Mappe verwendeten Funktionsnamen könntest Du auch beibehalten, wenn nur der Alias mit Bezug auf den wirklichen Funktionsnamen stimmt.
Hier mal ergänzend ein Declare-Beispiel, das für alle Versionen funktioniert:
Code:

[Cc]

#If VBA7 Then #If Win64 Then Private Declare PtrSafe Function SetWindowLong Lib "user32" Alias "SetWindowLongPtrA" ( _ ByVal hwnd As LongPtr, ByVal nIndex As Long, _ ByVal dwNewLong As LongPtr) As LongPtr #Else Private Declare PtrSafe Function SetWindowLong Lib "user32" Alias "SetWindowLongA" ( _ ByVal hwnd As LongPtr, ByVal nIndex As Long, _ ByVal dwNewLong As LongPtr) As LongPtr #End If #Else ' VBA6 Private Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongA" ( _ ByVal hwnd As Long, ByVal nIndex As Long, _ ByVal dwNewLong As Long) As Long #End If

_________________________
viele Grüße aus Freigericht 😊
Karl-Heinz

Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige
Anzeige

Infobox / Tutorial

Declare PtrSafe in Excel VBA automatisch korrigieren


Schritt-für-Schritt-Anleitung

Um alle Declare Anweisungen in Deinen Excel-Makros auf die Verwendung von PtrSafe zu aktualisieren, kannst Du folgendes VBA-Skript verwenden. Dieses Skript durchläuft alle Excel-Dateien in einem festgelegten Pfad und ersetzt Declare durch Declare PtrSafe.

  1. Öffne Excel und drücke ALT + F11, um den VBA-Editor zu öffnen.
  2. Klicke auf Einfügen > Modul, um ein neues Modul zu erstellen.
  3. Füge den folgenden Code ein:
Sub UpdateDeclarePtrSafe()
    Dim wb As Workbook
    Dim vbaMod As Object
    Dim code As String
    Dim path As String
    Dim file As String

    path = "C:\Dein\Pfad\Zu\Excel\Dateien\" 'Passe den Pfad an
    file = Dir(path & "*.xlsm")

    Do While file <> ""
        Set wb = Workbooks.Open(path & file)
        For Each vbaMod In wb.VBProject.VBComponents
            If vbaMod.Type = vbext_ct_StdModule Or vbaMod.Type = vbext_ct_ClassModule Then
                code = vbaMod.CodeModule.Lines(1, vbaMod.CodeModule.CountOfLines
                code = Replace(code, "Declare", "Declare PtrSafe")
                vbaMod.CodeModule.DeleteLines 1, vbaMod.CodeModule.CountOfLines
                vbaMod.CodeModule.AddFromString code
            End If
        Next vbaMod
        wb.Save
        wb.Close
        file = Dir
    Loop
End Sub
  1. Passe den path im Code an Deinen spezifischen Pfad an.
  2. Führe das Skript aus, indem Du F5 drückst oder auf Ausführen klickst.

Häufige Fehler und Lösungen

  • Fehlermeldung beim Öffnen einer Datei: Wenn Du beim Öffnen einer Datei eine Fehlermeldung erhältst, dass Declare nicht korrekt ist, überprüfe, ob Du PtrSafe in allen Declare Anweisungen hinzugefügt hast.

  • Typkonflikte: Bei der Umstellung auf PtrSafe müssen auch die Rückgabetypen angepasst werden, z.B. von Long auf LongPtr. Achte darauf, dass alle Parameter ebenfalls korrekt deklariert sind.


Alternative Methoden

Eine Alternative zur automatischen Anpassung ist das manuelle Update der Declare Anweisungen. Dies ist besonders nützlich, wenn Du nur wenige Makros hast. Hier ein Beispiel:

#If VBA7 Then
    Private Declare PtrSafe Function FindWindow Lib "user32.dll" Alias "FindWindowA" ( _
        ByVal lpClassName As String, _
        ByVal lpWindowName As String) As LongPtr
#Else
    Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" ( _
        ByVal lpClassName As String, _
        ByVal lpWindowName As String) As Long
#End If

Praktische Beispiele

Hier ist ein Beispiel, wie Du eine Declare Anweisung in einer Excel VBA-Anwendung anpassen kannst:

' Alte Version
Private Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongA" ( _
    ByVal hwnd As Long, _
    ByVal nIndex As Long, _
    ByVal dwNewLong As Long) As Long

' Neue Version für 64-Bit
Private Declare PtrSafe Function SetWindowLongPtr Lib "user32.dll" Alias "SetWindowLongPtrA" ( _
    ByVal hwnd As LongPtr, _
    ByVal nIndex As Long, _
    ByVal dwNewLong As LongPtr) As LongPtr

Tipps für Profis

  • Backup erstellen: Vor der Anpassung von Declare Anweisungen solltest Du ein Backup Deiner Dateien erstellen, um Datenverlust zu vermeiden.
  • Fehlerprotokoll: Halte ein Protokoll über alle Änderungen, die Du vornimmst, um die Nachverfolgung zu erleichtern.
  • Testen: Teste jede Datei nach der Änderung gründlich, um sicherzustellen, dass alle Funktionen wie erwartet arbeiten.

FAQ: Häufige Fragen

1. Warum muss ich PtrSafe verwenden?
PtrSafe ist notwendig, um sicherzustellen, dass Deine VBA-Anweisungen sowohl in 32-Bit als auch in 64-Bit Umgebungen funktionieren.

2. Was passiert, wenn ich PtrSafe nicht hinzufüge?
Falls Du PtrSafe in einer 64-Bit Version von Excel nicht hinzufügst, wirst Du beim Öffnen Deiner Datei eine Fehlermeldung erhalten, die besagt, dass die Declare Anweisung ungültig ist.

3. Funktioniert das Skript auch für ältere Excel-Versionen?
Das Skript ist für Excel VBA 7 (ab Excel 2010 und höher) konzipiert. Ältere Versionen (VBA 6) benötigen keine PtrSafe-Deklarationen.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige