Rechercher : dans
Par :

Macro excel - copie conditionnelle

Dernière réponse le 30 jui 2008 à 09:08:47 Fabrice, le 29 jui 2008 à 10:20:20 
 Signaler ce message aux modérateurs

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

Configuration: Windows XP
Internet Explorer 6.0

Meilleures réponses pour « Macro excel copie conditionnelle » dans :
Exécuter une macro VoirExécuter une macro Excel et Calc proposent plusieurs façons d’exécuter une macro : en la sélectionnant dans une liste, dans la boîte de dialogue Macro ; par un raccourci clavier ; en l’attachant à un bouton de la barre d’outils ; ...

1

algoplus, le 29 jui 2008 à 11:31:36

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

Répondre à algoplus

2

algoplus, le 29 jui 2008 à 11:43:05

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

Répondre à algoplus

3

algo, le 29 jui 2008 à 11:55:21

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

Répondre à algo

4

algoplus, le 29 jui 2008 à 15:06:45

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

Répondre à algoplus

5

Fabrice, le 29 jui 2008 à 17:27:55

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

Répondre à Fabrice

6

algoplus, le 29 jui 2008 à 19:54:43

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!

Répondre à algoplus

7

 Fabrice, le 30 jui 2008 à 09:08:47

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 :)

Répondre à Fabrice