Macro excel - copie conditionnelle

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

6 réponses

  • Votes
  • Date
  • Date décroissante
  1. 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
    1. 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
      1. 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
        1. 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
          1. 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
            1. 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!
          2. 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 :)