Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Problem mit 32-Bit und 64-Bit beim Makro ausführen

Problem mit 32-Bit und 64-Bit beim Makro ausführen
25.10.2013 13:58:49
Jenny
Hallo alle zusammen, bekomme beim ausführen des unten stehenden Makros die Meldung, dieses müsse auf 64 Bit aktualisiert werden, kann mir dabei jemand helfen?
DAnke und liebe Grüße
Jenny
Option Explicit
Private Declare Function GlobalLock Lib "kernel32.dll" ( _
ByVal hMem As Long) As Long
Private Declare Function GlobalUnlock Lib "kernel32.dll" ( _
ByVal hMem As Long) As Long
Private Declare Function lstrlenA Lib "kernel32.dll" ( _
ByVal lpString As Long) As Long
Private Declare Function lstrcpyA Lib "kernel32.dll" ( _
ByVal lpString1 As Any, _
ByVal lpString2 As Any) As Long
Private Declare Function RegisterClipboardFormatA Lib "user32.dll" ( _
ByVal lpString As String) As Long
Private Declare Function IsClipboardFormatAvailable Lib "user32.dll" ( _
ByVal wFormat As Long) As Long
Private Declare Function OpenClipboard Lib "user32.dll" ( _
ByVal hWnd As Long) As Long
Private Declare Function GetClipboardData Lib "user32.dll" ( _
ByVal wFormat As Long) As Long
Private Declare Function CloseClipboard Lib "user32.dll" () As Long
Public Sub InsertHtml()
Dim strReturn As String
Dim avntTemp As Variant
Dim ialngIndex As Long, lngEmptyLines As Long
strReturn = HTMLFromClipboard
If strReturn  vbNullString Then
avntTemp = Split(strReturn, vbNewLine)
For ialngIndex = LBound(avntTemp) To UBound(avntTemp)
If avntTemp(ialngIndex) = vbNullString Then _
lngEmptyLines = lngEmptyLines + 1
Next
Cells(1, 1).Resize(UBound(avntTemp) - lngEmptyLines, 1).Value = _
Application.Transpose(avntTemp)
Else
MsgBox "Kein HTML im Clipboard"
End If
End Sub
Private Function HTMLFromClipboard() As String
Dim lngFormatHTML As Long
Dim lngHandle As Long, lngPointer As Long
Dim strText As String
lngFormatHTML = RegisterClipboardFormatA("HTML Format")
If IsClipboardFormatAvailable(lngFormatHTML) Then
Call OpenClipboard(0&)
lngHandle = GetClipboardData(lngFormatHTML)
lngPointer = GlobalLock(lngHandle)
strText = Space$(lstrlenA(ByVal lngPointer))
Call lstrcpyA(strText, ByVal lngPointer)
Call GlobalUnlock(lngPointer)
Call CloseClipboard
HTMLFromClipboard = strText
End If
End Function

Anzeige

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Problem mit 32-Bit und 64-Bit beim Makro ausführen
25.10.2013 14:12:36
Jenny
Hallo Luschi,
ich lese in dem Link den Satz "Wenn Sie 32-Bit-Code schreiben, können Sie die 64-Bit-Version von Microsoft Office ohne Änderungen verwenden."
Warum bekomme ich dann überhaupt diese Fehlermeldung?
Jenny

AW: Problem mit 32-Bit und 64-Bit beim Makro ausführen
25.10.2013 14:20:05
Luschi
Hallo Jenny,
In diesem Fall wird von normalem Vba-Code gesprochen. Du verwendest aber API-Funktionsaufrufe, die das Betriebssystem mitbringt und da ist eben diese Anpassung erforderlich.
Gruß von Luschi
aus klein-Paris

Anzeige
AW: Problem mit 32-Bit und 64-Bit beim Makro ausführen
25.10.2013 14:22:49
Jenny
leider ändert es trotzdem nichts daran, dass ich Hilfe benötie, hab den Code da nicht selbst geschrieben, hab von sowas kaum Ahnung.
Daher meine Bitte um Hilfe von jemandem der weiß was man da ändern muss.
Jenny

AW: Problem mit 32-Bit und 64-Bit beim Makro ausführen
25.10.2013 14:39:57
Rudi
Hallo,
z.B.
#If win64 Then
Private Declare ptrsafe Function GlobalLock Lib "kernel32.dll" ( _
ByVal hMem As Longptr) As Longptr
#Else
Private Declare Function GlobalLock Lib "kernel32.dll" ( _
ByVal hMem As Long) As Long
#End If

Die anderen Functions entsprechend.
Der Compiler wird meckern, aber nur 1 mal.
Gruß
Rudi

