Как мне отфильтровать все 12-значные числа в коде?

#excel #vba

#excel #vba

Вопрос:

Всем привет и спасибо за ваше время, это мой первый пост, и я полный новичок.

Я пытаюсь отфильтровать любое 12-значное число в столбце, B чтобы позже вырезать их на другом листе с именем PPE .

Как мне написать код для этого? В примере ниже это работает отлично, но только для 243080700547 .

Я также предоставил скриншот.

 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" amp; 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" amp; J   1)
        xRg(K).EntireRow.Delete

        If CStr(xRg(K).Value) = "243080700547" Then
            K = K - 1
        End If

        J = J   1
    End If
Next
  

Ответ №1:

Вы используете приведение к строке через CStr, поэтому я предполагаю, что значения в столбце C являются истинными числами. В этом случае должно быть достаточно простого больше / меньше, чем.

Работайте снизу вверх, и вы сможете избежать изменения приращения.

 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" amp; J)
        .rows(K).EntireRow.delete
    End If
  Next K

end with
  

Комментарии:

1. Большое вам спасибо за это, оно отлично сработало, и я использовал это. Единственное изменение, которое я внес в него, заключалось в том, чтобы сделать … Диапазон («A» amp; J) в … Диапазон («A» amp; J 1)

2. Поскольку первая строка была заголовком, и она перезаписывала его.

Ответ №2:

Вместо вашего первого появления

If CStr(xRg(K).Value) = "243080700547" Then

вы можете использовать

If Len(CStr(xRg(K).Value)) = 12 Then

чтобы проверить, имеет ли строка длину 12.

Вопрос: Почему вы проверяете это во второй раз? Вы уже находитесь в If блоке той же (первой) проверки.

Комментарии:

1. Спасибо за ваш ответ, он отлично работает, я не знаю, почему это повторялось, я не писал этот код, просто скопировал его из чужого кода.

Ответ №3:

Вы могли бы использовать фильтр вместо перебора всей даты, что было бы намного быстрее, чем копирование строка за строкой, потому что вы копируете все сразу.

Это сработает и для любых других критериев, вам просто нужно настроить .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