VBA Makro auf Office x64 umstellen

S

SandManTR

Guest
Moin,

ich musste aus performance Gründen Office x64 installieren und VBA Makros laufen ja nicht unbedingt auf dem x64, wenn diese für
x86 programmiert wurden... bis auf eine Zeile konnte ich alle Fehler finden und es x64 tauglich machen, vlt. hat hier ja jemand einen Tipp
was ich ändern müsste für die 64 bit Version?

Der VBA Editor bleibt immer hier hängen:

sPath = Left(sPath, Len(sPath) - (Len(sFilename) + 1))
 
Ich übersetze mal:

String Dateipfad = Linker String (ursprünglicher Dateipfad, Länge (ursprünglicher Dateipfad) "ohne" (Länge (des Dateinamens) plus 1 Zeichen))


Kann eigentlich nur schiefgehen, wenn Dateipfad entweder nicht richtig als String definiert wurde oder tatsächlicher x64-Dateipfad länger ist als Definition Dateipfad.

Kann aber auch ein Iterationsfehler sein, weil x64 neu compiliert wurde. Dann wäre die bessere Variante...

new_sPath = Left(sPath, Len(sPath) - (Len(sFilename) + 1))
sPath = new_sPath
 
Zuletzt bearbeitet:
schon mal Danke für deine Hilfe. Bisher konnte ich den Fehler noch nicht ausfindig machen, wenn ich die Zeile über der oben genannten ausklammere, funktioniert das Makro auch. Daher nehme ich jetzt an, das die Zeile drüber das Problem ist. Aber auch bei der scheint der Code in Ordnung zu sein...
 
Bisher konnte ich den Fehler noch nicht ausfindig machen, wenn ich die Zeile über der oben genannten ausklammere, funktioniert das Makro auch. Daher nehme ich jetzt an, das die Zeile drüber das Problem ist.

Und wie lautet die ominöse Zeile? :)
 
Code:
Sub SplitPath(ByVal sSourcePath As String, ByRef sDrive As String, _  
ByRef sPath As String, ByRef sFilename As String, _ 
ByRef sExtension As String)

' Laufwerk extrahieren    
sDrive = sSourcePath    
Call PathStripToRoot(sDrive): sDrive = TrimNull(sDrive)    
' Dateiname extrahieren    
sFilename = GetStrFromPtrA(PathFindFileName(sSourcePath))   
' Dateiendung extrahieren   
 sExtension = GetStrFromPtrA(PathFindExtension(sSourcePath))    
' Verzeichnis ermitteln   
 sPath = sSourcePath    

sPath = GetStrFromPtrA(PathFindNextComponent(sPath))   

 sPath = Left(sPath, Len(sPath) - (Len(sFilename) + 1))    
' Dateiname ohne Extension ermitteln    
sFilename = Left(sFilename, Len(sFilename) - Len(sExtension))
End Sub
irgendwo im fett markierten Bereich scheint es ein Problem zu geben. Wobei ich nicht weiß, ob man
den gesamten Quellcode für das Problem haben müsste, den ich aber ungern komplett öffentlich posten würde...
 
Zuletzt bearbeitet:
ne das war ein copy & pasted fehler, hier im Forum ist alles in einer Zeile gelandet weshalb ich das dann manuell wieder trennen musste.
 
sPath = GetStrFromPtrA(PathFindNextComponent(sPath))

Es ist ein x86-x64-Problem: Wenn Du den String an dieser Stelle ausdruckst, wirst Du feststellen, dass der String leer ist.

Die Variable sPath = sSourcePath, die vom GetStrFromPtrA(PathFindNextComponent(sPath)) verwendet wird, muss hier im 64-Bit-Modus sein.

Laufwerk, Dateiname und Dateiendung sind fest definiert und kleiner als 4 Byte, aber das Verzeichnis sieht unter x64 anders aus als in x86,
es kann länger als 4 Byte sein.

Die Variablen müssen also "weiter oben" definitiv als 64-Bit-Variablen definiert sein oder in 64-Bit konvertiert werden.

Das steht zu mindestens hier...

TypElementBeschreibung
QualifiziererPtrSafeGibt an, dass die Declare-Anweisung mit 64-Bit-Systemen kompatibel ist. Dieses Attribut ist auf 64-Bit-Systemen obligatorisch.
DatentypLongPtrEin variabler Datentyp, der auf 32-Bit-Versionen von Office 2010 als 4-Byte-Datentyp und auf 64-Bit-Versionen als 8-Byte-Datentyp ausgelegt ist. Seine Verwendung wird zum Deklarieren eines Zeigers oder Handles für neuen Code, aber auch für älteren Code empfohlen, wenn dieser in der 64-Bit-Version von Office 2010 ausgeführt werden soll. Der Datentyp wird auf 32-Bit- und 64-Bit-Systemen nur in der VBA 7-Laufzeit unterstützt. Sie können dem Datentyp numerische Werte, aber keine numerischen Typen zuweisen.
DatentypLongLongEin 8-Byte-Datentyp, der nur in 64-Bit-Versionen von Office 2010 zur Verfügung steht. Sie können ihm numerische Werte, aber keine numerischen Typen zuweisen (um Abschneiden zu vermeiden).
KonvertierungsoperatorCLngPtrKonvertiert einen einfachen Ausdruck in einen LongPtr-Datentyp.
KonvertierungsoperatorCLngLngKonvertiert einen einfachen Ausdruck in einen LongLong-Datentyp.
FunktionVarPtrVariantenkonverter. Gibt auf 64-Bit-Versionen LongPtr und auf 32-Bit-Versionen Long (4 Bytes) zurück.
FunktionObjPtrObjektkonverter. Gibt auf 64-Bit-Versionen LongPtr und auf 32-Bit-Versionen Long (4 Bytes) zurück.
FunktionStrPtrZeichenfolgenkonverter. Gibt auf 64-Bit-Versionen LongPtr und auf 32-Bit-Versionen Long (4 Bytes) zurück.


Vielleicht ist der Fehler mit sPath = StrPtr(sSourcePath) anstelle von sPath = sSourcePath schon behoben...
 
Zuletzt bearbeitet:
  • ok1.de
  • thinkstore24.de
  • Preiswerte-IT - Gebrauchte Lenovo Notebooks kaufen
Zurück
Oben