Macro copier-coller en boucle sur plusieurs onglets
Bonjour,
Je débute le VBA pour mener à bout un projet de calcul d'investissement sur Excel.
Je souhaite principalement réaliser des opérations de copier-coller par plages de cellules sur plusieurs onglets.
Ces copier-coller sont soumis également à conditions (généralement que les données comprises dans des plages de cellules ne soient pas égales à 0).
Voici tout d'abord mon code en entier :
Sub Investment()
Dim i As Integer, j As Integer, m As Integer, n As Integer, p As Integer
m = 16
n = 40
p = 2
Worksheets("OD").Range("D16:AB25").Value = 0
Worksheets("OD").Range("D40:AB49").Value = 0
For q = 4 To Sheets.Count - 1
Worksheets("OD").Range("D144:AB144").Copy
Worksheets(q).Range("D71:AB71").Paste
Next
For j = 2016 To 2040
For i = 4 To Sheets.Count - 1
If Worksheets("OD").Range("D" & m & ":AB" & m).Value <> 0 And Worksheets("OD").Range("D" & n & ":AB" & n).Value <> 0 Then
m = m + 1
n = n + 1
p = p + 1
Else
Worksheets(i).Activate
Worksheets(i).Range("C7").Value = j
If Worksheets(i).Range("D76").Value > 0 Then
Worksheets(i).Range("D43:AB43").Copy
Worksheets("OD").Paste Destination:=Worksheets("OD").Range("D" & m & ":AB" & m)
Worksheets(i).Range("D43:AB43").Copy
Worksheets("OD").Paste Destination:=Worksheets("OD").Range("D" & n & ":AB" & n)
Worksheets(InvYear).Range("B" & p).Value = j
Else
End If
m = m + 1
n = n + 1
p = p + 1
End If
Next
Next
End SubPlusieurs problèmes se posent face à mon inexpérience :
- Une incompatibilité de type sur le bout de code :
Worksheets("OD").Range("D" & m & ":AB" & m).Value <> 0 And Worksheets("OD").Range("D" & n & ":AB" & n).Value <> 0Pourtant les cellules sont bien au format nombre sur Excel. Je pense que le problème peut venir du fait que c'est une plage de cellule.
- "Propriété ou méthode non gérée par cet objet" pour :
Worksheets(q).Range("D144:AB144").Paste- Erreur d'execution que je comprends pas encore :
Worksheets("OD").Paste Destination:=Worksheets("OD").Range("D" & m & ":AB" & m)Worksheets("OD").Paste Destination:=Worksheets("OD").Range("D" & n & ":AB" & n)Je souhaite ici coller les valeurs copiées dans l'onglet "OD" dans les plages de cellules D16:AB16 (car ici n=16) et D40:AB40 (car ici n=40).
Je joins mon fichier en valeurs à ce message, même s'il est assez vaste.
Je précise que je suis débutant (je commence à peine le VBA, même si j'ai des bases dans quelques autres langages).
Pour l'idée générale de mon code VBA dans mon fichier excel.
Je veux tout d'abord que les cellules des plages D16:AB25 et D40:AB49 de l'onglet "OD" soient égales à 0.
Puis je veux copier la plage de cellules de l'onglet "OD" D144:AB144 et la coller sur les cellules D71:AB71 de tous les onglets Invest01 jusqu'à Invest10.
Pour le reste c'est un peu plus compliqué, mais l'idée est la même, toujours des copier-coller de plages de cellules. La boucle for sur i est là pour réaliser ces copier-coller sur les différents onglets, mais j'ai l'impression que ca ne marchera pas comme cela.
Pourriez-vous m'aider s'il vous plait?
Merci d'avance
Bonjour et bienvenue sur le forum
Tu écris :
Code:
If Worksheets("OD").Range("D" & m & ":AB" & m).Value <> 0 And Worksheets("OD").Range("D" & n & ":AB" & n).Value <> 0
Pourtant les cellules sont bien au format nombre sur Excel. Je pense que le problème peut venir du fait que c'est une plage de cellule.
Tu as tout à fait raison, une plage ne peut pas être <> 0. Si tu veux dire " Si toutes les cellules de la plage sont <> 0..." il te faut tester toutes les cellules de cette plage, l'une après l'autre.
Code:
Worksheets(q).Range("D144:AB144").PasteCette instruction est incorrecte.
Remplace la par exemple par une instruction qui l'associe à la zone copiée de la façon suivante :
Sheets("OD").Range("D144:AB144").Copy Sheets(q).Range("D71")Bye !
gmb a écrit :Bonjour et bienvenue sur le forum
Tu écris :
Code:
If Worksheets("OD").Range("D" & m & ":AB" & m).Value <> 0 And Worksheets("OD").Range("D" & n & ":AB" & n).Value <> 0
Pourtant les cellules sont bien au format nombre sur Excel. Je pense que le problème peut venir du fait que c'est une plage de cellule.
Tu as tout à fait raison, une plage ne peut pas être <> 0. Si tu veux dire " Si toutes les cellules de la plage sont <> 0..." il te faut tester toutes les cellules de cette plage, l'une après l'autre.
Code: Worksheets(q).Range("D144:AB144").PasteCette instruction est incorrecte.
Remplace la par exemple par une instruction qui l'associe à la zone copiée de la façon suivante :
Sheets("OD").Range("D144:AB144").Copy Sheets(q).Range("D71")Bye !
Pour tester chaque valeur de la plage de cellule, pensez-vous qu'il vaut mieux utiliser une boucle avec :
for r = 4 to 28
if
Cells(r , m) <>0 And Cells(r , m) <>0 Then
m = m + 1
n = n + 1
p = p + 1
Else
...A la place de :
Worksheets("OD").Range("D" & m & ":AB" & m).Value <> 0 And Worksheets("OD").Range("D" & n & ":AB" & n).Value <> 0
??
En tout cas merci beaucoup pour votre aide.
Si l'instruction incorrecte que tu as écrite veut bien dire "Si la plage... n'a aucune cellule vide et si la plage ...n'a aucune cellule vide"
remplace la par :
flag = 0
For k = 4 To 27 'pour faire varier la colonne de D à AB
If Sheets("OD").Cells(m, k) = "" Then
flag = 1
End If
If Sheets("OD").Cells(n, k) = "" Then
flag = 1
End If
Next k
If flag = 0 Then ' On est dans le cas où aucune cellule des deux plages n'est videBye !
gmb a écrit :Si l'instruction incorrecte que tu as écrite veut bien dire "Si la plage... n'a aucune cellule vide et si la plage ...n'a aucune cellule vide"
remplace la par :
flag = 0 For k = 4 To 27 'pour faire varier la colonne de D à AB If Sheets("OD").Cells(m, k) = "" Then flag = 1 End If If Sheets("OD").Cells(n, k) = "" Then flag = 1 End If Next k If flag = 0 Then ' On est dans le cas où aucune cellule des deux plages n'est videBye !
En réalité je souhaite écrire "Si les plages Dm:ABm et Dn:ABn n'ont aucune cellule de valeur égale à 0". Mais la logique du code est là je pense et tout à fait adaptable.
En substance, je veux copier des valeurs, et les coller sur les cellules Dm:ABm et Dn:ABn (avec m et n qui vont changer) si celles-ci ont des valeurs nulles. Si les valeurs des cellules Dm:ABm et Dn:ABn sont non nulles, cela veut dire que l'investissement a déjà été réalisé, donc il ne faut pas effectuer de copier coller sur les lignes m et n.
Alors, adapte de la façon suivante :
flag = 0
For k = 4 To 27 'pour faire varier la colonne de D à AB
If Sheets("OD").Cells(m, k) = 0 Then
flag = 1
End If
If Sheets("OD").Cells(n, k) = 0 Then
flag = 1
End If
Next k
If flag = 0 Then 'Bye !