Ваш существующий код подразумевает, что вы действительно хотите учитывать пустые ячейки и ячейки, которые содержат пустую строку (или формулу, которая возвращает пустую строку) Примечание 1 .(Учитывая, что вы просто скопировали этот код из другого места, это может быть не так)
Вы можете использовать End(xlDown)
, чтобы найти первую действительно пустую ячейку, или Match
, чтобы найти первую «пустую» ячейку вдиапазон (либо просто пустая строка, либо пустые строки, либо пустые ячейки в разных формах)
Если вы хотите найти первую действительно пустую ячейку, ячейку или , содержащую пустую строку:
Function FindFirstEmptyOrBlankCell(StartingAt As Range) As Range
Dim rng As Range
'Set search range
With StartingAt.Worksheet
Set rng = .Range(StartingAt, .Cells(.Rows.Count, StartingAt.Column).End(xlUp).Offset(1, 0))
End With
' Find first empty or blank cell
Set FindFirstEmptyOrBlankCell = rng.Cells(StartingAt.Worksheet.Evaluate("Match(True, " & rng.Address & "=""""" & ", 0)"), 1)
End Function
Если вы хотите найти первую действительно пустую ячейку и игнорировать ячейки, содержащие пустую строку:
Function FindFirstEmptyCell(StartingAt As Range) As Range
Dim rng As Range
'Set search range
With StartingAt.Worksheet
Set rng = .Range(StartingAt, .Cells(.Rows.Count, StartingAt.Column).End(xlUp).Offset(1, 0))
End With
' Find first empty cell
If IsEmpty(StartingAt.Cells(1, 1)) Then
Set FindFirstEmptyCell = rng.Cells(1, 1)
ElseIf IsEmpty(StartingAt.Cells(2, 1)) Then
Set FindFirstEmptyCell = rng.Cells(2, 1)
Else
Set FindFirstEmptyCell = rng.End(xlDown).Cells(2, 1)
End If
End Function
И для полноты, если вы хотите найти первую ячейку, содержащуюпустая строка и полностью игнорируйте пустые ячейки:
Function FindFirstBlankCell(StartingAt As Range) As Range
Dim rng As Range
Dim idx As Variant
'Set search range
With StartingAt.Worksheet
Set rng = .Range(StartingAt, .Cells(.Rows.Count, StartingAt.Column).End(xlUp).Offset(1, 0))
End With
' Find first blank cell
idx = Application.Match(vbNullString, rng, 0)
If IsError(idx) Then
'There are no Blank cells in the range. Add to end instead
Set FindFirstBlankCell = rng.Cells(rng.Rows.Count, 1)
Else
Set FindFirstBlankCell = rng.Cells(idx, 1)
End If
End Function
Во всех случаях вызывайте так:
Sub Demo()
Dim ws As Worksheet
Dim r As Range
Set ws = ActiveSheet '<~~~ or specify required sheet
Set r = FindFirstEmptyOrBlankCell(ws.Range("F3"))
'or
'Set r = FindFirstEmptyCell(ws.Range("F3"))
'or
'Set r = FindFirstBlankCell(ws.Range("F3"))
' literally what was asked for
'r.Formula = "=F3"
' possibly what was actually wanted
r.Formula = "=" & r.Offset(-1, 0).Address(0, 0)
End Sub
Примечание 1 If IsEmpty(currentRowValue) Or currentRowValue = "" Then
фактически избыточно.Любое значение, которое возвращает TRUE для IsEmpty(currentRowValue)
, будет , а также возвращает TRUE currentRowValue = ""
(обратное не применяется)