Connaitre le nom du dossier contenant le fichier Excel

Bonjour, Savez vous si il est possible en VBA de connaitre le nom de dossier contenant le fichier ou nous somme? En fait je veux partir d'un fichier excel qui peut etre n'importe oû et connaitre le nom du dossier qui le contient. Auriez vous des pistes svp?

Malgré mes recherches je n'ai rien pu trouvé, je viens donc vous demandez de l'aide. =)

Merci d'avance,

Cordialement, Thomas

Bonjour,

Si le classeur est ouvert, tu récupères son chemin au moyen de la propriété Path.

Si tu ne veux que le dernier dossier de l'arborescence, tu splittes le chemin obtenu sur le caractère "\" (ceci dans Windows, évidemment), et tu l'auras dans le dernier élément du tableau issu de Split...

Cordialement.

Bonjour, merci pour votre reponse rapide. Ce que vous m'avez indiquez marche meme si le dossier est fermé mais le fichier ouvert? et je n'ai pas trop compris comment est ce qu'on split le chemin obtenu grace a une fonction? Merci encore

Cordialement

Pas de confusion : le dossier n'est ni ouvert ni fermé, c'est un répertoire de ton disque dur (ou du support sur leque se trouve ton fichier.

Si ton fichier, ou classeur dès lors qu'il s'agit d'Excel, n'est pas ouvert, tu ne pourras l'atteindre qu'en allant le chercher sur ton disque...

S'il est ouvert, il est accessibles par la propriété Workbooks de l'application qui renvoie la collection des classeurs ouverts, donc :

chD = Workbooks("NomduFichier").Path

chD recueille ainsi le chemin du fichier. Le chemin du fichier est une donnée de type String, mais tu la recueille dans une variable non typée, soit de type Variant pour pouvoir continuer à l'utiliser...

chD = Split(chD, "\")

La fonction Split te permet de transformer un texte en tableau en le scindant sur un (ou plusieurs le cas échéant) caractère séparateur. En utilisant l'antislash comme séparateur, chaque élément du tableau obtenu sera l'un des dossiers du chemin du fichier concerné.

Pour avoir le dernier, sous-dossier qui contient le fichier, tu prends le dernier élément du tableau :

dossier = chD(UBound(chD))

Cordialement.

D'accord merci infiniment j'ai aussi une autre question mais qui n'a rien à voir je peux te la poser ici oû il est préférable de créer une nouvelle discussion? C'est une question trivial je pense.

Encore merci

Pose-la tant que tu es ici ! Si elle justifie d'ouvrir une nouvelle discussion, tu pourras le faire ensuite...

d'accord merci alors j'ai une variable "i" et une autre "v" et je veux selectioner les colonnes correspondant à la valeur de i jusqu'a v (avec v=i+1) sauf que des que je fais Columns("i:v").Select il me selectionne les colonnes de i à v et pas les colonnes des valeurs de i à celle de v. Je pense que c'est les guillemets qui posent problèmes mais si je les enlève ca ne marche plus.

Merci d'avance, bonne journée

Il y a plusieurs erreurs d'appréciation qu'il faut voir tour à tour, indépendamment...

D'abord, dès que tu places quelque chose entre guillemets, ce qui se trouve entre les guillemets est du texte. Donc si tu écris "i", tu signifie une valeur texte constituée par la lettre i minuscule.

De plus, une variable est un nom auquel tu donnes un statut de variable en la déclarant, elle prend d'emblée un type et une valeur par défaut, et VBA lui réserve un emplacement mémoire. Une variable ne se met jamais entre guillemets pour pouvoir renvoyer la valeur que tu lui as donnée.

Un nombre, lui, ne se met jamais entre guillemets. Entre guillemets, ce n'est plus un nombre mais du texte. Pour ne pas te tromper, ne mets jamais de guillemets autour d'un nombre, s'il te faut obtenir du texte avec, dans 99,9% des cas VBA s'en chargera, et les cas rares où l'on ne peut l'éviter apparaîtront vite...

Je suppose donc que tes variables i et v contiennent des valeurs numériques, et entières vu l'utilisation que tu en fais.

Supposons que tu t'en serves comme numéros de lignes. Pour cibler les lignes de i à v, tu pourras écrire Rows(i & ":" & v)

i et v, naturellement sans guillemets, car ce sont des variables, mais le signe deux-points qui n'est pas un nombre, lui doit l'être. Cette expression fonctionnera sans problème (ajoutons tout de même que pour plus de fiabilité il est souhaitable de qualifier Rows par la feuille à laquelle la plage appartient...)

Mais si i et v représentent des numéros de colonnes, l'expression qui paraît tout à fait semblable : Columns(i & ":" & v) déclenchera elle une erreur car Excel refuse l'identification des colonnes sous cette forme à partir de leurs numéros pour en regrouper plusieurs.

Tu peux écrire Columns(i) ou Columns(v), visant une seule colonne avec son numéro. Mais pour plusieurs il te faut utiliser les lettres, ou une autre méthode...

Tu pourrais alors par exemple convertir les numéros en lettres, en ajoutant 64 pour obtenir le code de caractère : Columns(Chr(i + 64) & ":" & Chr(v +64)) fonctionnera.

Mais sous cette forme simple tu ne couvres que A à Z. A partir de AA cela se complique un peu et on va jusqu'à XFD dans les formats actuels de fichiers Excel.

On peut bien sûr construire une fonction pour convertir les numéros de colonnes en lettres de colonnes. Ce qui peut s'avérer quelquefois utile, mais on a encore d'autres moyens.

Par exemple : Range(Cells(1, i), Cells(1, v)).EntireColumn

Là on définit une plage de i à v sur la ligne 1, plage qu'on étend aux colonnes entières qu'elle couvre.

Ou bien, entre i et v, le nombre de colonnes sera de v-i+1, on peut donc définir une seule colonne que l'on redimensionne au nombre voulu, ainsi : Columns(i).Resize(, v - i + 1).

Je précise une fois encore que ces expressions ne sont pas qualifiées, car dépourvues de référence explicite à la feuille parente, et je recommande d'opérer toujours cette référence pour une plus grande fiabilité du code, et souvent plus de rapidité.

Ceci étant tu indiques qu'à partir d'une expression ciblant des colonnes tu veux les sélectionner !

Il faut savoir que la sélection d'un objet (inévitable en manuel) est toujours parasite et inutile en VBA, elle n'a pour effet que d'opérer une opération supplémentaire (la sélection) qui ralentit l'exécution.

En lieu et place, on indique l'action à réaliser et VBA fait !

Cordialement.

Bonjour, merci enormement pour toute ces informations tres interresante toutefois je n'y arrive toujours pas et effectivement mes colonnes s'étendent au dela de AA. Je vous met ci joint mon code pour que vous compreniez mieux l'envers du problème.

Merci enormement encore,

Bonne journée

Sub esa()

Windows("offreglobale.xlsm").Activate

Dim parentdir As Variant

Set FL1 = Worksheets("MillesFeuilles")

If s = "" Then s = ThisWorkbook.FullName

p = InStrRev(s, "\")

If p <> 0 Then

p1 = InStrRev(Left(s, p - 2), "\")

parentdir = Mid(s, p1 + 1, p - 1 - p1)

End If

Dim note As String

For imo = 10 To 200

note = FL1.Cells(1, imo)

If (note = parentdir) Then

MsgBox "ca marche "

Exit For

End If

Next

Dim v As Integer

v = i + 1

' Columns("i:v").Select

' Range(Cells(1, i), Cells(1, v)).EntireColumn

Selection.Copy

Windows("NEW FICHE CLIENT 2018-05-02.xlsm").Activate

Worksheets("Grille Produits 2018 liaison").Activate

Cells(1, imo).Select

ActiveSheet.Paste

Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, _

SkipBlanks:=False, Transpose:=False

End Sub

Commence par indiquer quel classeur contient la macro ?

ha oui désolé c'est NEW FICHE CLIENT 2018-05-02.xlsm

1) Tu extraies le nom du dossier contenant ton fichier NEW FICHE CLIENT 2018-05-02.xlsm

=> parentdir

2) Tu parcours la ligne 1 de la feuille MillesFeuilles du fichier offreglobale.xlsm de la colonne 10 à la colonne 200. Si parentdir trouvé => imo = numéro de colonne qui le contient.

3) Ensuite on se perd : tu fais v = i + 1 !

i = 0 (non initialisée), donc v = 1

avec ça on ne peut aller qu'à l'erreur !

Là il faut que tu dises ce que tu veux copier ?

Et confirmer où tu veux le coller ?

Oups désolé il y avait pleins de petite erreur j'en suis désolé je renvoie le code verifié mais il y a toujours un probleme avec le i et le v J'ai essayé des choses mais ca reste sans succes

Le code:

Sub esa()

Windows("offreglobale.xlsm").Activate

Dim parentdir As Variant

Set FL1 = Worksheets("MillesFeuilles")

If s = "" Then s = ThisWorkbook.FullName

p = InStrRev(s, "\")

If p <> 0 Then

p1 = InStrRev(Left(s, p - 2), "\")

parentdir = Mid(s, p1 + 1, p - 1 - p1)

End If

Dim note As String

For i = 10 To 200

note = FL1.Cells(1, i)

If (note = parentdir) Then

MsgBox "ca marche"

Exit For

End If

Next

Dim v As Integer

v = i + 1

Columns(i + ":" + v).Select

' Range(Cells(1, i), Cells(1, v)).EntireColumn

'

Selection.Copy

Windows("NEW FICHE CLIENT 2018-05-02.xlsm").Activate

Worksheets("Grille Produits 2018 liaison").Activate

Cells(5, N).Select

ActiveSheet.Paste

Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, _

SkipBlanks:=False, Transpose:=False

End Sub

Merci encore pour tout le temps que tu prends pour m'aider

Tu n'ajoutes rien ! On n'utilise pas + comme opérateur de concaténation, et de toute façon avec des colonnes de 0 à 1, tu provoques deux erreurs simultanées, en les définissant numériquement et parce que la colonne 0 aura du mal à être trouvée.

Et tu rajoutes une variable N, non initialisée, =0 qui va provoquer une erreur supplémentaire...

Il faudrait que tu répondes aux questions :

ce que tu veux copier ?

confirmer où tu veux le coller ?

Cordialement.

N n'est pas une variable mais justement la colonne ou je veux copier ce que j'ai selectionner. Et je veux copier toute la colonne correspondant a la cellule oû je detecte le nom du dossier parent de ce fichier ainsi que sa colonne imédiatement a droite.

OK pour N mais écrit ainsi, pour VBA ce sera une variable...

En sortie de boucle ta colonne trouvée, c'est imo.

On va voir ça...

je dois ecrire N minuscule ducoup? et comment ca ino? je l'ai supprimer dans la nouvelle version que je vous ai envoyé non?

Bon ! Un peu de mise en ordre dans le code !

1) On déclare toute les variables utilisées, on les déclare en tête de la procédure, on élimine celles qui ne serviront pas...

Il nous reste donc parentdir, qui suffit à elle seule pour l'extraction du nom de dossier, on garde imo et on ajoute une autre variable Integer pour cibler d'un peu plus près le nombre de lignes à récupérer, on garde aussi note (cela facilite la comparaison), on garde FL1 pour la feuille source et on ajoute une FL2 pour la feuille cible.

On n'aura besoin de rien d'autre.

2) On élimine le recours à l'objet Window, composant d'affichage, au profit des objets sur lesquels on entend intervenir, plus sûr !

3) On bannit naturellement toute action Activate ou Select, qui n'ont pour effet que ralentir VBA. Leur suppression conduit à qualifier les expressions sans difficulté...

