wb
явно хочет быть String
, представляющим название рабочей книги. Объявите это так.
Dim wbName As String
wbName = ComboBox1.List(ComboBox1.ListIndex)
Примечание, имя ваши элементы управления. AvailableFilesBox
говорит гораздо больше, чем ComboBox1
.
Теперь вам нужно передать эту переменную в качестве аргумента; не используйте глобальную переменную , если вы абсолютно НЕ ДОЛЖНЫ.
Call GenerateReportUserForm
Не уверен, что это должно делать, но он не вызывает newMacro
. Если вы хотите, чтобы он вызывал newMacro
, то измените его на:
NewMacro wbName
Или если вы действительно хотите сохранить это избыточное и отвлекающее ключевое слово Call
:
Call NewMacro(wbName)
Примечание: дайте этому макросу осмысленное имя, которое описывает, что делает макрос. «новый макрос» может быть понятен сейчас , но не так много раз, когда в этом проекте есть 4-5 новых макросов - и newMacro2
НЕ вариант!
Теперь по порядку чтобы передать wbName
в качестве аргумента, процедуре необходимо объявить, что она принимает параметр - например, так:
Public Sub NewMacro(ByVal wbName As String)
Внутри этой области действия процедуры вам не нужно постоянно разыменовывать объект Workbook
, Сделайте это один раз , сохраните ссылку на объект в локальной переменной, затем используйте эту переменную:
Dim wb As Workbook
Set wb = Workbooks(wbName)
Оказывается, этот макрос на самом деле не заботится об имени книги; что он на самом деле хочет, так это Workbook
объект. Итак, давайте возьмем на себя ответственность вызывающего абонента за предоставление Workbook
.
Сначала мы изменим подпись, чтобы принять параметр Workbook
:
Public Sub NewMacro(ByVal wb As Workbook)
Затем мы изменим код формы на поставьте его:
Dim wb As Workbook
Set wb = Workbooks(ComboBox1.List(ComboBox1.ListIndex))
NewMacro wb ' or: Call NewMacro(wb)
Не забудьте всегда ставить Option Explicit
вверху каждого модуля; Rubberduck может помочь вам найти и исправить это, а также другие проблемы в вашем коде.