Как читать другую ячейку из UDF? - PullRequest
0 голосов
/ 28 января 2020

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

Public Function ADD(arg1 as Double, arg2 as Double) as Double

    If Worksheets("sheet1").Cells(1,1).Value = 0 Then
        ADD = -1
        Exit Function
    End If

    MsgBox "I got here"

    ADD = arg1 + arg2

End Function

окно сообщения не отображается. Это может быть только оператор if. Когда я удаляю это, это работает. Есть ли способ чтения из другой фиксированной ячейки без сбоя функции? Реальная функция, с которой я работаю, выполняет все чтение из операторов if.

Кроме того, это может быть нашел на сайте MS, но я не понимаю, почему это мешает мне читать ..

Для правильного вычисления все диапазоны, которые используются в вычислении, должны быть переданы функции в качестве аргументов. Если вы не передадите диапазоны вычислений в качестве аргументов, вместо того чтобы ссылаться на диапазоны в коде функции VBA, Excel не сможет учесть их в механизме вычислений. Таким образом, Excel может не рассчитать рабочую книгу должным образом, чтобы убедиться, что все прецеденты вычисляются до вычисления пользовательской функции.

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 29 января 2020

Вы не можете запустить окно сообщения с UDF . Можете ли вы представить, сколько раз вам пришлось бы нажимать «ОК», если бы вы могли, и ваш лист часто пересчитывался?

Вместо этого вы можете использовать оператор debug.print, и вы можете запустить свой UDF из IDE VBA. проверить значения отладки. Например:

Private Function TestMyUDF()
Dim examplevalue1 as Double
Dim examplevalue2 as Double
    MyUDF examplevalue1, examplevalue2
End Function

Не подлежит сомнению, но если ваша ячейка, на которую ссылаются (только для чтения), имеет значение, используйте именованный диапазон (и сделайте его именем книги, а не листа). Давайте назовем его «CheckSumCell» в качестве примера.

Public Function MyUDF(arg1 as Double, arg2 as Double) as Double
    If ThisWorkbook.Names("CheckSumCell").Value = 0 Then '<-- assumes single cell
        MyUDF = -1
        Exit Function
    End If
    MyUDF= arg1 + arg2
End Function

Это тогда лучше переживет перемещение ячейки (вставка строк или столбцов)! Если вы решите использовать другую ячейку, просто измените определение именованного диапазона, и вам вообще не потребуется редактировать макрос / UDF.

0 голосов
/ 28 января 2020

Я изменил имя UDF на ADDD(), и оно отлично работает:

Public Function ADDD(arg1 As Double, arg2 As Double) As Double

    If Worksheets("Sheet1").Cells(1, 1).Value = 0 Then
        ADDD = -1
        Exit Function
    End If

    MsgBox "I got here"

    ADDD = arg1 + arg2

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