4) On opère, comme c'était le cas l'affectation à FL1 de la référence de la feuille source (une ligne y suffit). Et sur le classeur contenant la macro, on fait de même pour affecter la feuille cible à FL2, et également on récupère le chemin du fichier en le splittant dans parentdir.

En ne conservant que le dernier élément du tableau parentdir, nous avons extrait le nom du dossier recherché.

5) On passe sur la feuille source (FL2) et on opère la boucle de recherche sur la ligne 1 des colonnes 10 à 200. Pas de changement à cet égard... Mais en ce qui concerne la comparaison, un nom de dossier n'étant pas sensible à la casse, il est sans doute préférable d'utiliser la fonction StrComp pour opérer une recherche sous forme texte (ce que cette fonction permet).

On sort de la boucle quand on trouve ! A ce moment là la variable imo contient le numéro de colonne trouvée...

Mais on doit prévoir le cas où la recherche est infructueuse : dans ce cas, la boucle aura été à son terme et imo incrémentée aura atteint la valeur 201. En testant si imo est >200 on détectera si la recherche n'a pas abouti (et on s'arrête car continuer produirait une erreur).

Si c'est OK, on définit le nombre de lignes de la région courante de la cellule trouvée en ligne 1, ce qui nous évitera d'opérer sur ces colonnes entières (à éviter dès lors qu'on le peut).

6) Il ne reste plus qu'à affecter les valeurs de la colonne source trouvée ainsi que sa voisine à une plage de même taille définie à partir de N5 sur la feuille cible.

