Bonsoir,
Beaucoup de remarques à faire !
Sur le fond, c'est un peu bizarre comme emploi d'un tableur de saisir des données et de les déplacer.
Qu'est-ce qui empêche de les entrer directement au bon endroit, ou si ce n’est pas possible lors de la saisie, de les entrer dans une plage quelconque, pas forcément dans la même feuille, et d’utiliser des formules pour les faire apparaître dans les bonnes colonnes dans le tableau de présentation ?
En ce qui concerne le code, prend l’habitude de l’indenter, ce sera + lisible. Par ailleurs, attention aux déclarations :
Dim Tomate As String, x As Integer
n’est pas compatible avec
Tomate = Range(Cells(5, 17 + x), Cells(5, 40))
Range(Cells(5, 17 + x), Cells(5, 40)) renvoie un objet Range (une plage de cellules). Tu ne peux donc le stocker dans «*Tomate*», qui est défini comme une chaîne de caractères.
Essaye également d’être cohérent : dans la ligne ci-dessous,
If Cells(5, 12).Value = Cells(4, 17 + x)
tu emploies .Value pour Cells(5, 12) et pas pour Cells(4, 17 + x). Value est la propriété par défaut d’un objet Range et est implicite dans la grande majorité des cas, mais il vaut mieux décider de le mettre systématiquement ou pas du tout (sauf cas particuliers), mais pas d’alterner.
Il ne faut pas non plus abuser de Cells. Range("AN5") est en général plus facilement compris que Cells(5, 40) ; mais surtout, dans les 2 cas le code sera fragile, car en cas de suppression ou d'insertion de cellules, Cells(5, 40), comme ange("AN5") risquent fort de ne + correspondre à la cellule qui t’intéresse.
Prend l’habitude de donner des noms aux cellules ou aux plages importantes, et utilise ces noms dans le code. Range("RéfProjet1") sera mis à jour chaque fois que la structure de la feuille sera modifiée, et le code continuera à faire référence à la bonne plage.
Regarde également les fonctions DECALER() d’Excel et Offset de VBA qui en est l’homologue. Voici un exemple d’utilisation de Range avec des noms, et d’Offset.
Je t’ai fait un fichier exemple, en PJ. À partir d’une cellule de référence, nommée «*RéfProjet1*», une boucle permet de calculer pour une plage de cellules le montant d’une éventuelle remise. Le nombre de passages dans la boucle repose sur une autre cellule, nommée «*NbItérations*».
1 2 3 4 5 6 7 8 9 10
| Private Sub Demo()
Dim i As Integer
With Range("RéfProjet1")
For i = 1 To Range("NbItérations")
If .Offset(i) >= Range("Seuil") Then
.Offset(i, 1) = .Offset(i) * Range("TxRemise")
End If
Next
End With
End Sub |
La variante suivante est + souple, car elle utilise la zone en cours associée à la cellule nommée «*RéfProjet1*» (.CurrentRegion) pour déterminer le nombre d’itérations.
1 2 3 4 5 6 7 8 9 10
| Private Sub DemoBis()
Dim i As Integer
With Range("RéfProjet1")
For i = 1 To .CurrentRegion.Rows.Count - 1
If .Offset(i) >= Range("Seuil") Then
.Offset(i, 1) = .Offset(i) * Range("TxRemise")
End If
Next
End With
End Sub |
Ces exemples de codes ne sont pas une réponse directe à ta question, mais devraient te faciliter les choses, en t’incitant à prendre de bonnes habitudes.
Bon courage.
Partager