Вот UDF, который должен работать в большинстве случаев:
Function HAS_REF(r As Range) As Boolean
HAS_REF = (r.Formula <> r.FormulaR1C1)
End Function
Свойства Formula
и FormulaR1C1
диапазона оказываются одинаковыми, если они не содержат ссылку на ячейку.
Исключение: если ячейка содержит ссылку на именованный диапазон, оба будут равны, и ваша ячейка не будет выделена.
Обновить:
Вот версия, которая также проверяет имена диапазонов:
Function HAS_REF(r As Range) As Boolean
Dim i As Long
HAS_REF = (r.Formula <> r.FormulaR1C1)
If HAS_REF Then Exit Function
For i = 1 To ThisWorkbook.Names.Count
If InStr(r.Formula, ThisWorkbook.Names(i).Name) Then
HAS_REF = True
Exit Function
End If
Next i
End Function
Конечно, если вы не используете имена диапазонов в своей рабочей книге, функции, которую я разместил ранее, должно хватить.
Об атрибуте Precedents
:
Я попытался использовать атрибут Precedents
для проверки ссылок. Но это не похоже на работу. Я пробовал следующее:
Непосредственно используя r.Precedents
в UDF, чтобы проверить, есть ли у диапазона прецеденты. Присвоение его переменной диапазона просто присвоило r
(а не r.Precedents
).
Использование вспомогательной подпрограммы для выполнения фактической проверки путем вызова подпрограммы from. Это тоже не сработало. Однако, когда вы закомментируете строку в функции, которая вызывает подпроцедуру, подпрограмма работает и проверяет прецеденты должным образом.
Пробовал использовать глобальные переменные, которые доступны как UDF, так и вспомогательной подпрограмме. Не имеет значения.