Forum des développeurs  

Le forum de référence en programmation et développement. Articles, cours et tutoriels du débutant au chef de projet et DBA confirmé.
Précédent   Forum des développeurs > Hardware, Systèmes et Logiciels > Microsoft Office > Excel > VBA Excel

Réponse
 
Outils de la discussion
Vieux 10/10/2008, 16h03   #1 (permalink)
Invité régulier
 
Date d'inscription: octobre 2008
Messages: 11
Par défaut Bouton Parcourir un dossier et non un fichier

Bonjour,

J'ai fais un bouton Parcourir afin de choisir un dossier (et non un fichier), et j'aimerai récupérer le chemin de ce dossier et de le mettre dans une variable que je réutiliserai ensuite.

J'ai vu beaucoup d'infos sur comment choisir un fichier comme :
Code :
Dim QuelFichier
QuelFichier = Application.GetOpenFilename(, , "Choisir un fichier")
A la place du fichier, est-il possible de récupérer un dossier donc du coup, son arborescence ?
Merci d'avance pour vos réponses.
nicethe est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 10/10/2008, 16h09   #2 (permalink)
Modératrice
 
Avatar de zazaraignée
 
Date d'inscription: février 2004
Localisation: Rimouski
Messages: 3 067
Par défaut

Il y a une rubrique dans la FAQ VB6 dont, je crois bien, le code proposé sera utilisable aussi en VBA.

Comment ouvrir une fenêtre de sélection de répertoire ?

S'il y a un problème, tu dis.
__________________
  • Pour les nouveaux : Mode d'emploi et aide aux nouveaux
  • et impérativement les règles du forum. Histoire de garder une ambiance amicale.
  • Noubliez pas les balises de Code pour vos listings : bouton # de l'éditeur. Et n'oubliez pas non plus de bouton
  • Je ne réponds pas aux questions posées par MP.
zazaraignée est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 10/10/2008, 16h27   #3 (permalink)
Invité régulier
 
Date d'inscription: octobre 2008
Messages: 11
Par défaut

Peut etre qu'il faut l'adapter ... Je suis néophyte dans ce domaine.
Ce que j'ai fait, j'ai copié le 1er code dans un module

Mais il me donne cette erreur:
"Erreur de compilation: Seuls des commentaires peuvent apparaître après End Sub, End Function, ou End Property"

Il surligne: Private Declare Function SHBrowseForFolder Lib "shell32" (lpbi As BrowseInfo) As Long

N'y a t-il pas une méthode VBA ?
nicethe est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 10/10/2008, 18h11   #4 (permalink)
Inscrit(e)
 
Date d'inscription: juillet 2007
Localisation: au pays de la liberté d'esprit
Messages: 3 109
Par défaut

Ce qui veut dire que tu as placé la déclaration dans une procédure, ou après une procédure, ce qu'il ne faut pas faire !

Les déclarations et les constantes doivent être placées tout en haut de ta page de code, AVANT toute procédure...
__________________
Deux points essentiels à mes yeux :
1) Je ne regarde ni n'analyse aucun fichier joint, mais uniquement les portions de code incluses et donc affichées et commentées dans une discussion.
2) j'abandonne carrément (et sans appel) ma participation à une discussion dès lors qu'est posée une seconde question différente de la première (et ce, même si, dans l'esprit du demandeur, la 2ème est "complémentaire" de la 1ère).
3) ATTENTION : si je reçois un MP relatif à une question technique sans mon consentement ou mon invite à le faire ===>> a) je n'y réponds pas et b) je fais en sorte que l'expéditeur ne puisse plus m'adresser de MP
ucfoutu est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 15/10/2008, 15h05   #5 (permalink)
Invité régulier
 
Date d'inscription: octobre 2008
Messages: 11
Par défaut

Bonjour.
J'ai bien reçu le message, merci.

Par contre, a force de chercher, pour ceux que ça intéresse j'ai trouvé la méthode:

Hop, on fait un bouton Parcourir, dans la Feuil1, on lui donne:
Sub Parcourir()
GetDirectory
End Sub

GetDirectory se chargera de récup le dossier:

Dans le module:
Code :
 
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
 
 
Public Dossier
 
