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

Forumthread: Windows 32 und 64bit

Windows 32 und 64bit
06.05.2013 09:28:38
Mark
Hallo zusammen,
ich habe ein Excel-Dokument das zentral auf einem Server liegt. Mehrere Nutzer können das Dokument öffnen und bearbeiten, speichern, usw..
Leider haben die Nutzer verschiedene Excel Versionen (2003-2010) und jetzt auch verschiedene Bit-Systeme (32+64bit).
Für das Programm habe ich ein VBA-Code von Hajo benutzt. Dieser basiert scheinbar auf einem 32bit Programmiercode. Wenn ich die Datei mit einem 64bit Rechner öffnen möchte, erscheint eine Fehlermeldung (siehe unten).
Gibt es eine Möglichkeit, dass die Datei von 32 und 64 bit Systemen geöffnet werden kann?
Zum besseren Verständnis - hier die Fehlermeldung:
Userbild
... und hier der Code:
Option Explicit ' Variablendefinition erforderlich
Option Private Module ' damit Makros nich von Hand gestartet werden können
'**************************************************
'* H. Ziplies *
'* 12.08.10 *
'* erstellt von HajoZiplies@web.de *
'* http://Hajo-Excel.de/
*
'* abgeändert von Nepumuk 23.05.2004 *
'* Userform immer im Vordergrund *
'**************************************************
Public Declare

Function FindWindow Lib "User32" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Public Declare 

