Запишите макрос, выполнив следующие действия.
Выделите диапазон, в котором вы хотите, чтобы формула находилась вставьте формулу в строку формул. это важно - не вставляйте формулу в ячейку Нажмите Ctrl-Enter. Н.Б. если вы просто нажмете Enter, это не сработает
Остановите запись макроса и проверьте код Макроса1 в Модуле1.
Однако я не понимаю, как эта формула когда-либо работала с тем, как вы описали проблему, поэтому сначала убедитесь, что она работает, и будьте осторожны с номерами строк - разве это не должно быть C4
, а не C5
, например
Вы можете использовать следующий код:
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 (поскольку каждая ячейка содержит формулу).=ISBLANK(C4:ALN4)
(IsEmpty(Range("C4:ALN4"))
в VBA) терминах) будет больше 0, если в исходном диапазоне (C5:ALN5
) есть непустые (непустые (в терминах 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
Извините, я отредактировал свой пост, это не D4:ALN4, а C5:ALN5.