VBA - Copier/coller des lignes sous condition
TheFlow31
Messages postés
1
Date d'inscription
Statut
Membre
Dernière intervention
-
michel_m Messages postés 16602 Date d'inscription Statut Contributeur Dernière intervention -
michel_m Messages postés 16602 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour,
Je suis complètement novice sur le langage VBA, et malgré mes recherches sur les forum et livre, je ne trouve pas.
Dans mes feuilles nommées "Actions en cours" et "Actions en attente", j'ai un tableau avec plusieurs lignes et lorsque dans la colonne G, on trouve la valeur 1, je souhaiterai que certaines informations de la ligne soient copiées et collées dans une autre feuille nommée "Tableau de bord".
Par contre, lorsque l'on clique sur le bouton qui lance l'action VBA, les lignes qui ont été collées précédemment ne doivent pas être écrasées par les nouvelles lignes renseignées.
Pouvez vous m'aider a écrire le code pour cette action ?
Dessous vous trouverez ce que j'ai commencé à faire mais j'ai une erreur d'éxécution '13' - Incompatibilité de type que je ne sait résoudre:
Je suis complètement novice sur le langage VBA, et malgré mes recherches sur les forum et livre, je ne trouve pas.
Dans mes feuilles nommées "Actions en cours" et "Actions en attente", j'ai un tableau avec plusieurs lignes et lorsque dans la colonne G, on trouve la valeur 1, je souhaiterai que certaines informations de la ligne soient copiées et collées dans une autre feuille nommée "Tableau de bord".
Par contre, lorsque l'on clique sur le bouton qui lance l'action VBA, les lignes qui ont été collées précédemment ne doivent pas être écrasées par les nouvelles lignes renseignées.
Pouvez vous m'aider a écrire le code pour cette action ?
Dessous vous trouverez ce que j'ai commencé à faire mais j'ai une erreur d'éxécution '13' - Incompatibilité de type que je ne sait résoudre:
Sub ACTUALISATION_DONNEES_TDB() Dim i As Integer, j As Integer, Derlig As Integer Dim Ligvid As Integer Dim Tampon1 As Integer Dim Tampon2 As Integer Dim Tampon3 As Integer Dim Tampon4 As Integer Application.ScreenUpdating = False 'Lance la sub EFFACER pour purger le tableau avant compilation EFFACER For j = 4 To 5 Sheets(j).Select Derlig = Sheets(j).Range("A" & Rows.Count).End(xlUp).Row For i = Derlig To 2 Step -1 Sheets(j).Select If UCase(Range("G" & i)) = "1" Then 'mémorisation de la plage à transfèrer Tampon1 = Sheets(j).Range("A" & i & ":A" & i) Tampon2 = Sheets(j).Range("C" & i & ":F" & i) Tampon3 = Sheets(j).Range("H" & i & ":J" & i) Tampon4 = Sheets(j).Range("L" & i & ":L" & i) 'Tampon = Range(Cells(Lig, "A"), Cells(Lig, "L")) With Sheets("Tableau de bord") '1° ligne vide Ligvid = .Columns("A").Find("", .Range("A1")).Row 'écriture de la plage With .Range(.Cells(Ligvid, "A")) .Value = Tampon1 'écriture de la plage With .Range(.Cells(Ligvid, "B"), .Cells(Ligvid, "E")) .Value = Tampon2 'écriture de la plage With .Range(.Cells(Ligvid, "F"), .Cells(Ligvid, "H")) .Value = Tampon3 'écriture de la plage With .Range(.Cells(Ligvid, "I")) .Value = Tampon4 End With End With End With End With End With End If Next Next Sheets("Tableau de bord").Activate End Sub
A voir également:
- VBA - Copier/coller des lignes sous condition
- Historique copier coller - Guide
- Copier coller pdf - Guide
- Copier-coller - Accueil - Informatique
- Style d'écriture a copier coller - Guide
- Excel cellule couleur si condition texte - Guide
2 réponses
Bonjour
Je te propose cette macro
Sub traitement()
Dim i As Long, col As Integer, derlig As Long, dercol As Integer
dercol = Sheets("Actions en cours").Range("A1").End(xlToRight).Column
For i = 1 To Sheets("Actions en cours").Range("A" & Rows.Count).End(xlUp).Row
If Sheets("Actions en cours").Cells(i, 7).Value = 1 Then
derlig = Sheets("Tableau de bord").Range("A" & Rows.Count).End(xlUp).Row + 1
dercol = Sheets("Actions en cours").Range("A1").End(xlToRight).Column
For col = 1 To dercol
Sheets("Tableau de bord").Cells(derlig, col).Value = Sheets("Actions en cours").Cells(i, col).Value
Next
End If
Next
dercol = Sheets("Actions en attente").Range("A1").End(xlToRight).Column
For i = 1 To Sheets("Actions en attente").Range("A" & Rows.Count).End(xlUp).Row
If Sheets("Actions en attente").Cells(i, 7).Value = 1 Then
derlig = Sheets("Tableau de bord").Range("A" & Rows.Count).End(xlUp).Row + 1
For col = 1 To dercol
Sheets("Tableau de bord").Cells(derlig, col).Value = Sheets("Actions en attente").Cells(i, col).Value
Next
End If
Next
End Sub
A+ François
Je te propose cette macro
Sub traitement()
Dim i As Long, col As Integer, derlig As Long, dercol As Integer
dercol = Sheets("Actions en cours").Range("A1").End(xlToRight).Column
For i = 1 To Sheets("Actions en cours").Range("A" & Rows.Count).End(xlUp).Row
If Sheets("Actions en cours").Cells(i, 7).Value = 1 Then
derlig = Sheets("Tableau de bord").Range("A" & Rows.Count).End(xlUp).Row + 1
dercol = Sheets("Actions en cours").Range("A1").End(xlToRight).Column
For col = 1 To dercol
Sheets("Tableau de bord").Cells(derlig, col).Value = Sheets("Actions en cours").Cells(i, col).Value
Next
End If
Next
dercol = Sheets("Actions en attente").Range("A1").End(xlToRight).Column
For i = 1 To Sheets("Actions en attente").Range("A" & Rows.Count).End(xlUp).Row
If Sheets("Actions en attente").Cells(i, 7).Value = 1 Then
derlig = Sheets("Tableau de bord").Range("A" & Rows.Count).End(xlUp).Row + 1
For col = 1 To dercol
Sheets("Tableau de bord").Cells(derlig, col).Value = Sheets("Actions en attente").Cells(i, col).Value
Next
End If
Next
End Sub
A+ François
Bonjour,
tu as déclaré Tampon 2 et 3 comme integer
Mais tu écris
qui sont des plages de cellules donc à déclarer comme "range" (erreur 13)
tu cherches la valeur 1. d'après ta ligne
"1", c'est 1 en valeur "texte" et de toutes façons, je vois mal l'intér^t de Ucase(....
d'autre part, à partir dy moment où tu déclares
With Sheets("Tableau de bord")
tu n'as pas besoin d'utiliser d'autres with .range...puisque tu es "enfermé" dans la feuille
je n'ai pas regardé le fonctionnement mais tu as fait un bon début ! ;o) notamment en déclarant tes variables et en figeant l'écran; oublier cela dénote un mauvais programmeur...
continue, tu es sur la bonne voie
Pour progresser efficacement:
https://bidou.developpez.com/article/VBA/
tu as déclaré Tampon 2 et 3 comme integer
Mais tu écris
Tampon2 = Sheets(j).Range("C" & i & ":F" & i)
Tampon3 = Sheets(j).Range("H" & i & ":J" & i)
qui sont des plages de cellules donc à déclarer comme "range" (erreur 13)
tu cherches la valeur 1. d'après ta ligne
If UCase(Range("G" & i)) = "1" Then
"1", c'est 1 en valeur "texte" et de toutes façons, je vois mal l'intér^t de Ucase(....
d'autre part, à partir dy moment où tu déclares
With Sheets("Tableau de bord")
tu n'as pas besoin d'utiliser d'autres with .range...puisque tu es "enfermé" dans la feuille
je n'ai pas regardé le fonctionnement mais tu as fait un bon début ! ;o) notamment en déclarant tes variables et en figeant l'écran; oublier cela dénote un mauvais programmeur...
continue, tu es sur la bonne voie
Pour progresser efficacement:
https://bidou.developpez.com/article/VBA/