Проблема с определенным типом в пользовательской форме Excel VBA

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

Private Type Bottom_Rit
    Bot As Integer
    Rit As Integer
    End Type

Dim BxR_1 As Bottom_Rit

Sub Fpage()
    BxR_1 = Lab(a, b)
End Sub

Private Sub Button1_Click()
    Fpage
End Sub

Function Lab(a As Integer, b As Integer) As Bottom_Rit
    Lab.Bot = a
    Lab.Rit = b
End Function

Пытаюсь повторить код из этой темы ссылка на поток stackoverflow

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

Добавьте Private, т.е. Private Function Lab (a As Integer, b As Integer) As Bottom_Rit).

Storax 23.04.2022 09:44

Предоставленный код не компилируется и не отображает указанное сообщение об ошибке. Убедитесь, что вы указали Option Explicit в начале каждого модуля/класса/формы. Dim BxR_1 — это переменная уровня модуля, поэтому ее следует объявлять как Public или Private, а не Dim. В Lab(a,b) переменные a и b не определены. Код работает нормально после реализации этих пунктов. Вам также следует подумать об установке бесплатной и фантастической надстройки Rubberduck для VBA, особенно для проверки кода.

freeflow 23.04.2022 09:55

@Storax, я чувствую себя сбитым с толку, потому что до того, как я опубликовал этот вопрос, я в течение двух дней пробовал много комбинаций с Private и Public, и каждый раз у меня были ошибки. Но сейчас попробовал добавить в функцию статус Private и вроде работает нормально... (ЛицоПалм)

AlienScientist 24.04.2022 07:18

@freeflow, спасибо за ваш ответ, вы были правы, я добавил Button1_Click(), я, наконец, заставил его работать, я последовал совету Storax, и я еще не использовал Option Explicit, я видел много советов по его использованию, но на время вроде и без него нормально работает, спасибо

AlienScientist 24.04.2022 07:26

Справедливо. Опция Explicit обычно используется только теми, кто не хочет, чтобы в их коде возникали странные необъяснимые ошибки.

freeflow 24.04.2022 09:54

@Storax, вы могли бы опубликовать тот же ответ, и я бы отметил его как решение

AlienScientist 24.04.2022 10:40

@freeflow, ладно, мне пришлось прочитать больше информации и признать, что явное использование этой опции может быть полезнее, чем неиспользование.

AlienScientist 26.04.2022 12:09
3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
0
7
63
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Пользовательский тип (UDT)

Если вы определяете UDT внутри класса, у вас есть следующие ограничения.

  • Вы не можете использовать общедоступный UDT в классе, а пользовательская форма — это своего рода класс.
  • Вы не можете использовать UDT в качестве возвращаемого типа в общедоступной функции в классе.
  • Вы не можете использовать UDT в качестве параметра в общедоступной функции в классе.
  • Вы можете использовать UDT в этом классе локально (т. е. использовать ключевое слово Private для его определения)

Код из сообщения используется в пользовательской форме, поэтому OP должен определить UDT как Private, и каждая функция также должна быть закрытой, если UDT используется в подписи функции.

Это означает, что следующий код будет работать

Private Type Bottom_Rit
    Bot As Integer
    Rit As Integer
End Type

Private Function Lab(a As Integer, b As Integer) As Bottom_Rit
    Lab.Bot = a
    Lab.Rit = b
End Function

PS Я также рекомендую использовать Option Explict. Вы можете прочитать об этом в этом сообщение, хотя и не только для VBA, но он также охватывает это.

Fyi ср. Сообщение SO "Только UDT, определенный в..." - Ссылка на помощь Type statement не слишком полезен, заявив: «В модулях класса .. пользовательские типы по умолчанию являются общедоступными. Эту видимость могу можно изменить с помощью ключевого слова Private».

T.M. 24.04.2022 17:12

@Storax, да, и спасибо за ссылку, после прочтения того, что делает опция, я буду использовать ее сейчас, потому что я все равно всегда объявляю переменные ...

AlienScientist 26.04.2022 12:13

Другие вопросы по теме