Live-Forum - Die aktuellen Beiträge
Datum
Titel
17.10.2025 10:28:49
16.10.2025 17:40:39
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Ordnerauswahl 64-Bit

Forumthread: Ordnerauswahl 64-Bit

Ordnerauswahl 64-Bit
26.01.2013 23:57:59
SteffenS
Hallo Zusammen,
ich habe bis Excel 2010 32-Bit nachfolgenden Code verwendet, um einen Ordner auszuwählen. Leider funktioniert dies unter 64-Bit nicht mehr.
Es erscheint immer der Fehler "Typen unverträglich" in der Zeile
X = SHBrowseForFolder(bInfo)
Was muss ich tun, damit der Code in allen Versionen funktioniert:

Option Explicit
Option Compare Text
'API - Dateiauswahl-Dialog--------------------------------------------------------
Const OFN_READONLY           As Long = &H1
Const OFN_EXPLORER           As Long = &H80000
Const OFN_LONGNAMES          As Long = &H200000
Const OFN_CREATEPROMPT       As Long = &H2000
Const OFN_NODEREFERENCELINKS As Long = &H100000
Const OFN_OVERWRITEPROMPT    As Long = &H2
Const OFN_HIDEREADONLY       As Long = &H4
Const OFS_FILE_OPEN_FLAGS    As Long = OFN_EXPLORER _
Or OFN_LONGNAMES _
Or OFN_CREATEPROMPT _
Or OFN_NODEREFERENCELINKS
Const OFS_FILE_SAVE_FLAGS    As Long = OFN_EXPLORER _
Or OFN_LONGNAMES _
Or OFN_OVERWRITEPROMPT _
Or OFN_HIDEREADONLY
Type OPENFILENAME
nStructSize     As Long
hwndOwner       As Long
hInstance       As Long
sfilter         As String
sCustomFilter   As String
nCustFilterSize As Long
nFilterIndex    As Long
sFile           As String
nFileSize       As Long
sFileTitle      As String
nTitleSize      As Long
sInitDir        As String
sDlgTitle       As String
Flags           As Long
nFileOffset     As Integer
nFileExt        As Integer
sDefFileExt     As String
nCustData       As Long
fnHook          As Long
sTemplateName   As String
End Type
#If Win64 Then
Declare PtrSafe Function GetActiveWindow Lib "user32.dll" () As Long
Declare PtrSafe Function GetOpenFileName Lib "comdlg32.dll" Alias "GetOpenFileNameA" ( _
pOpenfilename As OPENFILENAME) As Long
Declare PtrSafe Function GetSaveFileName Lib "comdlg32.dll" Alias "GetSaveFileNameA" ( _
pOpenfilename As OPENFILENAME) As Long
Declare PtrSafe Function GetShortPathName Lib "kernel32.dll" Alias "GetShortPathNameA" ( _
ByVal lpszLongPath As String, ByVal lpszShortPath As String, ByVal cchBuffer As Long) As Long
Declare PtrSafe Function GetDiskFreeSpace Lib "kernel32" Alias "GetDiskFreeSpaceA" (ByVal  _
lpRootPathName As String, lpSectorsPerCluster As Long, lpBytesPerSector As Long, lpNumberOfFreeClusters As Long, lpTotalNumberOfClusters As Long) As Long
Declare PtrSafe Function SHGetPathFromIDList Lib "shell32.dll" Alias "SHGetPathFromIDListA"  _
(ByVal pidl As Long, ByVal pszPath As String) As Long
'Declare PtrSafe Function SHBrowseForFolder Lib "shell32.dll" Alias "SHBrowseForFolderA" ( _
lpBrowseInfo As BROWSEINFO) As Long
Declare PtrSafe Function SHBrowseForFolder Lib "shell32.dll" Alias "SHBrowseForFolderA" ( _
lpBrowseInfo As BROWSEINFO) As LongPtr
Private Type BROWSEINFO
hOwner As LongPtr
pidlRoot As Long
pszDisplayName As String
lpszTitle As String
ulFlags As Long
lpFn As LongPtr
lParam As LongPtr
iImage As Long
End Type
#Else
Declare Function GetActiveWindow Lib "user32.dll" () As Long
Declare Function GetOpenFileName Lib "comdlg32.dll" Alias "GetOpenFileNameA" (pOpenfilename  _
As OPENFILENAME) As Long
Declare Function GetSaveFileName Lib "comdlg32.dll" Alias "GetSaveFileNameA" (pOpenfilename  _
As OPENFILENAME) As Long
Declare Function GetShortPathName Lib "kernel32.dll" Alias "GetShortPathNameA" (ByVal  _
lpszLongPath As String, ByVal lpszShortPath As String, ByVal cchBuffer As Long) As Long
Declare Function GetDiskFreeSpace Lib "kernel32" Alias "GetDiskFreeSpaceA" (ByVal  _
lpRootPathName As String, lpSectorsPerCluster As Long, lpBytesPerSector As Long, lpNumberOfFreeClusters As Long, lpTotalNumberOfClusters As Long) As Long
Declare Function SHGetPathFromIDList Lib "shell32.dll" Alias "SHGetPathFromIDListA" (ByVal  _
pidl As Long, ByVal pszPath As String) As Long
Declare Function SHBrowseForFolder Lib "shell32.dll" Alias "SHBrowseForFolderA" ( _
lpBrowseInfo As BROWSEINFO) As Long
Public Type BROWSEINFO
hOwner As Long
pidlRoot As Long
pszDisplayName As String
lpszTitle As String
ulFlags As Long
lpFn As Long
lParam As Long
iImage As Long
End Type
#End If
Function GetDirectory(Optional msg As String) As String
Dim bInfo As BROWSEINFO
Dim Path As String
Dim r As Long, X As Long, pos As Integer
10        bInfo.pidlRoot = 0&
20        If IsMissing(msg) Then
30            bInfo.lpszTitle = "Wählen Sie bitte einen Ordner aus."
40        Else
50            bInfo.lpszTitle = msg
60        End If
70        bInfo.ulFlags = &H1
80        X = SHBrowseForFolder(bInfo)
90        Path = Space$(512)
100       r = SHGetPathFromIDList(ByVal X, ByVal Path)
110       If r Then
120           pos = InStr(Path, Chr$(0))
130           GetDirectory = Left(Path, pos - 1)
140       Else
150           GetDirectory = ""
160       End If
End Function
Sub test123()
Dim sFilepath As String
sFilepath = GetDirectory
MsgBox (sFilepath)
End Sub
Danke Euch schonmal
VG
Steffen Schmerler

