Как автоматически пронумеровать строки, если соседняя ячейка не пуста, используя VBA Excel?

#excel #vba

Вопрос:

Мне нужно автоматически пронумеровать строки , если соседняя ячейка не пуста, используя VBA.
любой из приведенных ниже кодов отлично работает, за исключением случаев, когда он содержит пустые ячейки.
как всегда, мы очень ценим вашу поддержку.
это ожидаемый результат
введите описание изображения здесь

 Sub Fill_Serial_Numbers_Option1()
  Dim LastRow As Long
  LastRow = Cells(Rows.count, "B").End(xlUp).Row
  If LastRow > 2 Then
     Range("A3:A" amp; Application.Max(2, LastRow)) = Evaluate("ROW(A1:A" amp; LastRow amp; ")")
  End If
End Sub

Sub Fill_Serial_Numbers_Option2()
  Dim LastRow As Long
  LastRow = Cells(Rows.count, "B").End(xlUp).Row
  If LastRow > 2 Then
  With Range("A3:A" amp; LastRow)
    .Cells(1, 1).value = 1
    .DataSeries Rowcol:=xlColumns, Type:=xlLinear, Step:=1, Trend:=False
  End With
  End If
End Sub
 

Ответ №1:

Пожалуйста, протестируйте следующий код:

 Sub testCountNonBlanks()
   Dim sh As Worksheet, lastR As Long, arr, arrA, count As Long, i As Long
   Set sh = ActiveSheet
   lastR = sh.Range("B" amp; sh.rows.count).End(xlUp).row: count = 1
   If lastR <= 2 Then Exit Sub
   arr = sh.Range("B2:B" amp; lastR).value 'place the range in an array for faster iteration
   arrA = sh.Range("A2:A" amp; lastR).value
   For i = 1 To UBound(arr)
        If arr(i, 1) <> "" Then arrA(i, 1) = count: count = count   1
   Next i
   sh.Range("A2").Resize(UBound(arrA), 1).value = arrA
End Sub
 

Если разрешена формула (написанная на VBA), вы можете использовать следующий вариант:

 Sub testCountByFormula()
  Dim sh As Worksheet, lastR As Long, rngB As Range
  
   Set sh = ActiveSheet
   lastR = sh.Range("B" amp; sh.rows.count).End(xlUp).row
   Set rngB = sh.Range("B2:B" amp; lastR)
   sh.Range("A2:A10").Formula = "=IF(B2<>"""",COUNTA(" amp; rngB.Address amp; ")-COUNTA(" amp; rngB.Address(0, 1) amp; ") 1,"""")"
End Sub
 

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

1. первый вариант работает отлично и быстрее, но другой-нет ( он вставляет формулы в ячейки, даже пустые ). Большое спасибо за вашу поддержку @FaneDuru

2. @Waleed78 Рад, что смог помочь! Но пробовали ли вы код формулы в точности таким, как он есть ? Если ответ «да», являются ли значения в B:B результатом формулы? Если да, то что возвращает формула, когда возвращается ее оценка False ?

3. @FaneDuru. Я попробовал второй вариант точно так , как он есть, без вывода формул ( только формулы), а формат ячеек является общим easyupload.io/5ffayj

4. @Waleed78 Это означает только то, что столбец A:A отформатирован как текст … Если вы предварительно отформатируете его как общий, он будет работать. Вручную или в коде… В любом случае, это странно… Это должно увеличить значение B2 во второй части формулы. Наверное, и из-за формата тоже.

5. @Waleed78 Итак, вы не тестировали код как есть … 🙂

Ответ №2:

Для этого вам не нужен макрос. Предполагая, что все, что вас волнует, пустое или нет, вы можете использовать такую формулу в ячейке A9 . =Counta($B$1:$B9) Если у вас есть формулы, вы можете попытаться использовать что-то с помощью COuntif.

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

1. @pgSystemTester. Я знаю формулу, но по некоторым причинам мне не нужны формулы на coulma A .

2. Ну, тогда используйте ответ ФанеДуру. Создание массива-это правильный путь.

Ответ №3:

Вы можете использовать цикл от первого ряда до последнего, что-то вроде этого:

 Sub Fill()
    Dim LastRow As Long
    Dim Count As Integer
    Dim Row As Integer
    
    Count = 0
    Row = 1
    LastRow = Cells(Rows.Count, "B").End(xlUp).Row
    
    
    Do While Row <= LastRow
        If Not (Cells(Row, 2) = "") Then
            Count = Count   1
            Cells(Row, 1) = Count
        End If
        Row = Row   1
        
    Loop

End Sub
 

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

1. ваш код начинает заполнять строки заголовка (A1 и A2 объединены в одну ячейку) , поэтому результат неверен @ Adrian Fischer

2. Я изменил строку=1 на строку=2 и теперь работает нормально.

3. Да, верно. Когда я тестировал его, у меня не было заголовка.