XL 2019 Excel 32 ou 64 bits

escouger

XLDnaute Occasionnel
bonsoir,
Je rencontre une difficulté concernant un développement VBA qui fonctionne sur un PC 64 bits, sous windows 10 et avec excel 2019 32 bits.
Ce même programme ne fonctionne plus sur un autre PC identique sauf que son excel 2019 est en 64 bits.
Avec excel 32 bits:
dim openfile as OPENFILENAME
openfile.lstructsize = len(Openfile) contient 76
avec excel 64 bits:
dim openfile as OPENFILENAME
openfile.lstructsize = len(Openfile) contient 108

Voici la fonction qui, en excel 64 bits ne trouve jamais de fichiers correspondant au filtre:

Private Function SelectAFile( _
Path As String, _
Optional Filtre As String = "*.*") As String
Dim OpenFile As OPENFILENAME, lReturn As Long, sFilter As String
OpenFile.lStructSize = Len(OpenFile)
sFilter = "Fichiers Excel (" & Filtre & ")" & Chr(0) & Filtre & Chr(0)
With OpenFile
.lpstrFilter = sFilter
.nFilterIndex = 1
.lpstrFile = String(257, 0)
.nMaxFile = Len(OpenFile.lpstrFile) - 1
.lpstrFileTitle = OpenFile.lpstrFile
.nMaxFileTitle = OpenFile.nMaxFile
.lpstrInitialDir = Path
.lpstrTitle = "Files to Open"
.flags = 0
End With
lReturn = GetOpenFileName(OpenFile)
If lReturn = 0 Then
Else
SelectAFile = Trim(Left(OpenFile.lpstrFile, _
InStr(1, OpenFile.lpstrFile, Chr(0)) - 1))
End If
End Function

Merci de votre science!
 

escouger

XLDnaute Occasionnel
Bonjour,
Je suis navré de ne pas comprendre votre question.
Je ne sais même pas identifier si je passe par une Api ou si je suis en standard!
Ce que je veux obtenir est la liste des noms de fichiers d'un répertoire.
Mon tableau étant susceptible de tourner sur plusieurs PC 32 ou 64 bits avec des versions d'excel 32 ou 64 bits et avec des windows 7,8 ou 10.
Que faut-il coder pour que çà marche quelque soient les combinaisons de ces 3 facteurs?

Depuis ma première question j'ai identifié une autre solution qui semble fonctionner.
J'ai pompé le code sur un exemple donné par un post de microsoft traitant du sujet du #VBA7 et aussi de #WIN64 dans lequel il est dit que le format LONG doit-être transformé en LongPtr si #VBA7 est actif.
En fonction de cet exemple (qui ne s'appliquait hélas pas au GetOpenFileName), j'ai écrit le code qui suit.
Selon que #VBA7 est actif ou non les 2 zones hwndOwner et lpfnHook sont déclarées comme LongPtr si #VBA7 est actif sinon elles sont déclarées en Long.
Je n'ai pas changé les autres zones Long en LongPtr, car dans l'exemple microsoft seules hwndOwner et lpfnHook étaient citées.....mais, encore une fois, l'exemple ne portait pas sur
GetOpenFileName mais sur FindWindow.

Ma question complémentaire est la suivante:
Faut-il encore déclarer toutes les autres zones restées en format "Long" si #VBA7 est actif et, (pour ne plus avoir à se poser la même question à l'avenir), quel serait le critère permettant de savoir quelles zones doivent être changées ?
Merci

#If VBA7 Then
Private Declare PtrSafe Function SetCurrentDirectoryA Lib "Kernel32" (ByVal lpPathName As String) As Long
Public Declare PtrSafe Function GetOpenFileName Lib "comdlg32.dll" Alias _
"GetOpenFileNameA" (pOpenFileName As OPENFILENAME) As Long
Public Type OPENFILENAME
lStructSize As Long
hwndOwner As LongPtr
hInstance As Long
lpstrFilter As String
lpstrCustomFilter As String
nMaxCustFilter As Long
nFilterIndex As Long
lpstrFile As String
nMaxFile As Long
lpstrFileTitle As String
nMaxFileTitle As Long
lpstrInitialDir As String
lpstrTitle As String
flags As Long
nFileOffset As Integer
nFileExtension As Integer
lpstrDefExt As String
lCustData As Long
lpfnHook As LongPtr
lpTemplateName As String
End Type

#Else
Private Declare Function SetCurrentDirectoryA Lib "Kernel32" (ByVal lpPathName As String) As Long
Public Declare Function GetOpenFileName Lib "comdlg32.dll" Alias _
"GetOpenFileNameA" (pOpenFileName As OPENFILENAME) As Long
Public Type OPENFILENAME
lStructSize As Long
hwndOwner As Long
hInstance As Long
lpstrFilter As String
lpstrCustomFilter As String
nMaxCustFilter As Long
nFilterIndex As Long
lpstrFile As String
nMaxFile As Long
lpstrFileTitle As String
nMaxFileTitle As Long
lpstrInitialDir As String
lpstrTitle As String
flags As Long
nFileOffset As Integer
nFileExtension As Integer
lpstrDefExt As String
lCustData As Long
lpfnHook As Long
lpTemplateName As String
End Type
#End If

Public Const OFN_ALLOWMULTISELECT = &H200&
Public Const OFN_EXPLORER = &H80000
Public Const OFN_FILEMUSTEXIST = &H1000&
Public Const OFN_HIDEREADONLY = &H4&
Public Const OFN_PATHMUSTEXIST = &H800&
 

escouger

XLDnaute Occasionnel
Complément du complément!
Voici le code qui m'a servi d'exemple.
Pourquoi certaines zones sont passées de Long à Longptr lorsque #VBA7 est actif et pourquoi pas toutes?

#if VBA7 then ' VBA7
Declare PtrSafe Function SHBrowseForFolder Lib "shell32.dll" _
Alias "SHBrowseForFolderA" (lpBrowseInfo As BROWSEINFO) As Long
Public Type BROWSEINFO
hOwner As LongPtr
pidlRoot As Long
pszDisplayName As String
pszTitle As String
ulFlags As Long
lpfn As LongPtr
lParam As LongPtr
iImage As Long
End Type
# else ' Downlevel when using previous version of VBA7
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 Sub TestSHBrowseForFolder ()
Dim bInfo As BROWSEINFO
Dim pidList As Long
bInfo.pidlRoot = 0&
bInfo.ulFlags = &H1
pidList = SHBrowseForFolder(bInfo)
End Sub
 

Hasco

XLDnaute Barbatruc
Repose en paix
bonjour,

Ce que je veux obtenir est la liste des noms de fichiers d'un répertoire.

Un moyen de s'affranchir de tout ça, depuis excel 2016, c'est de le faire par powerquery (Données/Obtenir des données/A partir d'un fichier/A partir d'un dossier". A l'étape ci-dessous, cliquer sur le bouton 'Transformer les données'.
1607611100428.png

Cordialement
Cordialement
 

fanch55

XLDnaute Barbatruc
Bonjour,
Pourriez-vous préciser votre besoin :
1) Vous voulez 1 seul fichier parmi la liste filtrée d'un répertoire via un dialogue
2) Vous voulez plusieurs fichiers parmi la liste filtrée d'un répertoire via un dialogue
3) Vous voulez obtenir tous les fichiers d'un répertoire répondants à un filtre
4) Vous voulez obtenir tous les fichiers d'un répertoire et sous-répertoires répondants à un filtre
 

Discussions similaires

Statistiques des forums

Discussions
311 725
Messages
2 081 940
Membres
101 845
dernier inscrit
annesof