Каждый первый j-цикл начинается с сравнения строки с самим собой, поскольку вы начинаете с j = i
. Разница между значением и самим всегда равна нулю. (Он также сравнивает строку 2 с самим собой как последний шаг.)
Однако, если вы переключитесь:
For i = lrow To 2 Step -1
For j = i To 2 Step -1
на:
For i = lrow To 3 Step -1
For j = i - 1 To 2 Step -1`
код будет сравнивать все различные строки без самовыравнивания.
Еще одна точка (которую @Proger_Cbsk ответ вспомнил), заключается в том, что сравнение с просто вычитание .Cells(i, "B").Value - .Cells(j, "B").Value < 100
иногда приводит к неожиданным результатам.
Например, предположим .Cells(i, "B").Value = 1
и .Cells(j, "B").Value = 250
. Мы можем сказать, просто глядя, что существует разница не менее 100, поэтому вы ожидаете, что эта часть выражения будет оцениваться как False. Однако из прямой подстановки вы получаете выражение: 1 - 250 < 100
. Начиная с 1 - 250 = -249
, и с -249 < 100
выражение действительно оценило бы True.
Однако, если вы должны были изменить .Cells(i, "B").Value - .Cells(j, "B").Value < 100
на Abs(.Cells(i, "B").Value - .Cells(j, "B").Value) < 100
, выражение теперь будет смотреть, разница больше или меньше 100, вместо того, чтобы смотреть, если результат вычитания больше или меньше 100.
Измените If Cells(i, "A").Value <> "" Then
на If Sheets("TABLES").Cells(i, "a").Value <> "" Then
~ Надеюсь, это сработает. Он не распознает объект в первой строке.
Option Explicit
Sub Error5()
Dim i As Long
Dim k As Long
Dim c As Variant
With Sheets("Tables")
For i = 4 To 23
If .Cells(i, "A").Value <> "" Then
k = .Cells(i, "A").Value
c = Application.Match(k, Sheets("Sheet2") _
.Range("B11:B50000"), 0)
If IsError(c) Then
Else
.Hyperlinks.Add _
Anchor:=.Cells(i, "A"), _
Address:="", _
SubAddress:="Sheet2!F" & c, _
TextToDisplay:=CStr(k)
End If
End If
Next
End With
End Sub