Extraire suite de mot suivant l'emplacement du document Excel
Bonjour,
Pouvez-vous me renseigner sur le sujet suivant.
Je suis un artisan et j'ai des affaires qui sont classées sur mon ordinateur par dossier en reprenant la syntaxe suivante :
NUMERO D'AFFAIRE - ENTREPRISE - INTERLOCUTEUR - LIEU - REFERENCE
Dans chaque dossier, j'ai mon fichier excel dans lequel je répertorie l'avancement du projet avec les détails de celui-ci.
Dans le fichier Excel j'ai :
Cellule A1 : NUMERO D'AFFAIRE
Cellule A2 : ENTREPRISE
Cellule A3 : INTERLOCUTEUR
Cellule A4 : LIEU
Cellule A5 : REFERENCE
Je souhaiterais que, dans le fichier excel, se remplisse la automatiquement en mettant dans les cellules B1 à B5 ce qui correspond en fonction du nom du dossier dans lequel se situe le fichier Excel afin de ne pa savoir à remplir ces cellules mais plutôt qu'elles se remplissent automatiquement.
Exemple de nom de fichier :
110120 - Vieux grenoble - Monsieur Jacques - brive - saint-georges
Le résultat doit être le suivant :
Cellule B1 : 110120
Cellule B2 : Vieux grenoble
Cellule B3 : Monsieur Jacques
Cellule B4 : brive
Cellule B5 : saint-georges
A noter qu'entre chacun des 5 éléments il y a " - " (espace + tiret + espace) et que le "-" (tiret) peut également être utilisé dans le nom de l'entreprise, de l'interlocuteur, du lieu ou de la référence. Idem pour les majuscules qui peuvent être employées à divers endroits.
Je pense avoir été assez clair mais n'hésitez pas à me demander des renseignements si ce n'a pas été le cas.
Merci d'avance pour votre aide !
Jeff
Bonjour,
Il manque quelques informations... Et combien avez-vous de fichiers comme celui-ci ? Sont-ils tous à un même emplacement ?
Pour l'instant, je vous propose une solution, qui je pense n'est pas suffisante, avec une fonction personnalisée :
function PARTIES()
application.volatile
nomfichier = split(thisworkbook.name, ".")(0)
PARTIES = split(nomfichier, " - ")
end functionEnsuite, en A1 jusqu'à A5, il faudra avoir cette formule :
=INDEX(PARTIES(),LIGNE())Cdlt,
Bonjour,
Déjà merci pour votre réponse et votre temps.
L'arborescence se présente comme cela. Un dossier nommé AFFAIRES avec dedans toutes mes dossiers qui contiennent chacun un dossier Documents, Fiches, Plans et le document Excel en question.
AFFAIRES
110120 - Vieux grenoble - Monsieur Jacques - brive - saint-georges
Documents
Fiches
Plans
Fiche de suivi110120.xlsx
110121 - Vieux grenoble - Monsieur Jacques - brive - Patrice
Documents
Fiches
Plans
Fiche de suivi110121.xlsx
110122 - Minimes - Yves - Grenoble - recolor
Documents
Fiches
Plans
Fiche de suivi110122.xlsx
J'ai rentré votre formule dans mon document Excel sous VBA.
Je ne sais pas comment et où rentrer cette formule (=INDEX(PARTIES(),LIGNE()). Dites moi quelles informations sont manquantes.
Encore merci
Bonjour,
Donc pour l'arborescence, elle se présente comme ça ?
AFFAIRES
110120 - Vieux grenoble - Monsieur Jacques - brive - saint-georges
Documents
Fiches
Plans
Fiche de suivi110120.xlsx
110121 - Vieux grenoble - Monsieur Jacques - brive - Patrice
Documents
Fiches
Plans
Fiche de suivi110121.xlsx
110122 - Minimes - Yves - Grenoble - recolor
Documents
Fiches
Plans
Fiche de suivi110122.xlsxSinon, il faut copier le code de la fonction dans Visual Basic :
- D'abord, allez dans l'onglet Fichier/Options/Personnaliser le ruban/Activez l'onglet "Développeur",
- Allez sur l'onglet Développeur, cliquez sur "Visual Basic",
- Dans le menu de l'éditeur, Insertion/Module,
- Dans ce module, collez y le code de la fonction,
- Sauvegardez le fichier (au format .xlsm pour qu'il prenne en charge les macros),
Puis, rendez vous sur la feuille et en A1 jusqu'à A5 :
=INDEX(PARTIES();LIGNE())PARTIES() renvoie un tableau avec les parties du nom du fichier.
Ligne() donne le numéro de ligne en cours (donc si vous utilisez cette formule en A2:A6, on avisera),
INDEX renvoie l'élément du tableau à la position désignée.
Cdlt,
Re,
Voici sinon un premier essai avec une procédure à placer si possible dans un nouveau fichier destiné à mettre à jour toutes les fiches :
Sub Ficher()
dim wb as workbook
dim dossiers(), parties
dim rep$, entree$, spath$, fichier$
dim n%, i%
rep = "C:\...\AFFAIRES\" '<<<<< ADAPTER : chemin dossier parent
entree = dir(rep, vbdirectory) '1er contenu du dossier
while entree <> "" 'tant qu'il y a du contenu
if not entree like "*.*"and entree like "######*" then 'si dossier commence par une chiffre
redim preserve dossiers(n) 'redimension tableau noms dossiers
dossiers(n) = entree 'valeur item
n = n + 1 'incrementation
end if
entree = dir 'contenu suivant
wend
for i = lbound(dossiers) to ubound(dossiers) 'pour chaque dossier relevé
spath = rep & dossiers(i) & "\" 'sous-dossier de l'affaire
fichier = dir(spath & "Fiche*.xlsx") 'fichier désiré
if fichier <> "" then 'si existe
parties = split(split(fichier, ".")(0), " - ") 'tableau scindant le nom
set wb = workbooks.open(spath & fichier) 'ouverture et affect wb
wb.sheets(1).range("A1").resize(ubound(parties) + 1,1) = application.transpose(parties) 'en A1 feuille 1, on colle
wb.close true 'on ferme et sauve
end if
next i
end subIl faudra que vous mettiez votre vrai chemin !
Ici, je suppose qu'il n'y a qu'une fiche par affaire, qu'elles sont au format .xlsx et toutes libellées ainsi "Fiche...". Je suppose aussi que tous les sous-dossiers du dossier AFFAIRES commençant par 6 chiffres correspondent bien à une affaire (sinon, il faudra adapter).
Il faut exécuter le code avec les classeurs fermés au départ.
Je n'ai pas testé donc c'est à voir, le risque d'erreurs n'est pas nul...
Cdlt,
Oui c'est bien ce que j'ai fait mais je n'arrive pas à faire ça :
Puis, rendez vous sur la feuille et en A1 jusqu'à A5 :
=INDEX(PARTIES();LIGNE())Je ne sais pas ce que je fais de mal.
La macro ne nous fournit pas un tableau "classiques" sur ma feuille donc je ne sais pas comment je peux faire un INDEX
De toute façon, si vous avez beaucoup de fichiers, ce n'est pas une bonne option, vous devriez coller le code et la formule dans chacun d'eux. Essayez de créer un nouveau fichier pour y coller le dernier code et l'exécuter afin de voir si tous les fichiers sont bien mis à jour...
Attention, le code mettra les infos en A1:A5 de la feuille en première position. Si ce n'est pas ce qui est voulu, il faudra adapter.
Sinon, pour la fonction, sur ce fichier, je l'ai utilisée comme ça :
Si le nom est altéré, il faudra rajouter les espaces de manière à avoir A - B - ... - E.xlsm
Edit : La formule est à utiliser sur excel et non dans le code
Oui c'est bien ce que je faisais.
Quand je teste votre Excel en le mettant dans mon dossier, uniquement la case A1 se rempli avec le nom du fichier Excel. Les cellules A2 à A5 sont replies avec #REF! (Effectivement par la suite je ne compte attribuer les cases A1 à A5 pour l'attribution des valeurs mais je verrai plus tard.
Je n'ai pas la décomposition du dossier source qui apparait dans les 5 cases.
Mais j'apprécie cette solution là plutôt que l'autre. En effet avec cette solution me permet de créer un dossier source comprenant ce fichier Excel que je dupliquerai à chaque affaire et changerai le nom du fichier Excel.
Comme je vous ai dit, il faut renommer le fichier pour revenir à un modèle T1 - T2 - T3 - T4 - T5.xlsm car, avec le transit par le forum, le nom du fichier a été altéré et a probablement perdu ses espaces. Or, la fonction repose sur une scission du nom en fonction d'un séparateur bien précis " - " (espace&tiret&espace).
Effectivement j'avais raté ce problème là, désolé...
Je vais essayer de récupérer le nom du dossier source pour faire la décomposition et ensuite j'essaierai de renvoyer les valeurs vers des cases placées et différents endroits dans mon fichiers (Pour cela je tenterai de faire apparaitre les 5 valeurs sous forme de tableau à un endroit qui ne me gène pas sur la feuille et je mettrai tout simplement =A1, =A2 ... dans les cases où je veux les valeurs)