Почему Excel повторно выполняет функции в одной и той же книге, когда я создаю новую пользовательскую функцию и назначаю ее ячейке? - PullRequest
0 голосов
/ 23 ноября 2018

У меня открыто две рабочие книги.В книге AI есть некоторые UDF, назначенные ячейкам, а в книге BI есть некоторые UDF, назначенные ячейкам.Они уже выполнены, поэтому ячейки имеют значения.В книге B (т. Е. В VBE) я создаю новый UDF, называю его bar:

Function bar()
    bar = "bar"
End Function

Когда я затем вхожу в Excel и назначаю bar () ячейке в книге B (с =bar())), а затем нажмите Enter, срабатывают пользовательские функции в одной и той же рабочей книге и в другой открытой рабочей книге (рабочая книга A).Они выполняются повторно, несмотря на то, что они уже были выполнены и ячейки заполнены значениями.

Почему это?Это странное и очень раздражающее поведение даже в моих крошечных практических пособиях.Что если бы у меня было 100 UDF в рабочей книге?Как только я добавлю новый UDF и назначу его ячейке, все UDF сработают.

Я использую Excel 2016. Заранее спасибо.

1 Ответ

0 голосов
/ 23 ноября 2018

Итак, ваша проблема в том, что вы помещаете InputBox() функции в вашу UDF.Хотя вы, безусловно, можете это сделать, это по существу сводит на нет цель использования UDF для начала.

Подумайте о том, чтобы поместить в UDF аргумент, который извлекает данные из рабочего листа, а не каждый раз запрашивать ввод данных пользователем.происходит повторный вызов.Или создайте глобальную переменную, которая будет оставаться активной, пока рабочая таблица открыта.

Использование аргументов UDF

Если у вас была UDF, которая выглядела так:

Public Function myUDF()
    Dim myInput As String
    myInput = InputBox("Type Something")
    myUDF = myInput & "!"
End Function

Выможно добавить аргумент, который будет вытягивать ваш myInput из таблицы вместо:

Public Function myUDF(myInput As String) As String
    myUDF = myInput & "!"
End Function

, который на вашем листе будет выглядеть следующим образом:

=myUDF(A1)  'Where A1 is your new `myInput` argument

Использование глобальных переменных

Вы также можете использовать глобальную переменную, которая будет получать ваш ввод только тогда, когда вы захотите ее изменить.Возможно, вы можете создать командную кнопку, которую вы будете нажимать, чтобы запросить ввод, или, если вам потребуется только один раз - вы можете использовать событие Workbook_Open() для установки этой переменной - или их комбинацию.

Итак, в верхней части стандартного модуля вы можете добавить свою глобальную переменную:

Public glbVarStr As String

И тогда вы просто запустите любую Sub, чтобы установить глобальную переменную:

' Since this is a WORKBOOK event, you would need to place this sub in
' your workbook's code module
Private Sub Workbook_Open()
    glbVarStr = Inputbox("Type Something")
End Sub

, который вы затем добавите в свой UDF:

Public Function myUDF() As String
    myUDF = glbVarStr & "!"
End Function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...