При выполнении функции VBA из текущей книги в формуле ячейки выдается ошибка #name (#nom для французской версии) - PullRequest
0 голосов
/ 27 января 2019

Я сталкиваюсь с проблемой, которая, вероятно, очень проста, когда я использую функцию VBA в формуле ячейки, я получаю содержимое ячейки "#NAME" (функция not found?), В то время как макрос, использующий функцию (для теста), являетсявыполняется нормально (отображает желаемое содержимое для ячейки, возвращаемое значение функцией, которая извлекает имя файла из полного пути).

контекст:

Я имел кПрошлое (более 12 лет назад) разработано, может быть, 50 000 инструкций VBA с использованием office2003. Сегодня мне нужно снова разработать некоторые макросы с Office365. Поэтому с тех пор я многое забыл, и некоторые функции могут измениться, что может статьобман (мне нужно перечитать мой старый софт, чтобы вспомнить все мои знания, но у меня пока нет к нему доступа)

Проблема

  • Я получаю ошибку «#name», когда использую функцию, созданную в VBA, связанную с текущей книгой. Никаких объяснений, никакой помощи, я пытался найти что-то в течение нескольких часов, и яничего не найдено
    • Я также разработал для тестирования (см. Код) "sub", который вызывает функцию, и его выполнение прошло успешно, но ...
    • Я не могу запустить функцию из формулылюбая ячейка.
    • Я проверил параметры безопасности макроса и временно разблокировал выполнение, а также объявил локальный каталог как надежную область.

Примечание: этот код детализирован в качестве примера

Код

Public Function FNameOf(CellPointed As Range)

Dim CurCell As Range
Dim Text1 As String
Dim Text2 As String

    Set CurCell = CellPointed

    Text1 = CurCell.Value
    Text2 = Mid$(Text1, InStrRev(Text1, "\") + 1, Len(Text1))

    FNameOf = Text2
End Function

Sub DispFileName2()
Dim style, disp, titre
Dim Cursel As Range
    'Cursel = ActiveCell

    disp = FNameOf(ActiveCell)
    style = vbOKOnly
    titre = "Nom du fichier extrait du texte (fullpath) de la cellule courante"

    MsgBox disp, style, titre

End Sub

Если я отправлю макрос DispFileName2, если получу сообщение с файломимя, извлеченное из пути, являющегося содержимым текущей ячейки

Если я задаю формулу ячейки:

=FNameOf(AnotherCell) 'which contains a fullpath to a file

Я всегда получаю ошибку "#NOM" (во французской версии) или, я так думаю, «#NAME» (в англоязычной версии), как если бы имя функции (ref) было неизвестно из рабочей книги (код не достигнут, для первой инструкции установлен останов)

В чем может быть причина?

Ответы [ 2 ]

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

Я только что получил решение, читая более подробно предыдущие отредактированные темы в нескольких вкладках.Это объясняется в примечании: thread 12351339

Текст:

Объекты Microsoft Excel, такие как «Sheet1» или «ThisWorkbook», являются классами.Я не верю, что вы можете получить доступ к функциям, которые вы помещаете в эти классы через ячейку.Вы можете получить к ним доступ в VBA, например, ThisWorkbook.Square2 (), но рекомендуется помещать все UDF в качестве стандартного модуля, а не модуля рабочего листа.- Eddie Sep 28 '17 в 13: 49

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

Я создал модуль, и функция сразу же запустилась.

С уважением

Доверчиво

Примечание: я никогда не встречалсяэта проблема видимости раньше, потому что события, в которых с самого начала касались пользовательских классов и модулей VBA, объединяющих несколько рабочих книг Excel и Word и почтовый менеджер activeX и т. д. *

Я сохраняю тему из-за объяснений,код и ключевые слова могут быть проще найти решение для кого-либо еще.

0 голосов
/ 27 января 2019

Пожалуйста, поместите вашу пользовательскую функцию где-нибудь в модуле (ни в "ThisWorkbook", ни в коде отдельной таблицы, например, "Feuil1").
Вы должны добавить объявление результата As Stringтакже.
Я понял, что пример только для справки, но вы можете сократить его:

Public Function FNameOf(CellPointed As Range) As String
    FNameOf = Mid(CellPointed.Value, InStrRev(CellPointed.Value, "\") + 1)
End Function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...