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

Forumthread: VBA Makro von 32bit auf 64bit anpassen

VBA Makro von 32bit auf 64bit anpassen
10.03.2015 15:11:41
32bit
Hallo ich hab ein Problem. Ich habe ein Makro welches mir meine aktuelle Arbeitsmappe als .csv Semikolon-getrennt und utf-8 abspeichert. Das Makro funktioniert auf einem 32bit Rechner auch einwandfrei, allerdings macht es jetzt Probleme auf meinem 64 bit Rechner.
Ich würde das Makro gerne so umschreiben, dass es mir die Datei Komma-getrennt und weiterhin UTF-8 konvertiert abspeichert.
Hier das Makro
Option Explicit
Private Declare Function WideCharToMultiByte Lib "kernel32.dll" ( _
ByVal CodePage As Long, _
ByVal dwFlags As Long, _
ByVal lpWideCharStr As Long, _
ByVal cchWideChar As Long, _
ByVal lpMultiByteStr As Long, _
ByVal cbMultiByte As Long, _
ByVal lpDefaultChar As Long, _
ByVal lpUsedDefaultChar As Long) As Long
Private Const CP_UTF8 As Long = 65001
Private Const FILE_NAME = "C:\Ausgabe.csv"
Public Sub UTF8_Main()
Dim strText As String
Dim objRange As Range
If Get_Range(objRange) Then
If Build_Output_String(objRange, strText) Then
If Create_UTF8_File(FILE_NAME, strText) Then
MsgBox "Erstellen der Datei erfolgreich beendet.", _
vbInformation, "Information"
End If
End If
End If
End Sub

Private Function Get_Range(objRange As Range) As Boolean
Dim lngRow As Long, lngColumn As Long
Dim lngFirstRow As Long, lngFirstColumn As Long
Dim lngLastRow As Long, lngLastColumn As Long
Dim objLastUsedCell As Range
On Error GoTo error_handler
Set objLastUsedCell = Cells.SpecialCells(xlCellTypeLastCell)
For lngRow = objLastUsedCell.Row To 1 Step -1
If WorksheetFunction.CountBlank(Rows(lngRow)) 

Private Function Build_Output_String(objRange As Range, strText As String) As Boolean
Dim lngRow As Long
Dim vntTempArray As Variant
On Error GoTo error_handler
With objRange
For lngRow = 1 To .Rows.Count
vntTempArray = .Rows(lngRow).Value
vntTempArray = WorksheetFunction.Transpose( _
WorksheetFunction.Transpose(vntTempArray))
strText = strText & Join(vntTempArray, ";") & vbCrLf
Next
End With
strText = Left$(strText, Len(strText) - 2)
Build_Output_String = True
Exit Function
error_handler:
MsgBox "Fehler: " & CStr(Err.Number) & vbLf & vbLf & _
Err.Description, vbCritical, "Fehler in Prozedur ''Build_Output_String''"
End Function

Private Function Create_UTF8_File(strFileName As String, strText As String) As Boolean
Dim intFileNumber As Integer
Dim bytBuffer() As Byte
Dim lngLength As Long, lngPointer As Long, lngSize As Long
On Error GoTo error_handler
lngLength = Len(strText)
lngPointer = StrPtr(strText)
lngSize = WideCharToMultiByte(CP_UTF8, 0&, _
lngPointer, lngLength, 0&, 0&, 0&, 0&)
ReDim bytBuffer(0 To lngSize - 1)
Call WideCharToMultiByte(CP_UTF8, 0&, lngPointer, _
lngLength, VarPtr(bytBuffer(0)), lngSize, 0&, 0&)
If Dir$(strFileName)  vbNullString Then Call Kill(strFileName)
Reset
intFileNumber = FreeFile
Open strFileName For Binary Access Write As #intFileNumber
Put #intFileNumber, , bytBuffer
Close #intFileNumber
Create_UTF8_File = True
Exit Function
error_handler:
MsgBox "Fehler: " & CStr(Err.Number) & vbLf & vbLf & _
Err.Description, vbCritical, "Fehler in Prozedur ''Create_UTF8_File''"
End Function

´---------------------------------------------------
Vielen Dank für eure Hilfe

