Newsgroup: it.comp.appl.access
Titolo: problema con BrowseFolder eseguito su office 64 bit e windows 11

BrowseFolder eseguito su office 64 bit windows 11 crasha il db e lo chiude
creando una copia automatica di backup, all'avvio successivo mi chiede se voglio aprire il db in modalità provvisoria.
 
facendo il debug il db crasha quando esegue il comando browserfolder definito come segue
 
Conoscete un alternativa a browserfolder per selezionare una cartella di windows?
 
'se 64 bit
#If VBA7 Then
    Private Declare PtrSafe Function SHGetPathFromIDList Lib "shell32.dll" Alias "SHGetPathFromIDListA" (ByVal pidl As Long, ByVal pszPath As String) As Long
    Private Declare PtrSafe Function SHBrowseForFolder Lib "shell32.dll" Alias "SHBrowseForFolderA" (lpBrowseInfo As BROWSEINFO) As Long
#Else
    Private Declare Function SHGetPathFromIDList Lib "shell32.dll" Alias "SHGetPathFromIDListA" (ByVal pidl As Long, ByVal pszPath As String) As Long
    Private Declare Function SHBrowseForFolder Lib "shell32.dll" Alias "SHBrowseForFolderA" (lpBrowseInfo As BROWSEINFO) As Long
#End If
 
 
Private 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
 
Private Const BIF_RETURNONLYFSDIRS = &H1&
 
 
Function BrowseFolder(szDialogTitle As String) As String
  Dim X As Long, bi As BROWSEINFO, dwIList As Long
  Dim szPath As String, wPos As Integer
 
    With bi
        .hOwner = hWndAccessApp
        .lpszTitle = szDialogTitle
        .ulFlags = BIF_RETURNONLYFSDIRS
    End With
 
    dwIList = SHBrowseForFolder(bi)
    szPath = Space$(512)
    X = SHGetPathFromIDList(ByVal dwIList, ByVal szPath)
 
    If X Then
        wPos = InStr(szPath, Chr(0))
        BrowseFolder = Left$(szPath, wPos - 1)
    Else
        BrowseFolder = ""
    End If
End Function


ho pensato un altra volta a chatGPT e questa è la sua risposta
 
Sì, esiste un'alternativa a BrowserFolder in VBA per scegliere una cartella. Puoi utilizzare il FileDialog per aprire una finestra di dialogo per la selezione della cartella. Ecco un esempio di come farlo:
 
Sub SelezionaCartella()
    Dim dlg As FileDialog
    Dim cartellaSelezionata As String
 
    ' Crea un nuovo oggetto FileDialog
    Set dlg = Application.FileDialog(msoFileDialogFolderPicker)
 
    ' Imposta le opzioni del dialogo
    With dlg
        .Title = "Seleziona una cartella"
        .AllowMultiSelect = False
        ' Mostra il dialogo e verifica se l'utente ha fatto una selezione
        If .Show = -1 Then
            ' Ottieni il percorso completo della cartella selezionata
            cartellaSelezionata = .SelectedItems(1)
            ' Fai qualcosa con il percorso della cartella selezionata
            MsgBox "Hai selezionato la cartella: " & cartellaSelezionata
        Else
            ' Nessuna cartella selezionata, esegui azione di conseguenza
            MsgBox "Nessuna cartella selezionata."
        End If
    End With
 
    ' Libera la memoria
    Set dlg = Nothing
End Sub
 

 windows?
 
uso qualcosa di simile, per andare ad aprire un file e poi lavorarci 
su, se ben ricordo me lo avevano suggerito qui sul ng, NON per 
selezionare una cartella
 
Il codice associato al bottone comincia così e va a chiamare la 
function selectFile()
 
 
------ da qui -------
Private Sub ImportTransactions_Click()
On Error GoTo Err_ImportTransactions_Click
 
Dim MyName, TableName, MyDir As String
 
TableName = "TempStockMovements"
 
MyName = selectFile()
SysCmd acSysCmdSetStatus, "Importing : " & MyName
On Error Resume Next
' etc etc
------ a qui -------
 
 
la function opera come mostrato qui sotto, restituendo il fileName (e 
qui aggiungo: forse è in grado di operare anche per restituire la 
cartella, quello che ti serve, con un apposito parametro tipo 
msoFileDialogFolderPicker sempre che esista)
 
------ da qui -------
Function selectFile()
Dim fd As FileDialog, fileName As String
 
On Error GoTo ErrorHandler
 
Set fd = Application.FileDialog(msoFileDialogFilePicker)
 
fd.AllowMultiSelect = False
 
If fd.Show = True Then
    If fd.SelectedItems(1) <> vbNullString Then
        fileName = fd.SelectedItems(1)
    End If
Else
    'Exit code if no file is selected
    End
End If
 
'Return Selected FileName
selectFile = fileName
 
Set fd = Nothing
 
Exit Function
 
ErrorHandler:
Set fd = Nothing
MsgBox "Error " & Err & ": " & Error(Err)
 
End Function
------ a qui -------
 
-- 
/-\ /\/\ /\/\ /-\ /\/\ /\/\ /-\ T /-\
-=- -=- -=- -=- -=- -=- -=- -=- - -=-
........... [ al lavoro ] ...........