Function SetWindowPos Lib "User32" (ByVal hwnd As Long, _
ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, _
ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
Declare 

Function SetActiveWindow Lib "user32.dll" (ByVal hwnd As Long) As Long
Public Enum Parameter
HWND_TOPMOST = -1
SWP_NOSIZE = &H1
SWP_NOMOVE = &H2
SWP_NOACTIVATE = &H10
SWP_SHOWWINDOW = &H40
End Enum
Public DaEt As Date                         ' Prüfzeit für Eingabe in der Tabelle
Public DaET1 As Date                        ' Prüfzeit für Reaktion in Userform
Public DaET2 As Date                        ' Zeit zum Wechsel der Anzeige
Public BoZu As Boolean                      ' Variable Zustand
Public Const DaZeit As Date = "00:00:40"    ' Zeitabstand prüfen, Eingabe Tabelle
Public Const DaZeit1 As Date = "00:00:30"   ' Zeitabstand prüfen, Userform
Public Const DaZeit2 As Date = "00:00:01"   ' Zeitabstand für Restzeit
Public BoEnde As Boolean                    ' Variable Beenden

Sub Zeitmakro()                             ' Zeitmakro Eingabe Tabelle
BoZu = False
' Fehlerbehandlung ausschalten
On Error Resume Next
' Makro anhalten
Application.OnTime EarliestTime:=DaET1, Procedure:="Zeitmakro", Schedule:=False
' Fehlerbehandlung einschalten
On Error GoTo 0
' neue Startzeit setzen
DaEt = Now + DaZeit
' Makro zum festgelegten Zeitpunkt starten
Application.OnTime DaEt, "Start"
End Sub

Sub Start() ' Zeitmakro Anzeige Userform
DaET1 = Now + DaZeit1 ' Zeit für das schließen der Datei festlegen
Application.OnTime DaET1, "Schließen" ' Makro zum festgelegten Zeitpunkt starten
SetActiveWindow FindWindow("xlMain", vbNullString)
frm_Abfrage.Show ' UserForm starten
End Sub

Sub Schließen()
'Unload UserForm1
If BoZu = False Then
ThisWorkbook.Save ' Datei speichern
' falls nur eine Datei auf Excel schließen
' ess erfolgt eine Abfrage zum speichern
If Workbooks.Count = 1 Then Application.Quit Else ThisWorkbook.Close
End If
End Sub

Sub Zeitabstand() ' Makro für laufende Zeit in UserForm
With frm_Abfrage
' neue Zeit auf das Label schreiben
.LbL_Zeit.Caption = "Restzeit: " & CDate(CDate(Right(.LbL_Zeit.Caption, 8)) _
- DaZeit2)
' Prüfen ob Zeit abgelaufen ist
If CDate(Right(.LbL_Zeit.Caption, 8)) > 0 Then
' neue Startzeit setzen
DaET2 = Now + DaZeit2
' Makro zum festgelegten Zeitpunkt starten
Application.OnTime DaET2, "Zeitabstand"
End If
End With
End Sub

Anzeige

10
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Windows 32 und 64bit
06.05.2013 09:44:58
EtoPHG
Hallo Mark,
In diesem Thread wurde das Thema vor Kurzem behandelt. Ich hoffe, das hilft dir weiter.
Gruess Hansueli

AW: Windows 32 und 64bit
06.05.2013 10:25:28
Mark
Hallo Hansueli,
ich habe den Beitrag gelesen, kann aber damit nicht viel anfangen.
Ich benutze eigentlich nur Commandbutton und Checkboxen. Diese zählen hoffentlich nicht zu den ActiveX-Steuerelementen. Wenn ich den Beitrag richtig verstanden habe, lassen ActiveX-Steuerelemente nicht von 32 und 64bit Systemen öffnen - also entweder 32 oder 64!
Für meinen Fall müsste es dann aber eigentlich funktionieren.Da mein VBA eher nicht so gut ist, habe ich hier das Dokument nochmal hochgeladen.
https://www.herber.de/bbs/user/85205.zip

Anzeige
AW: Windows 32 und 64bit
06.05.2013 11:00:44
Rudi
Hallo,
Ändere mal:
#If win64 Then
Public Declare ptrsafe Function FindWindow Lib "User32" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As ptrLong
Public Declare ptrsafe Function SetWindowPos Lib "User32" (ByVal hwnd As Long, _
ByVal hWndInsertAfter As ptrLong, ByVal X As ptrLong, ByVal Y As ptrLong, _
ByVal cx As ptrLong, ByVal cy As ptrLong, ByVal wFlags As ptrLong) As ptrLong
Declare ptrsafe Function  SetActiveWindow Lib "user32.dll" (ByVal hwnd As ptrLong) As ptrLong
#Else
Public Declare Function FindWindow Lib "User32" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Public Declare Function SetWindowPos Lib "User32" (ByVal hwnd As Long, _
ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, _
ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
Declare Function SetActiveWindow Lib "user32.dll" (ByVal hwnd As Long) As Long
#End If

Stör dich nicht am Debugger.
Gruß
Rudi

Anzeige
AW: Windows 32 und 64bit
06.05.2013 11:33:22
Mark
Den Code habe ich ausprobiert.
Er funktioniert leider nicht, oder ich habe was falsch gemacht.
Habe auch "vba7" statt "win64" ausprobiert!

Was genau heisst: Er funktioniert nicht? (owT)
06.05.2013 11:34:44
EtoPHG

AW: Was genau heisst: Er funktioniert nicht? (owT)
06.05.2013 11:53:02
Mark
Auf meinem Win32 Rechner mit Excel 32bit funktioniert der Code.
Auf einem 64bit Rechner mit Excel 64bit bleibt der Code hier hängen...
Userbild
...oder muss hier "User64" und "user64.dll" stehen?
Gruß
-Mark-

Anzeige
Das kann so nicht funtkioneren!
06.05.2013 12:17:56
EtoPHG
Hallo Mark,
Zitat:
Auf einem 64bit Rechner mit Excel 64bit bleibt der Code hier hängen...
Wenn du nochmals alles genau durchliest (inkl. und v.a. dem verlinkten Thread!) und du hast wirklich ein 64Bit Excel, dann musst dir doch klar sein: 64Bit-Excel kann nicht mit 32Bit-Steuerelementen arbeiten!
Es ist selbst von Microsoft empfohlen 64Bit-Office nur dann zu installieren/benutzen, wenn es durch unabdingbar ist, siehe Auswählen der 32-Bit- oder 64-Bit-Version von Office
Du musst in deinem Fall 2 verschiedene Versionen deiner Arbeitsmappen haben:
1x 32Bit-Steuerelemente und 32Bit API-Calls für EXCEL-32Bit unter WINDOWS-32Bit oder WINDOWS-64Bit
1x 64Bit-Steuerelemente und 32/64Bit API-Calls für EXCEL-64Bit unter WINDOWS-64Bit
Ist jetzt alles klar?
Gruess Hansueli

Anzeige
AW: Das kann so nicht funtkioneren!
06.05.2013 12:26:17
Mark
Ja, vielen dank!
Gruß
-Mark-

AW: Windows 32 und 64bit
06.05.2013 11:01:43
EtoPHG
Hallo Mark,
Du benutzt ActiveX-Steuerelemente (auch deine Commandbutton und CheckBoxen gehören dazu!) und API-Calls.
Für die ActiveX-Steuerelemente in deiner Mappe gilt:
Diese können nur auf einem EXCEL-32Bit unter Windows-32Bit oder Windows-64Bit laufen. Sie können nicht auf einem Office-64Bit verwendet werden! Es kommt für die Steuerelemente primär auf die EXCEL-Version und Bitbreite an, nicht auf die des Betriebssystems.
Für eine API-Calls (z.B. den Code von Hajo) gilt:
Die Functions müssen gemäss der Codestruktur deklariert werden, wie sie in diesem Microsoft Artikel erwähnt wird.
Gruess Hansueli

Anzeige
AW: Windows 32 und 64bit
06.05.2013 11:41:12
Mark
Den Microsoft Artikel habe ich auch versucht einzubauen. Das ist scheinbar auch das was Rudi Maintaire geschrieben hat. Nur irgendwas mache ich dabei wohl falsch!
Möglicherweise sollte ich das Programm wohl ganz umstrichen, so dass man es von allen möglichen Versionen nutzen kann. Da muss ich aber nochmal drüber nachdenken.
Vielen Dank erstmal für die Unterstützung!
Gruß
-Mark-
Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige

Infobox / Tutorial

Windows 32 und 64bit: Excel VBA anpassen


Schritt-für-Schritt-Anleitung

Um Excel VBA-Code kompatibel für 32- und 64-Bit-Systeme zu machen, folge diesen Schritten:

  1. Öffne den VBA-Editor in Excel (drücke ALT + F11).

  2. Füge die folgenden Deklarationen am Anfang deines Moduls ein. Diese Deklarationen ermöglichen die Verwendung der API-Calls in beiden Versionen:

    #If Win64 Then
        Public Declare PtrSafe Function FindWindow Lib "User32" Alias "FindWindowA" _
        (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
        Public Declare PtrSafe Function SetWindowPos Lib "User32" (ByVal hwnd As LongPtr, _
        ByVal hWndInsertAfter As LongPtr, ByVal X As Long, ByVal Y As Long, _
        ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As LongPtr
        Declare PtrSafe Function SetActiveWindow Lib "user32.dll" (ByVal hwnd As LongPtr) As LongPtr
    #Else
        Public Declare Function FindWindow Lib "User32" Alias "FindWindowA" _
        (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
        Public Declare Function SetWindowPos Lib "User32" (ByVal hwnd As Long, _
        ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, _
        ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
        Declare Function SetActiveWindow Lib "user32.dll" (ByVal hwnd As Long) As Long
    #End If
  3. Ersetze alle Datentypen von Long zu LongPtr, wenn du auf 64-Bit versionierst.

  4. Teste den Code auf beiden Systemen, um sicherzustellen, dass alles reibungslos funktioniert.


Häufige Fehler und Lösungen

  • Fehlermeldung bei 64-Bit-Excel: „Benutzerdefinierte Funktion nicht gefunden“.

    • Lösung: Stelle sicher, dass alle API-Deklarationen mit PtrSafe versehen sind und LongPtr verwendet wird.
  • Der Code funktioniert nicht auf 64-Bit-Rechnern:

    • Lösung: Überprüfe, ob alle ActiveX-Steuerelemente und API-Calls korrekt deklariert sind. ActiveX-Steuerelemente können auf 64-Bit Excel nicht verwendet werden, wenn sie für 32-Bit erstellt wurden.

Alternative Methoden

Falls du auf 64-Bit Excel nicht verzichten kannst, ziehe in Betracht, die ActiveX-Steuerelemente zu ersetzen. Verwende stattdessen Formularelemente, die in beiden Versionen funktionieren.

Eine weitere Möglichkeit besteht darin, separate Versionen deiner Arbeitsmappe zu erstellen, eine für 32-Bit und eine für 64-Bit, um die Kompatibilität zu gewährleisten.


Praktische Beispiele

Hier ist ein einfaches Beispiel, wie du die Funktion FindWindow in deinem VBA-Code verwenden kannst:

Sub Beispiel_Fenster_Finden()
    Dim hwnd As LongPtr
    hwnd = FindWindow("Excel", vbNullString)
    If hwnd <> 0 Then
        MsgBox "Fenster gefunden!"
    Else
        MsgBox "Fenster nicht gefunden."
    End If
End Sub

Mit diesem Code kannst du überprüfen, ob das Excel-Hauptfenster geöffnet ist.


Tipps für Profis

  • Verwende bedingte Kompilierung (#If Win64) für eine saubere Trennung zwischen 32-Bit und 64-Bit spezifischem Code.
  • Halte deine API-Deklarationen in einem Modul, um die Wartung zu erleichtern.
  • Nutze LongPtr anstelle von Long in allen API-Deklarationen, um sicherzustellen, dass dein Code auf 64-Bit-Systemen funktioniert.

FAQ: Häufige Fragen

1. Was ist der Unterschied zwischen 32-Bit und 64-Bit Excel?
32-Bit Excel kann nur 32-Bit API-Calls und ActiveX-Steuerelemente verwenden, während 64-Bit Excel 64-Bit spezifische API-Calls benötigt.

2. Warum funktioniert mein VBA-Code nicht auf 64-Bit Excel?
Das liegt meist daran, dass du 32-Bit spezifische API-Calls oder ActiveX-Steuerelemente verwendest, die nicht mit 64-Bit Excel kompatibel sind. Achte darauf, deine Deklarationen entsprechend anzupassen.

3. Wie kann ich sicherstellen, dass mein VBA-Code auf beiden Versionen läuft?
Verwende die bedingte Kompilierung mit #If Win64 und passe deine API-Deklarationen an, um sicherzustellen, dass sie sowohl auf 32-Bit als auch auf 64-Bit Systemen funktionieren.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige