XL 2010 Convertir Excel/VBA 32 bits en 64 bits

acier

XLDnaute Nouveau
Bonjour,

J'utilisais une macro sans problème avec Excel 2010 (32bits).
Maintenant, que j'utilise Excel 2010 (64bits), elle ne fonctionne plus.
Est-ce quelqu'un peut m'aider en convertissant le code ci-dessous pour être utilisé sous Excel 2010 (64 bits).

Merci d'avance

PS: Cette macro a été préparée pour renommer un lot de fichiers à la fois.
---------------------------------------


Option Explicit
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

'32-bit API declarations
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


Function GetDirectory(Optional Msg) As String
Dim bInfo As BROWSEINFO
Dim Path As String
Dim r As Long, x As Long, pos As Integer
' Root folder = Desktop
bInfo.pidlRoot = 0&

' Title in the dialog
If IsMissing(Msg) Then
bInfo.lpszTitle = "Select a folder."
Else
bInfo.lpszTitle = Msg
End If

' Type of directory to return
bInfo.ulFlags = &H1

' Display the dialog
x = SHBrowseForFolder(bInfo)

' Parse the result
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
 
C

Compte Supprimé 979

Guest
Bonjour Acier

Sujet maintes et maintes fois abordé, il suffit de cherche un petit peu avec l'ami google ;)

Ce lien n'existe plus

Il faut utiliser la constante de compilation #Win64

A+
 

acier

XLDnaute Nouveau
Bonjour Bruno,

Avant de poster mon message j'ai été sur google.
J'ai aussi visité la page indiquée par le lien que vous avez posté.
Mais étant un simple utilisateur, tout ce que j'ai lu ne m'a pas aidé.
Vous me demandez d'utiliser la constante de compilation #Win64, franchement je ne sais pas le faire.
Malheureusement je suis au même point de départ avec une macro que je ne peux pas utiliser.
J'attends toujours de l'aide.

Merci
 

acier

XLDnaute Nouveau
Bonjour Yuperqod,

J'ai réécris les lignes en "rouge" et je les ai remplacées par
"Declare PtrSafe Function GetActiveWindow Lib "user32" () As LongPtr".

Par contre, je n'ai pas bien compris quand vous dites:
"Il faut modifier pour SHBrowseForFolder Lib et pour SHBrowseForFolder Lib"
Vous répétez 2 fois la syntaxe SHBrowseForFolder Lib.

Enfin, ci-joint l'image du code avec "erreur de compilation"

Merci pour votre aide.

I]
 

Yurperqod

XLDnaute Occasionnel
C'est une erreur de copier/coller

Il faut modifier pour les deux fonctions
Et il ne faut pas remplacer mais récrire les fonctions existantes comme la ligne (qui vient du lien de Microsoft) que j'ai pris pour modèle.
Donc comme çà (pour la première)
Declare PtrSafe Function SHGetPathFromIDList Lib "shell32.dll" _
Alias "SHGetPathFromIDListA" (ByVal pidl As Long, ByVal pszPath As String) _
As LongPtr
 

acier

XLDnaute Nouveau
Yuperqod,

Merci pour votre aide.
Ne comprenant pas grand chose au langage VBA, j'ai choisi la solution la plus simple en désinstallant la version 64bits et en réinstallant la version 32bits.
Tout est redevenu comme avant et ma macro fonctionne de nouveau.

PS: Je ne sais pas si je dois laisser ce fil ouvert. Peut-être que d'autres membres apporteront d'autres éclairages.

Merci encore
 
C

Compte Supprimé 979

Guest
Re,

C'est pourtant explicite sur le site de Microsoft... Décidément... :rolleyes:

Il falait juste faire en début de module
VB:
#If Win64 Then
  '64-bit API declarations
  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
#Else
  '32-bit API declarations
  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
#End If

Ceci dit, l'utilisation d'une API pour sélectionner un dossier n'est conseillée que si une version antérieure d'Excel 2007 est utilisée, sinon il y a ce code totu simple sans avoir faire la déclaration d'API
VB:
Function ChoixDossier(DefautPath As String, sTitre As String)
  Dim fd As FileDialog
  Set fd = Application.FileDialog(msoFileDialogFolderPicker)
  With fd
    .Title = sTitre
    .InitialFileName = DefautPath
    If .Show = -1 Then
      ChoixDossier = fd.SelectedItems(1)
    End If
  End With
  Set fd = Nothing
End Function

A+
 

Discussions similaires

Statistiques des forums

Discussions
311 711
Messages
2 081 799
Membres
101 818
dernier inscrit
tiftouf5757