Remplissage automatique avec insertion de ligne VBA
Bonjour à tous,
Vous lire m'a grandement aidé sur plein de problèmes que j'avais sur mes macros, mais la, étant pas un grand champion des macros, je suis en difficulté, je sollicite donc votre aide
Alors, dans le fichier joint, vous verrez dans une première feuille un tableau avec 3 colonnes :
- Feuille
- Code
- Valeur
Mon but est d'avoir une macro me permettant de copier de 2 façons différents les donnés "code" dans les feuilles indiquées dans ce tableau (que je puisse faire une recherchev après pour récupérer la valeur de ce code)
En A1, je souhaiterais que une macro insère le nombre de ligne correspondant au nombre de code que j'ai dans le tableau et comme ce nombre peut varier, il faut que je puisse actualiser (donc qu'avec la meme macro cela supprime les lignes entre les 2 bordures puis ajoute le nombre de ligne dont j'ai pour insérer tout mes codes). il faudrait ensuite que la macro insère une rechercheV pour récupérer les valeurs.
En A2, c'est plus complexe, il faudrait que une autre macro (une macro par feuille ) créée autant de "bloc" que dans mon exemple.
En gros 3 code à récupérer, 3 tableau à créer et il faut copier coller chaque code dans un "tableau".
J'ai déjà une ébauche de code pour le A1, mais il est lourd. Pour le A2 j'arrive à rien ...
Si vous aviez des pistes pour m'aider ce serait tip top !!!
Merci beaucoup
J'ai réussi pour la première solution cela fonctionne,
Personne n'a d'idée pour la boucle qui me permettrai de copier les valeurs avec des lignes d'écarts ?
Hello,
Ah c'est génial, j'étais incapable d'écrire ca, après mes tests ca fonctionne parfaitement,
Il faut juste que j'arrive à le comprendre pour pouvoir l'adapter à mon vrai fichier maintenant
Petite question en anticipation, c'est faisable de rajouter du code pour que lorsque l'on relance la macro, il n'y ai pas besoin de supprimer manuellement ce qui avait été importé pour éviter les doublons ?
Merci beaucoup !
Bonjour,
Le fichier avec la suppression des anciennes données et des commentaires sur le déroulement de la macro.
Cordialement
Re,
Une erreur sur le fichier joint précédemment.
Je pense que celui-ci devrait être bon.
Ok c'est génial cette macro, j'ai réussi à l'adapter à mon fichier et à la compléter
Il y a une chose que je me demande, c'est possible de faire la mise en forme sur cette macro ?
Lorsqu'elle insère les cellules, ajouter une ligne dans la boucle pour lui dire de colorer en jaune par exemple,
j'ai essayé avec mes basiques mais je ne suis pas sur qu'on puisse
En tous cas encore un Grand MERCI, ca m'a sauvé j'étais loin d'écrire quelque chose de ci-bien, j'ai re modifié en A1 (qui filtrait, copier coller et insérer un look up) ...
- Messages
- 2'415
- Excel
- 2019
- Inscrit
- 13/07/2017
- Emploi
- Formateur, animateur,tech.informatique
Bonjour toutes et tous
Merci à Haonv qui a fait le plus gros travail
si j'ai compris dans la feuille Base de ton classeur avec l'aide de la macro sur le Module1 d'Haonv
en ajoutant :
' -[...] -- code
Trouve.Font.ColorIndex = 6 ' couleur jaune ajouter
' suite du code
ici sur le forum pour les couleurs
Option Explicit
Sub copierA2()
Dim MaPlage As Range, Trouve As Range, Adresse1 As String
Dim Compteur As Integer, Nb As Integer, i As Integer
''on supprime les anciens blocs
With Worksheets("A2")
If .Range("A:A").Find("TOTAL PLAGE").Row > 11 Then
.Range("7:" & .Range("A:A").Find("TOTAL PLAGE").Row - 5).Delete
End If
End With
Application.ScreenUpdating = False
If Worksheets("Base").Range("B4") <> "" Then ''on vérifie qu'on a des données à traitées
With Worksheets("Base")
.Range("B3:D3").AutoFilter ''on supprime les filtres qui peuvent faussées les plages de données
Set MaPlage = .Range("B3:B" & Range("B3").End(xlDown).Row) ' on détermine la plage à traitée
Nb = Application.WorksheetFunction.CountIf(MaPlage, "A2") ''on compte le nombre de "A2", pour déterminer le nombre de lignes à insérer
End With
Set Trouve = MaPlage.Find("A2") ' on cherche la premiere adresse de "A2"
If Not Trouve Is Nothing Then
Adresse1 = Trouve.Address ' on mémorise la premiere adresse
With Worksheets("A2")
.Rows(5).Resize(Nb * 3).Insert Shift:=xlDown
Compteur = 4 ''on initialise le compteur à 4
Do
Compteur = Compteur + 3 ' on incremente le compteur qui détermine la ligne ou sera inscrit les données
.Cells(Compteur, 2) = "Code" ''on inscrit les données
.Cells(Compteur, 3) = "Valeur"
.Cells(Compteur + 1, 2) = Trouve.Offset(, 1)
Trouve.Font.ColorIndex = 0 ' noir ajouter https://www.excel-pratique.com/fr/vba/couleurs.php
.Cells(Compteur + 1, 3) = Trouve.Offset(, 2)
Trouve.Font.ColorIndex = 6 ' jaune ajouter https://www.excel-pratique.com/fr/vba/couleurs.php
Set Trouve = MaPlage.FindNext(Trouve) ' on cherche le prochain "A2"
Loop While StrComp(Adresse1, Trouve.Address) <> 0 '' on boucle tant que l'on ne retrouve pas la premier adresse de "A2"
Trouve.Font.ColorIndex = 10 ' vert foncé ajouter https://www.excel-pratique.com/fr/vba/couleurs.php
End With
End If
Worksheets("Base").Range("B3:D3").AutoFilter ''on remet le filtre
End If
Application.ScreenUpdating = True
End Sub
crdlt,
André
Yes je parlais aussi lors de l'import, mais j'ai du faire une erreur la première fois en essayant car la ca remarche :
Cells(Compteur, 2).Interior.Color = RGB(174, 240, 194)
Ce qui me permet ainsi de mettre en forme tout ce qui est importé dans mon fichier final (beaucoup plus lourd, et macro à adapter à un 10aines de feuilles avec des informations différentes et surtout pas mal de modification).
Je pense que je peux m'en sortir maintenant sur ce fichier, en espérant qu'il peut en aider d'autres, car c'est super utile comme macro, je le réutiliserai souvent
Encore merci
Bonjour,
je reprend ce fil, parce qu'en adaptant cette macro je bute sur un problème,
Macro du fichier :
'on supprime les anciens blocs
If Worksheets("A2").Range("A:A").Find("TOTAL PLAGE").Row > 11 Then
Range("5:" & Worksheets("A2").Range("A5:A100").Find("TOTAL PLAGE").Row - 7).Delete
End If
Elle supprime donc les lignes à partir de la ligne 5 jusqu'à la cellule TOTAL PLAGE,
Si j'ai en colonne A une cellule contient "Début" et une contient "total plage" et que je souhaite qu'elle supprime entre Début +1 et Total Plage - 1 ; Auriez vous une idée ?
J'ai essayé de combiner des range mais j'ai toujours un message d'erreur, et j'ai pas d'idée pour créer un for qui fonctionnerai ...
Merci
C'est bon j'ai trouvé en fait,
En gros :
L as integer
If (Meme conditions )
For L = Range'("A:A").Find("Début").Row +1 TO Range'("A:A").Find("Total").Row -1
Rows(L).Delete
L=L+1
Bon en fait, après plusieurs essais, ça supprime des lignes en dessous de ma ligne total ainsi que ma ligne total, pour une raison inexplicable
J'ai crié victoire trop vite, donc si quelqu'un a une macro un peu mieux pour supprimer toutes les lignes comprises entre deux cellules sans supprimer lesdites cellules je suis preneur ! (surtout après avoir épluché toutes les boucles possibles et imaginables ce soir avec mes compétences ahah)
Si ça peut en aider certains, en cas de "For" pour supprimer des lignes il faut faire tourner la macro en "Step -1", sinon il y a un décalage qui va supprimer la ligne total, donc mon problème est résolu
J'essaye d'ajouter des recherches V dans la macro de Haonv, mais ca ne fonctionne pas, quelqu'un saurait comment faire ?
En gros au niveau du compteur, j'aimerai pour certaines de mes feuilles que mes données se mettent à jour,
donc on garde le compteur et offset sur la première ligne, mais j'aimerai qu'elle insère une recherche V en fonction de ce qui a été inséré à gauche.
Ca me semblait facile, mais rien de ce que j'essaye fonctionne ...
Bonjour,
Pour insérer recherchev, remplace
.Cells(Compteur + 1, 3) = Trouve.Offset(, 2)
Par
.Cells(Compteur + 1, 3).FormulaLocal = "=RECHERCHEV(B" & Compteur + 1 & ";Base!C:D;2;0)"
dans la boucle du compteur.
Pour ce qui est de supprimer les lignes entre "Début" et "Total plage", tu n'es pas obligé de faire une boucle.
Dim LigneDebut As Integer, LigneTotal As Integer
LigneDebut = Range("A:A").Find("Début").Row + 1
LigneTotal = Range("A:A").Find("Total plage").Row - 1
Range(LigneDebut & ":" & LigneTotal).Delete
supprime les lignes en une fois.
Cordialement
Je vais t'envoyer une caisse de vin Haonv, c'est magnifique ma macro grâce à toi !
Merci,
Pas de problème, j'ai encore de la place dans ma cave....
Cordialement
Ahah,
J'aurai 2 toutes dernières questions sur ton code et je serai bon,
Te semble-t-il possible de :
- Au niveau du filtre sur la plage, indiquer la colonne dans laquelle il doit rechercher (je veux tous les A1, mais il se peut que j'ai un A1 ailleurs)
- Effectuer un filtre avant qu'il recherche dans la plage (filtrer sur une valeur une colonne, et ensuite chercher dans cette plage A1) par exemple !
Si ce n'est pas possible je me débrouillerai autrement mais si c'est possible ce serait bien cool
Bonjour,
Il faudrait un peu plus de précisions.
- Au niveau du filtre sur la plage, indiquer la colonne dans laquelle il doit rechercher (je veux tous les A1, mais il se peut que j'ai un A1 ailleurs)
comment doivent être déterminées les colonnes: parmi certaines; par l'utilisateur; ou autre ?
Pourra-t-il y avoir plusieurs colonnes lors d'un même traitement ?
- Effectuer un filtre avant qu'il recherche dans la plage (filtrer sur une valeur une colonne, et ensuite chercher dans cette plage A1) par exemple !
c'est ce que fait la macro:elle filtre sur B, transcrit les données sur la 2° feuille et remet le filtre à toutes les valeurs de B
Cordialement
Mon premier tirer n’a aucun intérêt en fait,
Alors ce que je voulais dire, je me suis mal exprimé,
C’est est ce qu’il peut faire la recherche selon deux critères,
Dans une colonne je vais avoir des 1, 2, 3...
dans une autre A1, ...
Je peux avoir sur des lignes 1 et A1 comme 2 et A1,
Je me demandais donc si je pouvais rechercher dans la plage les A1 si dans l’autre ligne j’ai 1 ?
Si c’est trop compliqué pas de soucis j’arrive à contourner mais ça complexifie pas mal mon fichier
Re,
Je peux avoir sur des lignes 1 et A1 comme 2 et A1,
Dans quand colonne seront les 1 ou 2 ....