Bonjour,
@bboy-eazy : Euh non... justement, on veut se décaler d'une ligne et offset(
nb de ligne, nb de colonne), donc pour lire la valeur d'en-dessous, on fait bien Offset(i, 0) ou Offset(i).
@Walt51 : tu écris :
Sheets("FT").Range("A2").Offset(i).Value = Sheets("Liste de matériels").Range("D2").Offset(i).Value
Tu mets le même offset sur la feuille FT et sur la feuille liste de matériels. Donc forcément, ça copie sur la même ligne...
1. Plutôt que d'utiliser Offset, pourquoi ne travailles-tu pas directement sur les lignes ?
1 2 3 4 5 6 7 8 9 10
| Private Sub Worksheet_Activate()
Application.ScreenUpdating = False
Dim i As Integer
For i = 2 To 51
If Sheets("Liste de matériels").Range("D" & i).Value <> "" Then
Sheets("FT").Range("A" & i).Value = Sheets("Liste de matériels").Range("D" & i).Value
Sheets("FT").Range("B" & i).Value = Sheets("Liste de matériels").Range("B" & i).Value
End If
Next i
End Sub |
Première petite remarque, mais là, tu auras toujours le même problème ...
2. Tu utilises le même indice pour les deux feuilles, or si une cellule est vide en "Liste matériel", elle ne va pas être recopiée en "FT", donc, à ce moment-là, tu dois passer à la prochaine ligne en "Liste matériel", mais pas en "FT". Utilise 2 variables : i l'indice de la boucle For et j une variable que tu incrémentes seulement quand tu fais une copie.
1 2 3 4 5 6 7 8 9 10 11 12 13
| Private Sub Worksheet_Activate()
Application.ScreenUpdating = False
Dim i As Integer
Dim j As Integer
j = 2
For i = 2 To 51
If Sheets("Liste de matériels").Range("D" & i).Value <> "" Then
Sheets("FT").Range("A" & j).Value = Sheets("Liste de matériels").Range("D" & i).Value
Sheets("FT").Range("B" & j).Value = Sheets("Liste de matériels").Range("B" & i).Value
j = j + 1 'j est incrémenté seulement lorsqu'on fait une copie.
End If
Next i
End Sub |
3. Il y a plus efficace qu'une boucle pour faire cela. Tu peux utiliser
AutoFilter et faire un copier-coller. AutoFilter te permet d'imposer une filtre sur tes données (dans ton cas <>""). Ensuite en faisant un copier-coller, tu copies les données issues du filtrage.
1 2 3 4 5 6 7
| Private Sub Worksheet_Activate()
With Sheets("Liste de matériels")
.Range("A2:D50").AutoFilter Field:=4, Criteria1:="<>"
.Range("B2:B50").Copy destination:=Sheets("FT").Range("B2")
.Range("D2:D50").Copy destination:=Sheets("FT").Range("A2")
End With
End Sub |
C'est plus rapide qu'une boucle.
Est-ce que tu comprends la méthode ?
Partager