Function GetDirectory(Optional Msg) As String
Dim bInfo As BROWSEINFO
Dim path As String
Dim r As Long, X As Long, pos As Integer
bInfo.pidlRoot = 0&
If IsMissing(Msg) Then
bInfo.lpszTitle = "Choisissez un dossier de destination pour les sauvegardes."
Else
bInfo.lpszTitle = Msg
End If
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)
Dossier = GetDirectory & "\"
Else
GetDirectory = ""
End If
 
End Function
 
Tout ceci a été récupéré de divers docs excel que j'ai pu "analyser".

Cependant, maintenant que j'ai stocké le chemin dans la variable "Dossier".
Je ne parviens pas a l'utiliser correctement. Exemple:

.Range("C11").Formula = "='C:\Divers\excel\[" & Tableau(X) & "]Feuil1" & "'!" & "K78"

Dans ce code, grâce au tableau (ou sont stockés tous les fichiers Excel), il va récupérer la cellule K78 de tous ces fichiers et les placer dans C11.

Cependant, l'interet d'avoir fait un bouton Parcourir est justement d'avoir fait en sorte que C:\Divers\excel\ ne soit pas en dur dans le code. A la place, je souhaiterai mettre la variable "Dossier" mais syntaxiquement je n'y parviens pas ...

Comment faire ?
Merci d'avance
nicethe est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 15/10/2008, 20h29   #6 (permalink)
Responsable Excel
 
Avatar de SilkyRoad
 
Date d'inscription: août 2005
Messages: 3 113
Par défaut

bonsoir

Tu peux tester cette autre version :


Code :
 Dim objShell As Object, objFolder As Object
 Dim oFolderItem As Object
 Dim Chemin As String
 Dim Tableau(1 To 1) As String
 
Tableau(1) = "ClasseurFerme.xls"
 
 Set objShell = CreateObject("Shell.Application")
 Set objFolder = objShell.BrowseForFolder(&H0&, _
     "Choisir un répertoire", &H1&)
 
 If objFolder Is Nothing Then Exit Sub
 Set oFolderItem = objFolder.Items.Item
 Chemin = oFolderItem.Path
 If Len(Chemin) = 3 Then Chemin = Left(Chemin, 2)
 If Dir(Chemin & "\" & Tableau(1)) = "" Then Exit Sub
 
 Range("C11").Formula = "='" & Chemin & _
     "\[" & Tableau(1) & "]Feuil1'!K78"


bonne soirée
michel
SilkyRoad est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 15/10/2008, 21h48   #7 (permalink)
Inscrit(e)
 
Date d'inscription: juillet 2007
Localisation: au pays de la liberté d'esprit
Messages: 3 109
Par défaut

Bonsoir,

je me demande pourquoi l'on boude VB ...
Dir associé à un TreeView fait pourtant très joliment l'affaire, non ?

Edit :
Ainsi, par exemple :
Un userform, un Treeview Treeview1, un bouton de commande Command1

Code :

Code :
 Option Explicit
   Dim tvn As Node
 
Private Sub Command1_Click()
   Dim monrep As String
   TreeView1.Nodes.Clear
   monrep = "d:\monoutil\"  ' on définit ici le répertoire à "déployer"
   If Right$(monrep, 1) <> "\" Then monrep = monrep$ + "\"
   Set tvn = TreeView1.Nodes.Add(, vbNullString, monrep, monrep)
   deployons monrep
End Sub
 
Sub deployons(ByVal chemin As String)
  Dim nomfic As String, numfic As Integer, tp As String, i As Integer
  If Right$(chemin, 1) <> "\" Then chemin = chemin & "\"
  nomfic = Dir$(chemin, vbDirectory)
  numfic = 1
  Do While nomfic <> ""
    If nomfic <> "." And nomfic <> ".." Then
      tp = chemin & nomfic
      If GetAttr(tp) And vbDirectory Then
        Set tvn = TreeView1.Nodes.Add(chemin, tvwChild, tp + "\", nomfic)
        deployons tp
        nomfic = Dir$(chemin, vbDirectory)
        For i = 2 To numfic
          nomfic = Dir$
        Next
      End If
    End If
    nomfic = Dir$: numfic = numfic + 1
   Loop
End Sub
 
Private Sub TreeView1_DblClick()
   MsgBox TreeView1.SelectedItem.FullPath
End Sub
On lance, on déploie comme on l'entend ...
Un double clixk sur un item de son choix ... on voit...

EDIT :
L'intérêt d'une telle méthode est (je viens de la compléter chez moi dans ce sens) que l'on peut choisir ce que l'on va afficher :
- tout (dossiers et fichiers)
- uniquement les dossiers
- uniquement les fichiers
avec (cerise sur le gâteau) :
- un filtre pour les noms de dossiers
- un filtre pour les noms de fichier
(on peut donc de cette manière, par exemple, n'afficher que les dossiers contenant la chaîne "RA" et leurs fichiers en extension "txt" (tout le reste étant donc occulté).
__________________
Deux points essentiels à mes yeux :
1) Je ne regarde ni n'analyse aucun fichier joint, mais uniquement les portions de code incluses et donc affichées et commentées dans une discussion.
2) j'abandonne carrément (et sans appel) ma participation à une discussion dès lors qu'est posée une seconde question différente de la première (et ce, même si, dans l'esprit du demandeur, la 2ème est "complémentaire" de la 1ère).
3) ATTENTION : si je reçois un MP relatif à une question technique sans mon consentement ou mon invite à le faire ===>> a) je n'y réponds pas et b) je fais en sorte que l'expéditeur ne puisse plus m'adresser de MP