Anzeige
AW: Problem mit 32-Bit und 64-Bit beim Makro ausführen
26.10.2013 08:17:13
Luschi
Hallo Rudi,
manchmal glaube ich, die M$-Verantwortlichen für die MSDN-Hilfe schreiben ihre Anleitungen mit Notepad oder dem vi-Editor. Original aus dem von mir geposteten Link:

#if VBA7 then 'VBA7

Gruß von Luschi
aus klein-Paris
Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige

Infobox / Tutorial

32-Bit und 64-Bit: Makros in Excel anpassen


Schritt-für-Schritt-Anleitung

  1. Öffne dein Excel-Dokument und drücke ALT + F11, um den VBA-Editor zu öffnen.

  2. Finde den betreffenden Code in deinem Modul. Du wirst eine Reihe von Private Declare Anweisungen sehen, wie in folgendem Beispiel:

    Private Declare Function GlobalLock Lib "kernel32.dll" ( _
    ByVal hMem As Long) As Long
  3. Ändere den Code für die 64-Bit-Version. Füge eine Präprozessoranweisung hinzu, um zwischen 32-Bit und 64-Bit zu unterscheiden. So könnte dein angepasster Code aussehen:

    #If win64 Then
    Private Declare PtrSafe Function GlobalLock Lib "kernel32.dll" ( _
    ByVal hMem As LongPtr) As LongPtr
    #Else
    Private Declare Function GlobalLock Lib "kernel32.dll" ( _
    ByVal hMem As Long) As Long
    #End If
  4. Passe jede Declare Anweisung entsprechend an, indem du das Schlüsselwort PtrSafe und den Datentyp LongPtr verwendest, wenn du auf 64-Bit umstellst.

  5. Speichere und schließe den VBA-Editor und teste das Makro.


Häufige Fehler und Lösungen

  • Fehlermeldung beim Ausführen des Makros: Überprüfe, ob du alle Declare Anweisungen auf 64-Bit angepasst hast. Gerade bei API-Funktionen ist dies wichtig.
  • Falsche Datentypen: Stelle sicher, dass du LongPtr anstelle von Long verwendest, wenn dein Code auf 64-Bit umgestellt wird. Dies ist entscheidend für die Kompatibilität mit der kernel32.dll.
  • Compiler-Fehler: Wenn der Compiler meckert, überprüfe die Syntax und stelle sicher, dass du die #If win64 Then Anweisung korrekt platziert hast.

Alternative Methoden

Falls du nicht den gesamten Code umstellen möchtest, kannst du auch:

  • Separate Module für 32-Bit und 64-Bit erstellen: Halte zwei Versionen deines Makros bereit und nutze die entsprechende Version basierend auf der Excel-Version, die du verwendest.
  • Mit einer Funktion zur Erkennung der Excel-Version arbeiten: Du kannst eine Funktion implementieren, die überprüft, ob Excel 32-Bit oder 64-Bit ist. Beispiel:

    Function Is64BitExcel() As Boolean
       Is64BitExcel = (LenB(1) = 8)
    End Function

Praktische Beispiele

Hier ist ein Beispiel, wie du deinen Code anpassen kannst:

#If win64 Then
Private Declare PtrSafe Function lstrlenA Lib "kernel32.dll" ( _
ByVal lpString As LongPtr) As LongPtr
#Else
Private Declare Function lstrlenA Lib "kernel32.dll" ( _
ByVal lpString As Long) As Long
#End If

Verwende diese Struktur für alle API-Funktionen, die du in deinem Makro benötigst. Denke daran, dass die Anpassung für die user32.dll und andere Bibliotheken ähnlich erfolgt.


Tipps für Profis

  • Nutze Option Explicit: Dies hilft dir, Fehler bei der Variablendeklaration zu vermeiden.
  • Verwende PtrSafe: Immer wenn du mit 64-Bit-Versionen arbeitest, ist die Verwendung von PtrSafe unerlässlich.
  • Testen: Teste deinen Code gründlich, um sicherzustellen, dass er auf beiden Versionen von Excel funktioniert.

FAQ: Häufige Fragen

1. Wie erkenne ich, ob ich 32-Bit oder 64-Bit Excel verwende?
Du kannst dies überprüfen, indem du in Excel auf Datei > Hilfe gehst. Dort siehst du, ob deine Version 32-Bit oder 64-Bit ist.

2. Muss ich jeden Declare Befehl ändern?
Ja, alle Declare Anweisungen, die API-Funktionen verwenden, müssen angepasst werden, um mit der 64-Bit-Version kompatibel zu sein.

3. Was passiert, wenn ich die Anpassungen nicht vornehme?
Wenn du die Anpassungen nicht vornimmst, wird dein Makro in der 64-Bit-Version von Excel nicht funktionieren und du erhältst Fehlermeldungen.

4. Wo finde ich weitere Informationen zur API-Problematik?
Ein nützlicher Link ist die Microsoft-Dokumentation, die du hier findest: MSDN API-Dokumentation.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige