Automatisation récupération données

Bonjour à tous,

Dans un fichier excel (que j'ai mis en exemple mais simplifié) je mets un lien vers le devis de chaque affaire (1 affaire par ligne). Je récupère des données automatiquement via ce devis (voir cellule D2). Forcément ma valeur de référence change à chaque ligne (mais pas la feuille et la cellule, juste le nom du fichier).

Ai-je une possibilité d'automatiser cette formule en D2 (peut-être en VBA ?) sur toutes mes lignes de cette colonne en fonction du lien que j'insèrerai au fur et à mesure ?

Merci pour votre aide

19classeur2.xlsx (9.79 Ko)

Bonsoir,

je joins un essai par formule, j'espère que ça marchera

Bonjour,

Merci pour l'aide, ça a l'air trop bien. Mais malheureusement, ça ne fonctionne pas J'ai une erreur #REF! : dans le pas à pas détaillé j'ai : la cellule en cours d'évaluation contient une constante... (c'est la cellule E2 qui est colorée)

Bonjour,

en effet, je viens de me rendre compte que INDIRECT() n'aime pas trop les classeurs fermés visiblement, je me suis tourné vers une solution VBA du coup...

j'ai utilisé ce code pour la feuille que je joins:

Private Sub Worksheet_Change(ByVal Target As Range)
Dim zone As Range, cel As Range
Dim ligne As Long

Application.EnableEvents = False

For Each zone In Target.Areas
    For Each cel In zone.Cells
        '='C:\Users\nicol\Downloads\[lien vers devis001.xlsx]Presta'!$A$15
        If (Target.Column = 5 Or Target.Column = 7) And Target.Row >= 2 Then
            ligne = Target.Row
            If Range("e" & ligne) <> "" And Range("g" & ligne) <> "" Then
                Range("d" & ligne).Formula = "='" & Range("g" & ligne) & "[" & Range("e" & ligne) & "]Presta'!$A$15"
            End If
        End If
    Next cel
Next zone

Application.EnableEvents = True
End Sub

J'ai dû rajouter une colonne chemin pour être sûr que le classeur soit trouvé.

Super ! Merci beaucoup, ça marche du tonnerre.

Par contre, est-ce que tu peux m'expliquer les étapes du code s'il te plait car déjà j'aime bien comprendre je ce que fais et pas juste copier bêtement et ensuite j'ai plusieurs cellules concernées, pas juste la colonne "affaire" (il faut que j'apporte des modif dans le même code ou j'en créé un pour chaque cellule concernée ?)

Merci

Autres questions :

- dans mon fichier le lien devis correspond bien au chemin, du coup, suis-je quand même obligée de créer 2 colonnes comme tu l'as fait ?

-est-ce possible quand ma cellule de chemin de devis est vide, que les cellules à remplir soient vides ? Car là par défaut ça me demande un chemin, et si j'en mets pas ça remplit les cellules avec les premières valeurs

Merci pour tout

Bonjour,

je vais tenter de répondre à tes questions, j'aurais aimé plus simple comme solution mais on fera avec:

Private Sub Worksheet_Change(ByVal Target As Range)

La première ligne de la macro pour commencer, il s'agit d'une macro événementielle, elle se lance quand un évènement précis arrive, ici c'est Worksheet_Change, elle se lancera donc si un changement arrive dans la feuille où se trouve cette ligne.

Le problème c'est donc que cette macro se lance peu importe la modification, dans l'exemple je souhaite que ça n'arrive que si on change le chemin ou le lien du devis, et également, je souhaite gérer le fait que plusieurs plages de cellules puissent être modifiées, et que chaque plage puisse contenir plusieurs cellules.

Premièrement, comme je vais modifier des cellules dans le code, pour ne pas lancer à nouveau la macro, j'utilise:

Application.EnableEvents = False

qui désactive le lancement des macros évènementielles.

Ensuite, pour parcourir toutes les cellules qui ont été modifiées, je fais:

For Each zone In Target.Areas
    For Each cel In zone.Cells
        'reste du code    
    Next cel
Next zone

J'utilise des boucles For Each qui sont différentes des boucles For i, les boucles For i...Next i font évoluer une variable numérique i qui va s'incrémenter à chaque tour de boucle jusqu'à atteindre la valeur plafond de la boucle, pour For Each, on parcours tous les objets d'une collection d'objets jusqu'au dernier, donc ici on parcours toutes les zones modifiées, et pour chaque zone modifiée, on parcours toutes ses cellules.

Les évènements sont désactivés, on parcours toutes les cellules, il reste à traiter uniquement celles qui nous intéresse, pour ça j'utilise:

        If (Target.Column = 5 Or Target.Column = 7) And Target.Row >= 2 Then

ce test vérifie que la colonne où la valeur est modifiée est soit la numéro 5, soit la numéro 7, et que ce ne soit pas une ligne d'en-tête (numéro de ligne supérieur ou égale à 2), si ces conditions sont respectées on passe à la partie modification.

If Range("e" & ligne) <> "" And Range("g" & ligne) <> "" Then

Ce test est un test supplémentaire qui évite qu'on modifie les formules si le chemin ou le lien ne sont pas précisés, je teste que les cellules de ces colonnes qui se trouvent sur la ligne où a eu lieu la modification ne sont pas vides.

Range("d" & ligne).Formula = "='" & Range("g" & ligne) & "[" & Range("e" & ligne) & "]Presta'!$A$15"

Enfin la ligne où on change la formule de la cellule pour ne pas passer par un INDIRECT(), je passe par la cellule en colonne D de la ligne où a eu lieu la modification et je modifie sa formule en passant par .Formula, j'utilise le & commercial pour concaténer les valeurs, car il y a des constantes mais aussi des variables (les cellules qui contiennent le chemin, le lien).


dans mon fichier le lien devis correspond bien au chemin, du coup, suis-je quand même obligée de créer 2 colonnes comme tu l'as fait ?

Si tu n'as pas besoin du chemin du fichier, on peut s'en passer, c'était juste une sécurité en plus, en revanche il faudra modifier quelques lignes du code, ça pourrait être un bon exercice pour toi dans la compréhension du code.

est-ce possible quand ma cellule de chemin de devis est vide, que les cellules à remplir soient vides ? Car là par défaut ça me demande un chemin, et si j'en mets pas ça remplit les cellules avec les premières valeurs

Je ne suis pas totalement sûr d'avoir compris la question, tu pourrais essayer de la reformuler après avoir lu les explications données plus haut?

Je réexpliquerai certains points si certains ne sont pas totalement clairs, j'aurais pu expliquer de façon plus détaillée mais ça risquait d'être trop lourd après.

Merci pour toutes ces explications; Vraiment sympa.

j'ai modifié le code comme cela :

Private Sub Worksheet_Change(ByVal Target As Range)Dim zone As Range, cel As RangeDim ligne As LongApplication.EnableEvents = FalseFor Each zone In Target.Areas For Each cel In zone.Cells '='[chemindevis.xlsx]Presta'!$A$15 If Target.Column = 9 And Target.Row >= 2 Then ligne = Target.Row If Range("i" & ligne) <> "" Then Range("d" & ligne).Formula = "='" & Range("i" & ligne) & "[" & Range("i" & ligne) & "]Presta'!$A$15" End If If Range("i" & ligne) <> "" Then Range("b" & ligne).Formula = "='" & Range("i" & ligne) & "[" & Range("i" & ligne) & "]Presta'!$D$25" End If End If Next celNext zoneApplication.EnableEvents = TrueEnd Sub

Ca a fonctionné mais maintenant plus rien ne marche

En plus je me suis aperçue que le nom du chemin peut totalement varié et le fait qu'il apparaisse dans le code je crois que ça perturbe ?