Dernière modification par ucfoutu ; 16/10/2008 à 07h04
ucfoutu est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 16/10/2008, 15h00   #8 (permalink)
Invité régulier
 
Date d'inscription: octobre 2008
Messages: 11
Par défaut

Merci bien, ça fonctionne.
nicethe est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 16/10/2008, 15h29   #9 (permalink)
Invité régulier
 
Date d'inscription: octobre 2008
Messages: 11
Par défaut

Désolé, mais j'ai une petite question encore :p

Si je souhaite calculer la cellule K78 avec K79 par exemple dans la Formula, c'est possible ?

En faisant cela:
Code :
.Range("C11").Formula = "='" & Chemin& "[" & Tableau(1) & "]Feuil1'!K78"
Il m'affiche bien dans la cellule C11 la valeur de K78 du fichier (représenté par le tableau ici).
Cependant, si je fais:
Code :
.Range("C11").Formula = "='" & Chemin& "[" & Tableau(1) & "]Feuil1'!K78+K79"
Il va laisser la valeur de K78. Mais si je fais K78+1 il ajoutera bien le 1... Bon, du coup je tente d'utiliser SUM dans la formula. J'essaie des choses comme:
Code :
.Range("C11").Formula = "='" & Chemin& "[" & Tableau(1) & "]Feuil1'!" = Sum(HK78 & ":" & H79)""
Mais peu importe, rien ne passe, je dois avoir un vrai problème avec la syntaxe de VBA... :s


merci beaucoup pour vos remarques.

Dernière modification par nicethe ; 16/10/2008 à 15h50
nicethe est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 16/10/2008, 18h51   #10 (permalink)
Responsable Excel
 
Avatar de SilkyRoad
 
Date d'inscription: août 2005
Messages: 3 113
Par défaut

bonsoir

Tu peux utiliser cette syntaxe :

Code :
 Range("C11").Formula = "='" & Chemin & _
     "\[" & Tableau(1) & "]Feuil1'!K78+'" & Chemin & _
     "\[" & Tableau(1) & "]Feuil1'!K79"

bonne soirée
michel
SilkyRoad est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 17/10/2008, 10h20   #11 (permalink)
Invité régulier
 
Date d'inscription: octobre 2008
Messages: 11
Par défaut

Perfecto !
Résolu de chez résolu.
nicethe est déconnecté   Envoyer un message privé Réponse avec citation
NEWS MS-OFFICEFAQs OFFICETUTORIELS OFFICELIVRES OFFICESOURCES VBAACCESS

Réponse

Précédent   Forum des développeurs > Hardware, Systèmes et Logiciels > Microsoft Office > Excel > VBA Excel

 
Offres d' emploi informatique sur Lesjeudis.com


Outils de la discussion

Règles de messages
Vous ne pouvez pas créer de nouvelles discussions
Vous ne pouvez pas envoyer des réponses
Vous ne pouvez pas envoyer des pièces jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Trackbacks are non
Pingbacks are non
Refbacks are non
Navigation rapide