Bonjour à tous et merci pour votre temps, mon premier message et je suis un débutant total.
J'essaye de filtrer n'importe quel numéro à 12 chiffres dans la colonne B pour les couper plus tard dans une autre feuille nommée PPE.
Comment écrire un code pour faire cela? Dans l'exemple ci-dessous, cela fonctionne parfaitement mais uniquement pour 243080700547.
J'ai également fourni une capture d'écran.
I = Worksheets("RAW DATA").UsedRange.Rows.Count
J = Worksheets("PPE").UsedRange.Rows.Count
If J = 1 Then
If Application.WorksheetFunction.CountA(Worksheets("PPE").UsedRange) = 0 Then J = 0
End If
Set xRg = Worksheets("RAW DATA").Range("C1:C" & I)
On Error Resume Next
Application.ScreenUpdating = False
For K = 1 To xRg.Count
If CStr(xRg(K).Value) = "243080700547" Then
xRg(K).EntireRow.Copy Destination:=Worksheets("PPE").Range("A" & J + 1)
xRg(K).EntireRow.Delete
If CStr(xRg(K).Value) = "243080700547" Then
K = K - 1
End If
J = J + 1
End If
Next
3 Réponses :
Au lieu de votre première apparition de
Si CStr (xRg (K) .Value) = "243080700547" Alors
vous pouvez utiliser
Si Len (CStr (xRg (K) .Value)) = 12 Alors
pour vérifier si la chaîne a une longueur de 12.
Question: Pourquoi le vérifiez-vous une deuxième fois? Vous êtes déjà dans le bloc If de ce même (premier) contrôle.
Merci pour votre réponse, cela fonctionne très bien, je ne sais pas pourquoi cela a été répété, je n'ai pas écrit ce code, je l'ai juste copié à partir du code de quelqu'un d'autre.
Vous utilisez un cast en chaîne via CStr, donc je suppose que les valeurs de la colonne C sont de vrais nombres. Dans ce cas, un simple plus grand que / moins que devrait suffire.
Travaillez de bas en haut et vous pouvez éviter de modifier l'incrément.
with Worksheets("RAW DATA")
I = .cells(.rows.count, "C").end(xlup).row
For K = I To 1 step -1
If .cells(K, "C").value2 > 99999999999 And .cells(K, "C").value2 <= 999999999999 Then
J = J + 1
.rows(K).EntireRow.Copy Destination:=Worksheets("PPE").Range("A" & J)
.rows(K).EntireRow.delete
End If
Next K
end with
Merci beaucoup pour cela, cela a parfaitement fonctionné et j'ai utilisé celui-ci. Le seul changement que j'y ai apporté a été de faire de ... Range ("A" & J) into ... Range ("A" & J + 1)
Comme la première ligne était un en-tête et qu'elle l'écrasait.
Vous pouvez utiliser un filtre au lieu de boucler sur toute la date, ce qui pourrait être beaucoup plus rapide que de copier ligne par ligne, car vous copiez en une seule fois.
Cela fonctionnera également pour tous les autres critères, il vous suffit de ajustez le .AutoFilter.
Option Explicit
Public Sub FilterAndCopy()
Dim DestRow As Long 'find destination row
DestRow = Worksheets("PPE").Cells(Worksheets("PPE").Rows.Count, "A").End(xlUp).Row + 1
With Worksheets("RAW DATA").UsedRange
'filter
.AutoFilter Field:=3, Criteria1:=">=100000000000", Operator:=xlAnd, Criteria2:="<=999999999999"
'copy date (without headers)
.Resize(RowSize:=.Rows.Count - 1).Offset(RowOffset:=1).SpecialCells(xlCellTypeVisible).EntireRow.Copy Destination:=Worksheets("PPE").Cells(DestRow, "A")
'remove filter
.AutoFilter
End With
End Sub