Copier une plage de cellules des lignes remplies selon une condition

Résolu
sbertrand13 Messages postés 3 Date d'inscription mercredi 3 juin 2009 Statut Membre Dernière intervention 4 juin 2009 - 3 juin 2009 à 09:49
sbertrand13 Messages postés 3 Date d'inscription mercredi 3 juin 2009 Statut Membre Dernière intervention 4 juin 2009 - 4 juin 2009 à 14:17
Bonjour,

Après avoir cherché une journée sur internet, je me décide à faire appel à vous. J'ai trouvé un code qui me permettait de copier des lignes de cellule sous condition d'une feuille vers une autre. Voici ce code:

Sub selection()
 
  Dim Lig     As Long
  Dim Col     As String
  Dim NbrLig  As Long
  Dim NumLig  As Long
 
  Sheets("Sheet2").Activate                                     ' feuille de destination
 
  Col = "AE"                                                           ' colonne données non vides à tester'  NumLig 1                                                         'alors là ca doit etre le N° de la 1er ligne de données en comptant la ligne 1 0 .... ? '
  With Sheets("Incoming SICMA")                         ' feuille source'
  NbrLig = .Cells(65536, Col).End(xlUp).Row
  For Lig = 2 To NbrLig                                         'n° de la 1ere ligne de données'
    If .Cells(Lig, Col).VALUE <> 0 Then
      .Cells(Lig, Col).EntireRow.Copy
      NumLig = NumLig + 1
      Sheets("Sheet2").Cells(NumLig, 1).Insert Shift:=xlDown
                                                                             'ici pour insérer ou  .Paste pour coller'
    End If
  Next
  End With
End Sub

J'aimerai maintenant ne copier que les cellules des colonnes A, B et AE des lignes concernées.

Ex pour la ligne 2: si la cellule AE2 n'est pas nulle, copie les cellules A2, B2 et AE2 et copie les sur une autre feuille en A1, B1 et C1.

Si c'est possible d'expliquer ligne par ligne les lignes de code, ce serait vraiment génial pour apprendre de nouvelles connaissances ;)

Merci d'avance,

4 réponses

cnt Messages postés 219 Date d'inscription lundi 21 novembre 2005 Statut Membre Dernière intervention 20 décembre 2010 1
4 juin 2009 à 12:36
salut
pour ne coller que les valeurs il faut utiliser l'argument "xlPasteValues"

            'ici pour PasteSpecial pour coller
Sheets("Sheet2").Cells(NumLig, 1).PasteSpecial xlPasteValues

CNTJC
3
cnt Messages postés 219 Date d'inscription lundi 21 novembre 2005 Statut Membre Dernière intervention 20 décembre 2010 1
3 juin 2009 à 16:57
Salut
Cela répont-il à ton problème?

Sub CopieCellulesNonVides()
    Dim Plage As Range, cellule As Range, Colon As Integer, i As Integer
   
    ' Colonne pour condition
    Colon = Range("AC3").Column
   
    ' Plage(Range) de test de la condition
    Set Plage = Range(Cells(1, Colon).End(xlDown), Cells(65536, Colon).End(xlUp))
   
    'boucle pour chaque cellule de la Plage
    For Each cellule In Plage
   
        ' Test ==> cellule non vide
        If Not IsEmpty(c) Then
       
            ' i ==> ligne dans autre feuille
            i = i + 1
           
            ' affectations des valeurs
            Sheets(2).Cells(i, 1) = Cells(cellule.Row, 1)
            Sheets(2).Cells(i, 2) = Cells(cellule.Row, 2)
            Sheets(2).Cells(i, 3) = Cells(cellule.Row, Colon)
        End If
    Next
End Sub
0
sbertrand13 Messages postés 3 Date d'inscription mercredi 3 juin 2009 Statut Membre Dernière intervention 4 juin 2009
4 juin 2009 à 10:51
Bonjour,

Merci pour ta réponse. Elle m'a permis de faire évoluer mon code et d'arriver à ce que je voulais. Toutefois, j'ai un nouveau problème. Les cellules que je copie sont des formules. Je n'aimerai récupérer que la valeur. Voici mon nouveau code:

Sub selection()
 
  Dim Lig     As Long
  Dim Col     As String
  Dim NbrLig  As Long
  Dim NumLig  As Long
 
  Sheets("Sheet2").Activate ' feuille de destination
 
  Col = "AE"                 ' colonne données non vides à tester'  NumLig 1          'alors là ca doit etre le N° de la 1er ligne de données en comptant la ligne 1 0 .... ? '
  With Sheets("Incoming SICMA")     ' feuille source'
  NbrLig = .Cells(65536, Col).End(xlUp).Row
  For Lig = 2 To NbrLig             'n° de la 1ere ligne de données'
    If .Cells(Lig, Col).VALUE <> 0 Then
      .Cells(Lig, 1).Copy
      NumLig = NumLig + 1
      Sheets("Sheet2").Cells(NumLig, 1).Insert Shift:=xlDown
            'ici pour insérer ou  .Paste pour coller'
      .Cells(Lig, 2).Copy
      Sheets("Sheet2").Cells(NumLig, 2).Insert Shift:=xlDown
      .Cells(Lig, 31).Copy
      Sheets("Sheet2").Cells(NumLig, 3).Insert Shift:=xlDown
    End If
  Next
  End With
End Sub

J'ai essayer de changer la ligne rouge en ".Cells(Lig,1).Value.copy" pour n'enregistrer que la valeur mais le débogueur me fait part d'une erreur 9 : "Subscript out of range"

Quelqu'un peut-il m'aider? Merci.
0
sbertrand13 Messages postés 3 Date d'inscription mercredi 3 juin 2009 Statut Membre Dernière intervention 4 juin 2009
4 juin 2009 à 14:17
Ca marche très bien. Merci. A plus.
0
Rejoignez-nous