Anzeige

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

Betreff
Datum
Anwender
Anzeige
AW: Ordnerauswahl 64-Bit
27.01.2013 08:01:35
UDF
Hallo Steffen,
X solltest Du als Double ggf. als Variant definieren.
Gruß
Markus

AW: Ordnerauswahl 64-Bit
27.01.2013 11:27:38
SteffenS
Hey,
super das wars jetzt geht es bei allen Versionen.
Danke
VG
Steffen
Anzeige
;

Forumthreads zu verwandten Themen

Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige

Infobox / Tutorial

Ordnerauswahl in Excel VBA für 64-Bit-Versionen


Schritt-für-Schritt-Anleitung

Um die Ordnerauswahl in Excel VBA für 64-Bit-Versionen korrekt durchzuführen, musst Du den Code entsprechend anpassen. Hier ist eine Schritt-für-Schritt-Anleitung:

  1. Definiere die benötigten Konstanten und Typen. Stelle sicher, dass Du die PtrSafe-Deklarationen verwendest:

    #If Win64 Then
    Declare PtrSafe Function SHBrowseForFolder Lib "shell32.dll" Alias "SHBrowseForFolderA" ( _
    lpBrowseInfo As BROWSEINFO) As LongPtr
    Declare PtrSafe Function SHGetPathFromIDList Lib "shell32.dll" Alias "SHGetPathFromIDListA"  _
    (ByVal pidl As Long, ByVal pszPath As String) As Long
    #Else
    ' 32-Bit Deklarationen
    #End If
  2. Erstelle die BROWSEINFO-Struktur. Diese Struktur ist notwendig, um Informationen über den Dialog zu speichern:

    Private Type BROWSEINFO
       hOwner As LongPtr
       pidlRoot As Long
       pszDisplayName As String
       lpszTitle As String
       ulFlags As Long
       lpFn As LongPtr
       lParam As LongPtr
       iImage As Long
    End Type
  3. Implementiere die GetDirectory-Funktion. Diese Funktion öffnet den Ordnerauswahl-Dialog und gibt den ausgewählten Ordner zurück:

    Function GetDirectory(Optional msg As String) As String
       Dim bInfo As BROWSEINFO
       Dim Path As String
       Dim r As Long, X As Long, pos As Integer
    
       bInfo.pidlRoot = 0
       bInfo.lpszTitle = IIf(IsMissing(msg), "Wählen Sie bitte einen Ordner aus.", msg)
       bInfo.ulFlags = &H1
       X = SHBrowseForFolder(bInfo)
       Path = Space$(512)
       r = SHGetPathFromIDList(ByVal X, ByVal Path)
    
       If r Then
           pos = InStr(Path, Chr$(0))
           GetDirectory = Left(Path, pos - 1)
       Else
           GetDirectory = ""
       End If
    End Function
  4. Testen des Codes. Verwende die test123-Subroutine, um die Funktion zu testen:

    Sub test123()
       Dim sFilepath As String
       sFilepath = GetDirectory
       MsgBox (sFilepath)
    End Sub