Anzeige

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA Makro von 32bit auf 64bit anpassen
10.03.2015 15:24:27
32bit
Hallo,
das liegt an der API-Funktion
#If win64 Then
Private Declare ptrsafe Function WideCharToMultiByte Lib "kernel32.dll" ( _
ByVal CodePage As Long, _
ByVal dwFlags As Long, _
ByVal lpWideCharStr As Long, _
ByVal cchWideChar As Long, _
ByVal lpMultiByteStr As Long, _
ByVal cbMultiByte As Long, _
ByVal lpDefaultChar As Long, _
ByVal lpUsedDefaultChar As Long) As Long
#Else
Private Declare Function WideCharToMultiByte Lib "kernel32.dll" ( _
ByVal CodePage As Long, _
ByVal dwFlags As Long, _
ByVal lpWideCharStr As Long, _
ByVal cchWideChar As Long, _
ByVal lpMultiByteStr As Long, _
ByVal cbMultiByte As Long, _
ByVal lpDefaultChar As Long, _
ByVal lpUsedDefaultChar As Long) As Long
#End If
Gruß
Rudi

Anzeige
AW: VBA Makro von 32bit auf 64bit anpassen
10.03.2015 15:49:18
32bit
Funkioniert so leider immer noch nicht :(

AW: VBA Makro von 32bit auf 64bit anpassen
10.03.2015 16:00:13
32bit
Hallo,
so:
Private Declare PtrSafe Function WideCharToMultiByte Lib "kernel32.dll" ( _
    ByVal CodePage As Long, _
    ByVal dwFlags As Long, _
    ByVal lpWideCharStr As String, _
    ByVal cchWideChar As Long, _
    ByVal lpMultiByteStr As String, _
    ByVal cchMultiByte As Long, _
    ByVal lpDefaultChar As String, _
    ByVal lpUsedDefaultChar As LongPtr) As Long

Gruß
Nepumuk

Anzeige
AW: VBA Makro von 32bit auf 64bit anpassen
10.03.2015 16:03:54
32bit
Hab ich alles versucht, allerdings meldet er immer "Fehler 13: Typen unverträglich.
Ich denke es hat was mit der Build_Output_String Funktion jedoch weis ich nicht wie ich die anpassen muss.
Besten Dank

AW: VBA Makro von 32bit auf 64bit anpassen
10.03.2015 18:18:22
32bit
Hallo,
und nun? Sollen wir raten in welcher Prozedur der Fehler ausgelöst wird?
Gruß
Nepumuk

Anzeige
AW: VBA Makro von 32bit auf 64bit anpassen
10.03.2015 16:07:57
32bit
Hab ich alles versucht, allerdings meldet er immer "Fehler 13: Typen unverträglich.
Ich denke es hat was mit der Build_Output_String Funktion jedoch weis ich nicht wie ich die anpassen muss.
Besten Dank

AW: VBA Makro von 32bit auf 64bit anpassen
10.03.2015 16:16:40
32bit
Hab ich alles versucht, allerdings meldet er immer "Fehler 13: Typen unverträglich.
Ich denke es hat was mit der Build_Output_String Funktion jedoch weis ich nicht wie ich die anpassen muss.
Besten Dank
Anzeige

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige

Infobox / Tutorial

VBA Makro von 32bit auf 64bit anpassen


Schritt-für-Schritt-Anleitung

Um ein VBA-Makro von 32bit auf 64bit zu konvertieren, befolge diese Schritte:

  1. Makro-Anpassung: Ersetze die Declare-Anweisungen in deinem VBA-Code, um die PtrSafe-Klausel hinzuzufügen. Das bedeutet, dass du die API-Funktion wie folgt deklarieren solltest:

    #If Win64 Then
    Private Declare PtrSafe Function WideCharToMultiByte Lib "kernel32.dll" ( _
       ByVal CodePage As Long, _
       ByVal dwFlags As Long, _
       ByVal lpWideCharStr As LongPtr, _
       ByVal cchWideChar As Long, _
       ByVal lpMultiByteStr As LongPtr, _
       ByVal cbMultiByte As Long, _
       ByVal lpDefaultChar As LongPtr, _
       ByVal lpUsedDefaultChar As Long) As Long
    #Else
    Private Declare Function WideCharToMultiByte Lib "kernel32.dll" ( _
       ByVal CodePage As Long, _
       ByVal dwFlags As Long, _
       ByVal lpWideCharStr As Long, _
       ByVal cchWideChar As Long, _
       ByVal lpMultiByteStr As Long, _
       ByVal cbMultiByte As Long, _
       ByVal lpDefaultChar As Long, _
       ByVal lpUsedDefaultChar As Long) As Long
    #End If
  2. Verwendung von LongPtr: Ändere in deinem Code alle Long-Typen, die Zeiger oder Adressen repräsentieren (z.B. lpWideCharStr, lpMultiByteStr), zu LongPtr, um eine 64-Bit-Kompatibilität zu gewährleisten.

  3. Anpassung der Funktionen: Überprüfe und passe alle Funktionen an, die Typen wie StrPtr oder VarPtr verwenden. Zum Beispiel:

    lngPointer = StrPtr(strText) ' bleibt unverändert
    Call WideCharToMultiByte(CP_UTF8, 0, VarPtr(bytBuffer(0)), lngSize, 0, 0, 0, 0) ' hier VarPtr verwenden
  4. Fehlerbehebung: Teste das Makro gründlich, um sicherzustellen, dass alle Funktionen korrekt arbeiten.


Häufige Fehler und Lösungen

  • Fehler 13: Typen unverträglich: Dieser Fehler tritt häufig auf, wenn die Datentypen nicht korrekt deklariert sind. Stelle sicher, dass du LongPtr für Zeiger verwendest und nicht Long.

  • API-Funktion nicht gefunden: Überprüfe, ob die kernel32.dll richtig deklariert ist. Achte darauf, dass die PtrSafe-Klausel enthalten ist, wenn du 64-Bit verwendest.


Alternative Methoden

Falls das Anpassen des bestehenden Codes nicht funktioniert, kannst du folgende Alternativen in Betracht ziehen:

  • Neues Makro erstellen: Erstelle ein neues Makro von Grund auf mit den erforderlichen Anpassungen für 64-Bit.

  • Externe Bibliotheken: Verwende externe Bibliotheken oder Tools, die speziell für die Konvertierung von 32-Bit- auf 64-Bit-VBA-Makros entwickelt wurden.


Praktische Beispiele

Hier ist ein einfaches Beispiel, wie ein 32-Bit VBA-Makro für die 64-Bit-Version angepasst werden kann:

Ursprüngliches 32-Bit Makro:

Private Declare Function WideCharToMultiByte Lib "kernel32.dll" ( _
    ByVal CodePage As Long, _
    ByVal dwFlags As Long, _
    ByVal lpWideCharStr As Long, _
    ByVal cchWideChar As Long, _
    ByVal lpMultiByteStr As Long, _
    ByVal cbMultiByte As Long, _
    ByVal lpDefaultChar As Long, _
    ByVal lpUsedDefaultChar As Long) As Long

Angepasst für 64-Bit:

#If Win64 Then
Private Declare PtrSafe Function WideCharToMultiByte Lib "kernel32.dll" ( _
    ByVal CodePage As Long, _
    ByVal dwFlags As Long, _
    ByVal lpWideCharStr As LongPtr, _
    ByVal cchWideChar As Long, _
    ByVal lpMultiByteStr As LongPtr, _
    ByVal cbMultiByte As Long, _
    ByVal lpDefaultChar As LongPtr, _
    ByVal lpUsedDefaultChar As Long) As Long
#Else
Private Declare Function WideCharToMultiByte Lib "kernel32.dll" ( _
    ByVal CodePage As Long, _
    ByVal dwFlags As Long, _
    ByVal lpWideCharStr As Long, _
    ByVal cchWideChar As Long, _
    ByVal lpMultiByteStr As Long, _
    ByVal cbMultiByte As Long, _
    ByVal lpDefaultChar As Long, _
    ByVal lpUsedDefaultChar As Long) As Long
#End If

Tipps für Profis

  • Verwende Option Explicit: Aktiviere Option Explicit am Anfang deiner Module, um sicherzustellen, dass alle Variablen deklariert sind. Das hilft, Fehler zu vermeiden.

  • Regelmäßige Tests: Teste dein Makro regelmäßig während der Anpassungen, um Fehler frühzeitig zu erkennen.

  • Versionskontrolle: Halte eine Kopie des ursprünglichen Makros, bevor du Änderungen vornimmst. So kannst du bei Bedarf zurückkehren.


FAQ: Häufige Fragen

1. Was ist der Unterschied zwischen 32-Bit und 64-Bit Excel? Der Hauptunterschied besteht darin, dass 64-Bit Excel mehr Arbeitsspeicher nutzen kann, was bei großen Datenmengen vorteilhaft ist.

2. Muss ich alle meine Makros anpassen? Ja, wenn deine Makros API-Funktionen verwenden, musst du sie anpassen, um sicherzustellen, dass sie unter 64-Bit korrekt funktionieren.

3. Was sind StrPtr und VarPtr? StrPtr und VarPtr sind Funktionen, die die Speicheradressen von Strings und Variablen in VBA zurückgeben. Sie sind wichtig, wenn du mit Zeigern arbeitest.

4. Wie kann ich sicherstellen, dass mein Makro auf beiden Versionen funktioniert? Verwende bedingte Kompilierung mit #If Win64 und teste dein Makro sowohl auf 32-Bit- als auch auf 64-Bit-Systemen.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige