[access]getopenfilename, sélection multiple
Fermé
gaby
-
29 sept. 2008 à 09:04
blux Messages postés 24878 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 25 mars 2023 - 29 sept. 2008 à 15:40
blux Messages postés 24878 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 25 mars 2023 - 29 sept. 2008 à 15:40
A voir également:
- [access]getopenfilename, sélection multiple
- L'indice n'appartient pas à la sélection vba - Forum VB / VBA
- Access denied - Forum Bbox Bouygues
- Paris multiple 2/6 explication ✓ - Forum Loisirs / Divertissements
- You don't have permission to access this resource ✓ - Forum Internet / Réseaux sociaux
- Exemple base de données access à télécharger gratuit - Forum Access
10 réponses
hum oui désolé chuis pas trés clair mais je fais 15 trucs en même temps.
Voilà le code de la fonction ( qui vient de la faq développez.com):
Voilà, comme tu vois j'essaie d'afficher tout à la fin le nom du/des fichier et l'offset.
Imaginons que j'ai un dossier 'mes documents' avec 3 fichiers a,b, et c
Si je sélectionne uniquement a, la première alerte affiche "mes documents/a" et la seconde "59"
Si je sélectionne plusieurs documents, la première alerte donne "mes documents" et la seconde "59".
Donc je n'ai que le chemins d'accès, pas le nom des fichiers.
De plus, un offset qui vaut 59 ça me parait un peu gros pour extraire une sous-chaine, j'ai essayé au cas où mais non.
Je ne sais vraiment pas où sont passés les noms de ces fichiers -_-'
Voilà le code de la fonction ( qui vient de la faq développez.com):
Public Function OuvrirUnFichier(Handle As Long, _
Titre As String, _
TypeRetour As Byte, _
Optional TitreFiltre As String, _
Optional TypeFichier As String, _
Optional RepParDefaut As String) As String
'OuvrirUnFichier est la fonction a utiliser dans votre formulaire pour ouvrir _
'la boîte de dialogue de sélection d'un fichier.
'Explication des paramètres
'Handle = le handle de la fenêtre (Me.Hwnd)
'Titre = Titre de la boîte de dialogue
'TypeRetour (Définit la valeur, de type String, renvoyée par la fonction)
'1 = Chemin complet + Nom du fichier
'2 = Nom fichier seulement
'TitreFiltre = Titre du filtre
'Exemple: Fichier Access
'N'utilisez pas cet argument si vous ne voulez spécifier aucun filtre
'TypeFichier = Extention du fichier (Sans le .)
'Exemple: MDB
'N'utilisez pas cet argument si vous ne voulez spécifier aucun filtre
'RepParDefaut = Répertoire d'ouverture par defaut
'Exemple: C:\windows\system32
'Si vous laissé l'argument vide, par defaut il se place dans le répertoire de votre application
Dim StructFile As OPENFILENAME
Dim sFiltre As String
'Construction du filtre en fonction des arguments spécifiés
If Len(TitreFiltre) > 0 And Len(TypeFichier) > 0 Then
sFiltre = TitreFiltre & " (" & TypeFichier & ")" & Chr$(0) & "*." & TypeFichier & Chr$(0)
End If
sFiltre = sFiltre & "Tous (*.*)" & Chr$(0) & "*.*" & Chr$(0)
'Configuration de la boîte de dialogue
With StructFile
.lStructSize = Len(StructFile) 'Initialisation de la grosseur de la structure
.hwndOwner = Handle 'Identification du handle de la fenêtre
.lpstrFilter = sFiltre 'Application du filtre
.lpstrFile = String$(254, vbNullChar) 'Initialisation du fichier '0' x 254
.nMaxFile = 254 'Taille maximale du fichier
.lpstrFileTitle = String$(254, vbNullChar) 'Initialisation du nom du fichier '0' x 254
.nMaxFileTitle = 254 'Taille maximale du nom du fichier
.lpstrTitle = Titre 'Titre de la boîte de dialogue
.flags = OFN_EXPLORER Or OFN_ALLOWMULTISELECT 'Option de la boite de dialogue originale :
If ((IsNull(RepParDefaut)) Or (RepParDefaut = "")) Then
RepParDefaut = CurrentDb.Name
PathStripPath (RepParDefaut)
.lpstrInitialDir = Left(CurrentDb.Name, Len(CurrentDb.Name) - Len(Mid$(RepParDefaut, 1, _
InStr(1, RepParDefaut, vbNullChar) - 1)))
Else: .lpstrInitialDir = RepParDefaut
End If
End With
' sélection multiple
If (GetOpenFileName(StructFile)) Then 'Si un fichier est sélectionné
MsgBox StructFile.lpstrFile
MsgBox StructFile.nFileOffset
End If
End Function
Voilà, comme tu vois j'essaie d'afficher tout à la fin le nom du/des fichier et l'offset.
Imaginons que j'ai un dossier 'mes documents' avec 3 fichiers a,b, et c
Si je sélectionne uniquement a, la première alerte affiche "mes documents/a" et la seconde "59"
Si je sélectionne plusieurs documents, la première alerte donne "mes documents" et la seconde "59".
Donc je n'ai que le chemins d'accès, pas le nom des fichiers.
De plus, un offset qui vaut 59 ça me parait un peu gros pour extraire une sous-chaine, j'ai essayé au cas où mais non.
Je ne sais vraiment pas où sont passés les noms de ces fichiers -_-'
blux
Messages postés
24878
Date d'inscription
dimanche 26 août 2001
Statut
Modérateur
Dernière intervention
25 mars 2023
3 311
29 sept. 2008 à 10:18
29 sept. 2008 à 10:18
Salut,
un offset est un déplacement dans une zone. Ici, cela semble vouloir dire que le nom du premier fichier commence à la position donnée par la variable nFileOffset.
Les noms sont séparés par un caractère de valeur 0 (NULL), il te suffit donc de parcourir la chaine renvoyée par la fonction et d'éclater les différents noms chaque fois que tu trouves le caractère NULL.
L'extra NULL character veut dire qu'à la fin de la liste des noms de fichiers, tu as aussi un caractère NULL.
Pas de contournement possible, la fonction est construite comme ça.
un offset est un déplacement dans une zone. Ici, cela semble vouloir dire que le nom du premier fichier commence à la position donnée par la variable nFileOffset.
Les noms sont séparés par un caractère de valeur 0 (NULL), il te suffit donc de parcourir la chaine renvoyée par la fonction et d'éclater les différents noms chaque fois que tu trouves le caractère NULL.
L'extra NULL character veut dire qu'à la fin de la liste des noms de fichiers, tu as aussi un caractère NULL.
Pas de contournement possible, la fonction est construite comme ça.
Merci je comprends un peu mieux.
Nouvelle question , comment je parcours la chaine en utilisant les offset ?
Nouvelle question , comment je parcours la chaine en utilisant les offset ?
blux
Messages postés
24878
Date d'inscription
dimanche 26 août 2001
Statut
Modérateur
Dernière intervention
25 mars 2023
3 311
29 sept. 2008 à 11:18
29 sept. 2008 à 11:18
Il faut utiliser right pour ne prendre que les n derniers caractères de la chaine à droite de l'offset.
Ensuite, c'est un truc classique, tu lis tes caractères et tu crées tes chaines quand tu tombes sur NULL.
Ensuite, c'est un truc classique, tu lis tes caractères et tu crées tes chaines quand tu tombes sur NULL.
Eh bien non ça ne marche toujours pas -.-
Je sais pas trop à quoi c'est dû, lorsque je ne sélectionne qu'un fichier tout se passe correctement mais dès que j'en prends deux, je n'arrive à récupérer que le chemin d'accès et rien d'autre... L'offset ne sert à rien, il est beaucoup trop gros pour extrairer une sous-chaine.
Je sais pas trop à quoi c'est dû, lorsque je ne sélectionne qu'un fichier tout se passe correctement mais dès que j'en prends deux, je n'arrive à récupérer que le chemin d'accès et rien d'autre... L'offset ne sert à rien, il est beaucoup trop gros pour extrairer une sous-chaine.
blux
Messages postés
24878
Date d'inscription
dimanche 26 août 2001
Statut
Modérateur
Dernière intervention
25 mars 2023
3 311
29 sept. 2008 à 11:38
29 sept. 2008 à 11:38
je n'arrive à récupérer que le chemin d'accès et rien d'autre...
Par quelle méthode ?
L'offset ne sert à rien, il est beaucoup trop gros pour extrairer une sous-chaine.
C'est quoi : trop gros ?
Par quelle méthode ?
L'offset ne sert à rien, il est beaucoup trop gros pour extrairer une sous-chaine.
C'est quoi : trop gros ?
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
C'est la fonction getOpenFileName qui ouvre les fichiers.
La fonction ouvrirUnFichier est une fonction "fait main" destinée à simplifier l'utilisation de getOpenFileName dans le reste du code.
Si j'ai 3 boutons parcourir, je ne vais pas m'amuser à initialiser la structure structfile puis à lancer getOpenFileName et enfin testé le résultat, je mets tout dans la fonction ouvrirUnFichier.
Si tu veux la description de getOpenFileName il faut consulter la doc officielle ^^
La fonction ouvrirUnFichier est une fonction "fait main" destinée à simplifier l'utilisation de getOpenFileName dans le reste du code.
Si j'ai 3 boutons parcourir, je ne vais pas m'amuser à initialiser la structure structfile puis à lancer getOpenFileName et enfin testé le résultat, je mets tout dans la fonction ouvrirUnFichier.
Si tu veux la description de getOpenFileName il faut consulter la doc officielle ^^
blux
Messages postés
24878
Date d'inscription
dimanche 26 août 2001
Statut
Modérateur
Dernière intervention
25 mars 2023
3 311
29 sept. 2008 à 13:42
29 sept. 2008 à 13:42
Je viens de voir ça :
If the user selects more than one file, the lpstrFile buffer returns the path to the current directory followed by the file names of the selected files.
Si tu sélectionnes plusieurs fichiers, lpstrFile contient le path du rép courant suivi de la liste des fichiers sélectionnés...
If the user selects more than one file, the lpstrFile buffer returns the path to the current directory followed by the file names of the selected files.
Si tu sélectionnes plusieurs fichiers, lpstrFile contient le path du rép courant suivi de la liste des fichiers sélectionnés...
Bin oui, c'est justement ça mon problème!
Lorsque j'affiche lpstrfile avec une alerte, je n'ai que le chemin d'accès et pas le noms des fichiers.
Regarde tout à la fin du code de la fonction OuvrirUnFichier, après le test de getOpenFileName.
Y a une alerte qui affiche lpstrfile et une autre nOffsetFile.
Eh bien lorsque je sélectionne 3 fichiers qui se trouvent dans mes documents, l'alerte renvoi "c:\mes documents" et c'est tout.
Lorsque j'affiche lpstrfile avec une alerte, je n'ai que le chemin d'accès et pas le noms des fichiers.
Regarde tout à la fin du code de la fonction OuvrirUnFichier, après le test de getOpenFileName.
Y a une alerte qui affiche lpstrfile et une autre nOffsetFile.
Eh bien lorsque je sélectionne 3 fichiers qui se trouvent dans mes documents, l'alerte renvoi "c:\mes documents" et c'est tout.
blux
Messages postés
24878
Date d'inscription
dimanche 26 août 2001
Statut
Modérateur
Dernière intervention
25 mars 2023
3 311
29 sept. 2008 à 14:04
29 sept. 2008 à 14:04
justement, t'as essayé de taper plus loin que ce qui est affiché ? car il est possible que l'affichage VBA s'arrête au premier NULL trouvé...
Je pense que le problème vient effectivement de là! Mais comment faire ? Avec Right, ça foire lamentablement : /
blux
Messages postés
24878
Date d'inscription
dimanche 26 août 2001
Statut
Modérateur
Dernière intervention
25 mars 2023
3 311
29 sept. 2008 à 14:24
29 sept. 2008 à 14:24
mid ?
j'ai regarder la doc mais je ne vois pas comment mid pourrait changer quelquechose.. Pour moi, le problème vient du fait que les noms de fichiers sont séparés par NULL, ce qui fait que lors de la lecture de la chaine vba interpréte les null comme une fin de chaine...Ce qui n'est pas le cas.
Du coup il faudrait aller piocher direct dans le buffer les noms de fichiers, mais en vba je ne sais pas du tout comment faire.
Du coup il faudrait aller piocher direct dans le buffer les noms de fichiers, mais en vba je ne sais pas du tout comment faire.
blux
Messages postés
24878
Date d'inscription
dimanche 26 août 2001
Statut
Modérateur
Dernière intervention
25 mars 2023
3 311
29 sept. 2008 à 15:02
29 sept. 2008 à 15:02
as-tu essayé ?
car si c'est une fonction appellable en VBA, elle doit être utilisable...
car si c'est une fonction appellable en VBA, elle doit être utilisable...
Oui j'ai testé mais peu importe la longueur que je précise, la chaine s'arrête sur le NULL...
blux
Messages postés
24878
Date d'inscription
dimanche 26 août 2001
Statut
Modérateur
Dernière intervention
25 mars 2023
3 311
29 sept. 2008 à 15:13
29 sept. 2008 à 15:13
ben là, je sèche...
y'a un exemple, là où tu l'as pêchée, ta fonction ?
y'a un exemple, là où tu l'as pêchée, ta fonction ?
Mmmm il y a des exemples sur msdn.com, mais évidemment dans un cas simple.
Je pense que le jour où ils ont codés cette fonction, ils ont du oublier que null était un délimiteur de chaine -_-.
Tant pis.
Je pense que le jour où ils ont codés cette fonction, ils ont du oublier que null était un délimiteur de chaine -_-.
Tant pis.
blux
Messages postés
24878
Date d'inscription
dimanche 26 août 2001
Statut
Modérateur
Dernière intervention
25 mars 2023
3 311
29 sept. 2008 à 15:40
29 sept. 2008 à 15:40
ca m'étonnerait que le loupé soit aussi gros...
29 sept. 2008 à 12:57
Tu as une fonction en français (OuvrirUnFichier) avec des paramètres et tu utilises une fonction en anglais (GetOpenFileName) dont je ne vois pas la description !