Я довольно новичок в написании пользовательских функций Excel, и я столкнулся со странным поведением, которое я не могу найти объясненным при поиске в сети (хотя объем информации, конечно, огромен). Пожалуйста, потерпите меня.
Вот демонстрация, которая показывает, по крайней мере, некоторые из проблем:
Function mycustomfn_demo(rng As Range)
Dim rngrows, rngcols, curcol, currow, i, j,firstcol As Integer
Dim exitflag As Boolean
firstcol = -1
rngrows = rng.Rows.Count
rngcols = rng.Columns.Count
exitflag = False
For i = 1 To rngcols
For j = 1 To rngrows
curcol = rng.Column + i - 1
currow = rng.Row + j - 1
If Cells(currow, curcol).Value <> "" Then
firstcol = i
exitflag = True
Exit For
End If
Next j
If exitflag = True Then
Exit For
End If
Next i
mycustomfn_demo = firstcol
End Function
Эта функция находит первый столбец в диапазоне с непустой ячейкой (отсутствие непустых ячеек в диапазоне дает результат -1) и работает отлично, если диапазон rng
находится на том же листе, что и формула, содержащая функция mycustomfn_demo
. Вот лист 1, содержащий формулу и диапазон:

Однако, если они находятся на разных листах, происходят странные вещи. Это показывает Лист 2 (диапазон по-прежнему на Листе 1):

В этом случае (но не в других) ссылка на ячейку формулы на листе 1 дает правильный результат (опять же, лист 2):

Это ожидаемое поведение или результат ошибки? Я использую Office 2016 для Mac под OSX High Sierra 10.13.5, а версия Excel - 15.23.
Я должен добавить, что в более сложной ситуации обращение к пользовательской формуле, полученной на другом листе, стирает результат из самой ячейки формулы. Затем его можно восстановить, удалив эту ячейку и выбрав Отменить.