Автоматическая нумерация VBA

Я ищу код vba, который может автоматически заполнять число в «C4:ALN4», когда «C5:ALN5» заполняется текстом или значением. До этого я использовал формулу =IF(C5<>"",COUNTA($C$5:C5),""). Можно ли преобразовать формулу в код VBA и как?

как всегда, ваша поддержка очень ценна.

С уважением,

Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
0
0
70
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Запишите макрос, выполнив следующие действия.

Выделите диапазон, в котором вы хотите, чтобы формула находилась вставьте формулу в строку формул. это важно - не вставляйте формулу в ячейку Нажмите Ctrl-Enter. Н.Б. если вы просто нажмете Enter, это не сработает

Остановите запись макроса и проверьте код Макроса1 в Модуле1.

Однако я не понимаю, как эта формула когда-либо работала с тем, как вы описали проблему, поэтому сначала убедитесь, что она работает, и будьте осторожны с номерами строк - разве это не должно быть C4, а не C5, например

Извините, я отредактировал свой пост, это не D4:ALN4, а C5:ALN5.

Caya 19.07.2024 12:55

Вы можете использовать следующий код:

With ActiveSheet.Range("C4:ALN4")
    .Formula = "=IF(C5<>"""",COUNTA($C$5:C5),"""")"
End With

Ваша формула применяется к указанному вами диапазону.

Ответ принят как подходящий

У вас есть несколько вариантов.

Вы можете просто записать формулу в ячейки, используя VBA:

Range("C4:ALN4").Formula = "=IF(C5<>"""",COUNTA($C$5:C5),"""")"

Если вы хотите, чтобы формулы были удалены впоследствии, вы можете:

With Range("C4:ALN4")
    .Formula = "=IF(C5<>"""",COUNTA($C$5:C5),"""")"
    .Value = .Value
End With

Или, если вам не нравятся формулы и вы, возможно, хотите сделать что-то еще в рамках процесса, вы можете воссоздать эффект с помощью кода:

Dim cnt As Long, cel As Range
For Each cel In Range("C4:ALN4")
    If cel.Offset(1) = "" Then
        cel.Value = ""
    Else
        cnt = cnt + 1
        cel.Value = cnt
    End If
Next

Формулы можно использовать в VBA с помощью Application.WorksheetFunction., однако обычно проще использовать VBA напрямую. Например, оператор IF будет более утомительным, вместо него просто используйте vba if. Оператор COUNTA может быть записан как Application.WorksheetFunction.CountA(Range("...")) Значение в диапазоне зависит от того, как вы планируете вызывать функцию vba: с помощью кнопки или Worksheet.Change-события, вручную и т. д.

Предполагая, что данные в строке 5 являются константами, а не результатами формул, вы можете использовать следующее решение без циклов:

Sub FillWithSeries()
    Range("C5:ALN5").Find("*", Range("ALN5")).Offset(-1).Value = 1
    Range("C5:ALN5").SpecialCells(xlCellTypeConstants) _
        .Offset(-1).DataSeries , xlDataSeriesLinear
End Sub

Заполнить счетчик, если он не пуст

  • Если ячейка содержит значение ошибки, ваша формула отображает то же значение ошибки (зеленые ячейки) вместо счетчика, но продолжается правильно COUNTA-ing (розовая ячейка). То же самое касается ячеек, содержащих «Ничто» (отображается «Ничто», зеленая ячейка). Кроме того, все полученные ячейки не будут пустыми (пустыми (в терминах VBA)) т. е. =ISBLANK(C4:ALN4) (IsEmpty(Range("C4:ALN4")) в терминах VBA) вернет 0 (поскольку каждая ячейка содержит формулу).

  • Я мог бы имитировать это точное поведение (я имею в виду минус формулу), но вместо этого решил показывать счетчик, когда ячейка содержит значение ошибки, и оставлять пустые ячейки пустыми (пустые ячейки пустыми (в терминах Excel)) т. е. =ISBLANK(C4:ALN4) (IsEmpty(Range("C4:ALN4")) в VBA) терминах) будет больше 0, если в исходном диапазоне (C5:ALN5) есть непустые (непустые (в терминах Excel)) ячейки.
  • На скриншоте...
    • красные ячейки пусты (пусто (в терминах Excel),
    • синяя ячейка (L5) не пуста, она содержит Ничего (в терминах Excel)); в данном конкретном случае он содержит формулу = "" и, кстати, также считается по COUNTA.

Sub PopulateCountIfNotEmpty()
    
    Const SRC_SINGLE_ROW_RANGE_ADDRESS As String = "C5:ALN5"
    Const DST_ROW As Long = 4
    
    Dim ws As Worksheet: Set ws = ActiveSheet ' improve!
    
    Dim Data() As Variant, c As Long, Count As Long
    
    With ws.Range(SRC_SINGLE_ROW_RANGE_ADDRESS)
        Data = .Value ' assumes more than one cell
        For c = 1 To .Columns.Count
            If Not IsEmpty(Data(1, c)) Then
                Count = Count + 1
                Data(1, c) = Count
            End If
        Next c
        .EntireColumn.Rows(DST_ROW).Value = Data
    End With

End Sub

Другие вопросы по теме