Экземпляр объекта VBA Excel ByRef никогда не работает

Я использую VBA в течение многих лет, но за все это время мне никогда не удавалось сдать книгу или лист ByRef, мне пришлось использовать имена строк и установить объекты в партнерской подфункции или функции … так что, наконец, пришло время помочь!

Sub SubOne() Dim wb as workbook Dim filepath as string filepath = "//somepath/somebook.xlsx" Set wb = application.workbooks.open(filepath) Call SubTwo(wb) End Sub Sub SubTwo(ByRef wb as workbook) debug.print wb.name End Sub 

Может ли кто-нибудь понять, почему это приведет к ошибке компиляции типа ByRef? Что мне не хватает?

Большое спасибо

    Вы можете избежать подобных проблем, не используя Call слово Call . Вместо Call SubTwo(wb) используйте SubTwo wb

    Дополнительная информация: Должен ли я использовать ключевое слово Call в VB / VBA?

    Ваш исходный код работал для меня, но, возможно, были небольшие различия в пробеле или круглых скобках, которые вызвали эту проблему. VBA использует круглые скобки не только для передачи аргументов для подмножеств / функций, но и для оценки данных.

    Еще один момент, который следует упомянуть, заключается в том, что ByVal и ByRef должны работать для того, что вы пытаетесь сделать, поскольку объекты всегда передаются по ссылке в VBA. ByVal / ByRef определяет только, если сама ссылка передается по значению или ссылке: https://msdn.microsoft.com/en-us/library/ddck1z30.aspx

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

    Предыдущий ответ:

    Я предполагаю, что один из ваших загруженных AddIns использует модуль, класс, Modumule, Enum и т. Д. С именем workbook, и это вызывает ошибку компиляции.

    Если вы посмотрите на свой код, вы также увидите, что книга написана в нижнем регистре. Обычно редактор VBA автоматически отредактировал бы это в Workbook если какое-либо другое имя типа не вмешивается.

    Чтобы избежать этого, замените workbook на Excel.Workbook и повторите попытку.

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

     Sub SubOne() Dim wb as Excel.Workbook Dim filepath as string filepath = "//somepath/somebook.xlsx" Set wb = application.workbooks.open(filepath) Call SubTwo(wb) End Sub Sub SubTwo(ByRef wb as Excel.Workbook) debug.print wb.name End Sub 

    Это работает для меня:

     Sub SubOne() Dim wb as workbook Set wb = This.ActiveWorkbook Call SubTwo(wb) End Sub Sub SubTwo(ByRef wb As Workbook) Debug.Print(wb.Name) End Sub 

    Я была такая же проблема. После многих попыток и сбоев я добавил параметр Явный сверху. Когда я выполнил код, он показал мне, что объявление переменной Worksheet имеет несоответствие имени с переданной переменной. То есть, shtFSheet был объявлен и strFSheet . Меняя это, я решил проблему. Надеюсь, это поможет кому-то.

    Давайте будем гением компьютера.