Boucle VBA pour remplacer valeur dans cellules
Bonjour à tous,
Je me permets de solliciter votre aide sur une macro.
Je travaille actuellement sur un fichier pour générer automatiquement une écriture comptable qui comporte des centaines de lignes (+500)
Mon fichier est composé de plusieurs onglets :
- d'un onglet « source » avec une partie où les utilisateurs doivent remplir les informations de leurs écritures et une partie des formules qui viennent vérifier les données indiquées. 1 ligne a donc toutes les informations pour l’écriture.
- de référentiels pour base de vérification des données de l’onglet « source »
- d’un onglet « écriture » qui récupère les informations renseignées dans l’onglet « source » pour créer lesdites écritures.
Mon fichier ne contient actuellement que des formules.
Pour résumer :
- - 1 ligne de l’onglet « source » contient les informations pour une écriture
- - 2 lignes de l’onglet « écriture » constituent l’écriture finale (en gros 1 ligne de l’onglet « source » est dispatcher sur 2 lignes dans l’onglet « écriture »)
Ma difficulté est :
Lorsque je saisi une formule sur la première ligne de l’onglet « écriture » , par exemple A1 : =SI('Source!A3="";"";'Source!Z3)
Si je tire ma formule sur la ligne du dessous (A2), la formule décale, ce qui est logique et donne : =SI('Source!A4="";"";'Source!Z4)
Sauf que dans mon cas, il faudrait qu’elle change de ligne toutes les 2 lignes (donc en A3, A5, A7, etc…) et pas toutes les lignes.
Vu la quantité de lignes à modifier quand je fais, ça risque d’être très long.
Pour essayer de faire cette modification en masse, j'ai créé 2 colonnes dans mon onglet "écriture". Colonne AG qui contient l'info à remplacer, colonne AH9; l'info à mettre à la place.
J’ai ensuite testé le code suivant :
Dim val1 As String, val2 As String
val1 = ActiveSheet.Range("AG9").Value
val2 = ActiveSheet.Range("AH9").Value
Range("A9:AF9").Select
Selection.Replace What:=val1, Replacement:=val2, LookAt:=xlPart, SearchOrder _
:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
La cellule AG9 contient le numéro de ligne source à modifier, par exemple 3 pour remplacer le 3 de la formule =SI('Source!A3="";"";'Source!Z3)
Et la cellule AH9 contient le nouveau numéro à prendre en compte (dans mon exemple ici 4).
A9:AF9 étant la zone du remplacement.
Ca fonctionne sur une ligne, ce qui donne après macro =SI('Source!A4="";"";'Source!Z4)
Le problème, c’est que même si j’étire la zone, les données seront toujours remplacées selon ce qu’il y a en AG9 et AH9 vu que c'est indiqué en dur.
J’aurais voulu savoir s’il était possible de faire une sorte de boucle, qu’une fois qu’il a remplacé entre A9:AF9 par la donnée de AH9, qu’il passe à A10:AF10 qui prendrait, cette fois, les infos de la cellule AH10 (où j'indique le numéro de ligne à prendre côté "source") et ainsi de suite.
Pensez-vous que c’est possible ?
Merci d’avance pour votre aide.
Cdt
Bonjour et bienvenue,
C'est difficile de te suivre sans fichier exemple, je n'ai peut-etre pas bien saisie la demande.
Je me suis concentré sur ton bout de code que tu souhaites boucler
J’ai ensuite testé le code suivant :
...
La cellule AG9 = 3 et la cellule AH9 = 4
A9:AF9 étant la zone du remplacement.
Ca fonctionne sur une ligne, ce qui donne après macro =SI('Source!A4="";"";'Source!Z4)
Tu peux tester ça :
Sub test()
Dim val1 As String, val2 As String
Dim i As Integer
For i = 9 To 15
'i boucle les lignes de 9 a 15 pour l'exemple
val1 = ActiveSheet.Range("AG" & i).Value
val2 = ActiveSheet.Range("AH" & i).Value
Range("A" & i & ":AF" & i).Select
Selection.Replace What:=val1, Replacement:=val2, LookAt:=xlPart, SearchOrder _
:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
Next i
End SubFor i = 9 to 15 (pour les lignes de 9 a 15)
A+
Super merci beaucoup ca a marché! Tu m'as fait gagné un temps précieux!