Cette méthode, que l'on ne peut utiliser en manuel, où l'on est reduit à copier et coller, est possible en VBA et plus rapide qu'un copier-coller...

Ce qui nous donne :

Sub esa()
    Dim parentdir, imo%, nln%, note$, FL1 As Worksheet, FL2 As Worksheet
    Set FL1 = Workbooks("offreglobale.xlsm").Worksheets("MillesFeuilles")
    With ThisWorkbook
        Set FL2 = .Worksheets("Grille Produits 2018 liaison")
        parentdir = Split(.Path, "\")
    End With
    parentdir = parentdir(UBound(parentdir))
    With FL1
        For imo = 10 To 200
            note = .Cells(1, imo)
            If StrComp(parentdir, note, vbTextCompare) = 0 Then
                MsgBox "ça marche !"
                Exit For
            End If
        Next imo
        If imo > 200 Then
            MsgBox "ça n'a pas marché !"
            Exit Sub
        End If
        nln = .Cells(1, imo).CurrentRegion.Rows.Count
        FL2.Range("N5").Resize(nln, 2).Value = .Cells(1, imo).Resize(nln, 2).Value
    End With
End Sub

Cordialement.

Merci beaucoup pour tout ce temps passé à m'expliquer ca fonctionne parfaitement.

Bonne journée,

Cordialement

PS: vous etes genial

Bonne continuation.

Rechercher des sujets similaires à "connaitre nom dossier contenant fichier"