Formule ou VBA pour récupérer le niveau N d'un nom de dossier.

MJ13

XLDnaute Barbatruc
Bonjour à tous

Je cherche la formule pour récupérer sur un nom de dossier en cellule A2 par exemple avec des niveaux différents de type C:\NOM1\Nomtype2\NOMtype3 à N niveaux.
Ex: si je veux 2 niveaux, j'obtiendrai: Nomtype2\NOMtype3

Si vous l'avez en VBA ou en fonction, cela m'intéresse aussi.

Merci d'avance :).
 

Modeste

XLDnaute Barbatruc
Re : Formule ou VBA pour récupérer le niveau N d'un nom de dossier.

Salut Michel :)

On peut sans doute faire plus court ou en faire une fonction personnalisée, mais sur le principe, est-ce que ça ressemblerait à ça ??

VB:
Sub arbo()
nbniveaux = InputBox("entrez le nombre de niveaux")
monTablo = Split(ThisWorkbook.Path, "\")
If Not nbniveaux > UBound(monTablo) Then
    For niv = (UBound(monTablo) + 1 - nbniveaux) To UBound(monTablo)
        chem = chem & monTablo(niv) & "\"
    Next niv
chem = Mid(chem, 1, Len(chem) - 1)
End If
End Sub
 

MichD

XLDnaute Impliqué
Re : Formule ou VBA pour récupérer le niveau N d'un nom de dossier.

Bonjour

Dans un module STANDARD :

Exemple application dans une cellule
A1 : C:\toto\titi\tata En B1 = Niveau(A1;0) retourne C:
= Niveau(a1;1) retourne toto
= Niveau(a1;2) retourne titi

VB:
Function Niveau(Rg As Range, N As Integer)
Niveau = Split(Rg, "\")(N)
End Function


Une autre fonction personnalisée dans un module standard :

A1 : C:\toto\titi\tata En B1 : =Niveau(A1;0) = c:\
= Niveau(a1;1) retourne c:\toto\
= Niveau(a1;2) retourne C:\toto\titi\
...../etc...

VB:
Function Niveau(Rg As Range, N As Integer)
Dim T As Variant
T = Split(Rg, "\")
If N > UBound(T) Then N = UBound(T)
ReDim Preserve T(0 To N)
Niveau = Join(T, "\") & "\"
End Function
 
Dernière édition:

MJ13

XLDnaute Barbatruc
Re : Formule ou VBA pour récupérer le niveau N d'un nom de dossier.

Bonjour Modeste, MichD

Merci à vous deux :).

J'ai fait ce code avec le code de Modeste en sélectionnant les cellules contenant les Chemins.

Code:
Public cell, nbniveaux
Sub arbo()
nbniveaux = InputBox("entrez le nombre de niveaux")
t1 = Timer
'monTablo = Split(ThisWorkbook.Path, "\")
For Each cell In Selection
extrait_Niveau
Next
MsgBox Timer - t1
End Sub
Sub extrait_Niveau()
Dim chem
'cell.Select
montablo = Split(cell.Value, "\")
If Not nbniveaux > UBound(montablo) Then
    For niv = (UBound(montablo) + 1 - nbniveaux) To UBound(montablo)
        chem = chem & montablo(niv) & "\"
    Next niv
chem = Mid(chem, 1, Len(chem) - 1)
cell.Offset(0, 1) = chem
End If
montablo = ""
End Sub

MichD, merci pour ton code qui pourrait m'intéresser :). Par contre ce qui peux m'intéresser, c'est plus ce qu'il y a le plus à droite du chemin. C'est possible à partir de ton code :confused:.
 

Efgé

XLDnaute Barbatruc
Re : Formule ou VBA pour récupérer le niveau N d'un nom de dossier.

Bonjour MJ13:), Bonjour Modeste:), bonjour MichD
Juste pour participer, une proposition avec des gardes fou:D. Pas certain que ça aille plus vite que Modeste.
La macro principale:
VB:
Sub arbo3()
nbniveaux = InputBox("entrez le nombre de niveaux")
t1 = Timer
For Each cell In Selection
   cell.Offset(0, 1).Value = Niveau(cell, nbniveaux)
Next
MsgBox Timer - t1
End Sub

La fonction:

VB:
Private Function Niveau(ByVal Plg As Range, ByVal Num As Long) As String
Dim T, TReport(), i&, J&
If Plg.Count > 1 Or Num < 1 Or InStr(Plg.Value, "\") = 0 Then Exit Function
T = Split(Plg.Value, "\")
If Num > UBound(T) - 1 Then Exit Function
ReDim TReport(Num - 1)
J = UBound(TReport)
For i = UBound(T) To (UBound(T) - (Num - 1)) Step -1
    TReport(J) = T(i)
    J = J - 1
Next i
Niveau = Join(TReport, "\")
End Function

Cordialement
 

MichD

XLDnaute Impliqué
Re : Formule ou VBA pour récupérer le niveau N d'un nom de dossier.

Tu peux adapter la fonction de cette manière :

VB:
Function Niveau(Rg As Range, N As Integer)
Dim T As Variant
T = Split(Rg, "\")
If N >= UBound(T) Then Niveau = "": Exit Function
ReDim Preserve T(0 To N)
Niveau = Replace(Rg, Join(T, "\") & "\", "")
End Function
 

Discussions similaires

Membres actuellement en ligne

Statistiques des forums

Discussions
312 177
Messages
2 085 972
Membres
103 073
dernier inscrit
MSCHOE16