Pour mes cellules vides : en fait quand je n'ai pas de chemin d'inséré dans la colonne i (g dans mon fichier exemple) je veux que mes colonnes (b et d) restent vide alors que par défaut il met la valeur de la ligne 1 ou "/restauration"

Je ne sais pas ce que j'ai foutu mais j'ai l'impression que le code ne s'exécute plus...

Bonjour,

j'ai un peu du mal à comprendre ce qui a été modifié, as-tu utilisé le bouton "</>" pour insérer ton code sur le forum?

Forcément je m'était trompée... pfff quelle nulle. Voilà :

Private Sub Worksheet_Change(ByVal Target As Range)
Dim zone As Range, cel As Range
Dim ligne As Long
Application.EnableEvents = False
For Each zone In Target.Areas 
For Each cel In zone.Cells '='[chemindevis.xlsx]Presta'!$A$15 
If Target.Column = 9 And Target.Row >= 2 Then 
ligne = Target.Row 
If Range("i" & ligne) <> "" 
Then Range("d" & ligne).Formula = "='" & Range("i" & ligne) & "[" & Range("i" & ligne) & "]Presta'!$A$15" 
End If 
If Range("i" & ligne) <> "" Then 
Range("b" & ligne).Formula = "='" & Range("i" & ligne) & "[" & Range("i" & ligne) & "]Presta'!$D$25" 
End If 
End If
 Next cel
Next zone
Application.EnableEvents = True
End Sub

Bonjour,

je propose une modification:

Private Sub Worksheet_Change(ByVal Target As Range)
Dim zone As Range, cel As Range
Dim ligne As Long

Application.EnableEvents = False
For Each zone In Target.Areas
    For Each cel In zone.Cells '='[chemindevis.xlsx]Presta'!$A$15
        If Target.Column = 9 And Target.Row >= 2 Then
            ligne = Target.Row
            If Range("i" & ligne) <> "" Then
                Range("d" & ligne).Formula = "='" & Range("i" & ligne) & "[" & Range("i" & ligne) & "]Presta'!$A$15"
                Range("b" & ligne).Formula = "='" & Range("i" & ligne) & "[" & Range("i" & ligne) & "]Presta'!$D$25"
            End If
        End If
    Next cel
Next zone
Application.EnableEvents = True
End Sub

Si l'évènement ne se lance pas c'est que tu n'es pas retombée sur la ligne

Application.EnableEvents = True

Tu peux éventuellement mettre cette ligne dans un code à part pour réactiver les évènements si besoin.

Merci je vais tester ça.

Il y a une chose qui m'embête un peu : dans le code en vert il y a un premier chemin vers un fichier mais ce chemin varie à chaque fois et peut avoir un nom totalement différent. Est-ce que cela a une incidence ?

Ah non pas du tout, ce qui est en vert est un commentaire qui n'est pas lu par VBA, il est ici pour les utilisateurs, je l'avais mis pour avoir une idée de ce que devait donner la formule à la fin, ça m'a aidé pour coder mais on peut l'enlever à présent.

Ahhhhhhhh....

J'ai deux problèmes :

- ça ne s'exécute plus du tout même si je créé un nouveau fichier...

- à un moment le débogage a fonctionné et a surligné en jaune cette partie là : Range("d" & ligne).Formula = "='" & Range("i" & ligne) & "[" & Range("i" & ligne) & "]Presta'!$A$15"

comme je n'ai créé qu'une colonne et non deux comme dans ton fichier exemple, ça ne doit pas fonctionner; je ne sais pas quelle partie modifier du code.

Bonjour, est-t-il possible que je vois le fichier pour débuguer?

9test-dossiers.xlsm (15.80 Ko)

Merci pour l'aide et la patience

J'ai testé le fichier, modifié la cellule I2, la macro se lance bien et les formules apparaissent, tu as bien activé les macros en ouvrant ton fichier???

Oui pourtant

Rechercher des sujets similaires à "automatisation recuperation donnees"