Macro excel - copie conditionnelle

Fabrice -  
 Fabrice -
Bonjour,

Voila j'ai un tableau excel pour faire l'évaluation des risques pour un poste de travail. Chaque risque est écrit sur 3 lignes et pour chaque risque l'utilisateur doit cocher une case pour dire si le poste est concerné par le risque en question ou pas.

Le but de la macro est de copier les risques (donc par tranches de 3 lignes) qui concernent le poste en question sur une nouvelle feuille.

J'ai associé ma case à cocher à une cellule qui indique "VRAI" quand elle est cochée donc je pensais me servir de cette valeur. Le problème c'est que je voulais déclarer une variable "i" qui correspondrait au numéro de la ligne pour avoir en gros:

pour i=1 et j=1
Si la case X="VRAI" copier les lignes (i à i+2) sur la feuilleY à la ligne (j à j+2)
passer à j=j+3 et i=i+3
Sinon passer à i=i+3
et répéter jusqu'à la fin du tableau

Bon je gère mal le langage vba... Donc je commence petit à petit, je voulais donc commencer par copier les 3 premieres lignes de mon tableau sur une feuille vierge mais j'ai un bug je sais pas pourquoi:

Sub Bilan()

Dim i As Integer
i = 1
Sheets("Qualité").Select
Rows(i, i + 2).Select 'là il me dit qu'il y a un bug j'ai essayé en mettant des & autour des variable mais ca bug'
Selection.Copy
Sheets("Bilan").Select
ActiveSheet.Paste

End Sub

Savez vous où se trouve mon erreur et savez vous s'il existe ce genre de petit programme pré établi, ce qui pourrait me faciliter la tâche ?

Cordialement, Fabrice
A voir également:

6 réponses

algoplus
 
rows(i) te ramene une ligne; cells(i,j) pour une cellule

pour avoir les 3 voulues:

for i=1 to 3
Sheets("Qualité").Select
Rows(i).Select
Selection.Copy
Sheets("Bilan").Select
ActiveSheet.Paste
next i

la même action est appliquée à chacune des 3 lignes.

Il y a moyen de selectionner les 3 ligne en une seule fois et d'y appliquer ton couper coller. j'y réfléchis
0
algoplus
 
row('i) pour une ligne; cells(i,j) pour une cellule

tu peux mettre ton code dans une boucle qui s'exécutera 3 fois

for i= 1 to 3
Sheets("Qualité").Select
Rows(i).Select
Selection.Copy
Sheets("Bilan").Select
ActiveSheet.Paste
next i

Il doit y avoir moyen de selectionner les 3 lignes à la fois et d'y appliquer ton copier coller. j'y réfléchi
0
algo
 
3ème tentative de réponse

rows(i) pour les lignes, cells(i,j) pour les cellules

For i = 1 to 3
Sheets("Qualité").Select
Rows(i)
Selection.Copy
Sheets("Bilan").Select
ActiveSheet.Paste
next i

je réfléchis à une solution qui appliquerait ton copier coller directement sur la plage voulue
0
algoplus
 
Mes 3 messages de ce matin ne sont pas visibles ! je recommence

rows(i) pour une ligne ; cells(i,j) pour une cellule

for i = 1 to 3
Sheets("Qualité").Select
Rows(i).Select
Selection.Copy
Sheets("Bilan").Select
ActiveSheet.Paste
next i

on doit pouvoir faire une selection globale sur la plage voulue et appliquer le copier coller à l'ensemble.
J'y réfléchis
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Fabrice
 
Merci algoplus pour l'intéret que tu porte à ma question, tu m'as déjà beaucoup aidé et j'ai un peu avancé de mon coté

J'en viens à une sorte de programme de ce type mais l'écriture et l'appel des variable est un soucis, surtout quand je veux exprimer une variable en fonction d'une autre.

Sub Test()

Dim i As Integer
Dim j As Integer
Dim k As Integer
Dim m As Integer
m = 1
For i = 1 To 10
j = 3i + 1 'problème sur l'expression d'une variable en fonction d'une autre que j'arrive pas à résoudre'

Sheets("Qualité").Select
If Cells(J, j) = "VRAI" Then For k = j To j + 3 'Ici Cells(J,j) désigne la case qui est toujours dans la colonne J mais qui chande de ligne'
Sheets("Qualité").Select
Rows(k).Select
Selection.Copy
Sheets("Bilan").Select
Rows(m).Select 'là m est sensé représenter le numéro de ligne où coller mes informations'
ActiveSheet.Paste
m = m + 1 'là je veux passer à la ligne suivante sur la nouvelle feuille'
Next k
Next i
Else: Next i


End Sub
0
algoplus
 
pour tes variables j = 3i + 1, tu aurais pu l'écrire j=i*3+1

Pour le reste j'ai réfléchis et même si c'est pas tout à fait ce que je voulais, ca fonctionne


Sub test()
Dim i As Integer
Dim j As Integer
Dim m As Integer

m = 1

For i = 1 To 13 Step 3
If Cells(i, 10).Value = "Vrai" Then 'on prend la cel 1 puis 4 puis 7 ...de la colonne J(n°10)
For j = 1 To 3 'on va faire copier coller pour 3 lignes
Worksheets("Qualité").Select
Cells(j + i - 1, 1).Select 'on se positionne en debut de ligne
Range(Selection, Selection.End(xlToRight)).Copy 'on selectionne jusqu'en fin de ligne et on copie
Worksheets("Bilan").Select
Worksheets("bilan").Rows(m).Select 'm vaut 1 au premier passage
Worksheets("bilan").Paste
m = m + 1 'là je veux passer à la ligne suivante sur la nouvelle feuille
Next j
End If
Next i
End Sub

on aurait pu faire une copie comme ca:
Worksheets("qualité").Rows(i+j-1).Select

mais en collant(paste) tu aurais aussi copier la valeur "vrai" de la colonne J

en espérant avoir été clair!
0
Fabrice
 
Merci beaucoup pour ton aide algoplus, J'ai en effet bien saisi la démarche et ca m'a beaucoup aidé, me reste encore à réorganiser pour bien l'adapter à mon tableau, mais l'essentiel est fait et je te remercie encore :)
0