Пользовательская функция Excel не работает на разных листах - PullRequest
0 голосов
/ 01 июля 2018

Я довольно новичок в написании пользовательских функций 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, содержащий формулу и диапазон:

Sheet 1 with formula

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

Sheet 2 (range still in Sheet 1)

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

Sheet 2 referencing formula cell in Sheet 1

Это ожидаемое поведение или результат ошибки? Я использую Office 2016 для Mac под OSX High Sierra 10.13.5, а версия Excel - 15.23.

Я должен добавить, что в более сложной ситуации обращение к пользовательской формуле, полученной на другом листе, стирает результат из самой ячейки формулы. Затем его можно восстановить, удалив эту ячейку и выбрав Отменить.

1 Ответ

0 голосов
/ 01 июля 2018

Проблема в следующем,

If Cells(currow, curcol).Value <> "" Then

Ячейки не имеют родительской ссылки на рабочий лист, поэтому, хотя вы передаете номер строки и номер столбца из ссылки на ячейку на Листе 1, они просто используют эти числа для поиска ячейки на активном листе.

Добавить ссылку на родительский лист rng.

with rng.parent

 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

end with

Обратите внимание, что Cells становится .Cells для перехвата ссылки на родительский лист в блоке With ... End With.

Только с одной ссылкой, которая могла бы легко быть rng.parent.Cells(currow, curcol).Value, но блок С ... Завершить с более детально подходит для расширения вызовов в другие ячейки на рабочем листе rng.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...