Häufige Fehler und Lösungen

  1. Typen unverträglich:

    • Dieser Fehler tritt häufig auf, wenn Variablen nicht korrekt deklariert werden. Stelle sicher, dass die Variable X als LongPtr oder Double deklariert wird, um in 64-Bit-Versionen von Excel zu funktionieren.
  2. Falsche API-Deklarationen:

    • Überprüfe, ob Du die PtrSafe-Deklarationen für 64-Bit verwendest. Andernfalls wird der Code in 64-Bit-Umgebungen nicht funktionieren.

Alternative Methoden

Neben der Verwendung von SHBrowseForFolder, kannst Du auch die Application.FileDialog-Methode nutzen. Diese Methode ist einfacher und benötigt keine API-Deklarationen:

Sub SelectFolder()
    Dim fd As FileDialog
    Set fd = Application.FileDialog(msoFileDialogFolderPicker)

    If fd.Show = -1 Then
        MsgBox "Ausgewählter Ordner: " & fd.SelectedItems(1)
    End If
End Sub

Praktische Beispiele

Hier sind einige Beispiele, wie Du die Ordnerauswahl in verschiedenen Szenarien einsetzen kannst:

  • Ordner für den Import von Daten auswählen:

    Sub ImportData()
       Dim folderPath As String
       folderPath = GetDirectory("Wählen Sie den Ordner für den Import aus.")
       ' Hier kannst Du den Import-Code hinzufügen
    End Sub
  • Ordner für das Speichern von Berichten auswählen:

    Sub SaveReport()
       Dim folderPath As String
       folderPath = GetDirectory("Wählen Sie den Speicherort für den Bericht aus.")
       ' Hier kannst Du den Speichern-Code hinzufügen
    End Sub

Tipps für Profis

  • Verwende Option Explicit am Anfang Deines Moduls. Dadurch wird sichergestellt, dass alle Variablen deklariert werden, was Fehler verhindert.
  • Testen in verschiedenen Excel-Versionen: Teste Deinen Code in sowohl 32-Bit als auch 64-Bit-Versionen von Excel, um sicherzustellen, dass alles reibungslos funktioniert.
  • Verwende Debug.Print für die Fehlersuche: Wenn Du Probleme hast, kann das Ausgeben von Variablenwerten in das Direktfenster hilfreich sein.

FAQ: Häufige Fragen

1. Warum funktioniert mein Code nicht in der 64-Bit-Version von Excel? Der Code muss mit PtrSafe-Deklarationen angepasst werden, um in 64-Bit-Umgebungen zu funktionieren. Überprüfe die Deklarationen für die API-Funktionen.

2. Kann ich die SHBrowseForFolder-Funktion in 32-Bit verwenden? Ja, Du kannst die gleiche Funktionalität in 32-Bit verwenden, indem Du die entsprechenden Deklarationen ohne PtrSafe verwendest.

3. Was ist der Unterschied zwischen SHGetPathFromIDList und SHBrowseForFolder? SHBrowseForFolder öffnet den Ordnerauswahl-Dialog, während SHGetPathFromIDList den tatsächlichen Pfad des ausgewählten Ordners zurückgibt.

4. Wie kann ich sicherstellen, dass mein VBA-Code plattformunabhängig ist? Verwende bedingte Kompilierung, um sicherzustellen, dass die richtige API-Deklaration für die jeweilige Plattform verwendet wird.

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