VBA - ошибка времени выполнения 9 и использование * для имени переменной листа - PullRequest
0 голосов
/ 20 ноября 2018

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

В рабочей книге, содержащей код, необходимо скопировать данные из рабочей книги «Сегодняшние данные 19 ноября 2018 года», на которую есть ссылка в ячейке B3 в приведенном ниже коде.Дата меняется каждый день, но другие вещи также являются переменными, например, 19 ноября / 18, 19 ноября 2018 года.

Для приведенного ниже кода, если я сопоставлю ячейку B3 с точным названием рабочей книги, кодработает, поэтому не может быть, что sheet1 не существует.Однако я попробовал все нижеприведенные варианты значения ячейки B3, чтобы учесть соглашение об именовании переменных, и все это привело к ошибке времени выполнения

Сегодняшние данные *, Сегодняшние данные *, Сегодняшние данные * .xlsx

Dim WorkbookName As Variant

WorkbookName = Range("B3").Value

Workbooks(WorkbookName).Sheets(1).Range("A1").CurrentRegion.Copy
Workbooks("Stock Cash").Worksheets("STOCK Detail").Range("A1").PasteSpecial 
xlPasteValues

* «Наличные деньги» - это текущая рабочая книга, содержащая этот код

1 Ответ

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

Если рабочая книга уже открыта , и у вас просто возникают проблемы с установкой ссылки на нее, то оператор For Each должен выполнить эту работу.

Выполните цикл по всем открытым рабочим книгам вколлекцию Application.Workbooks, и с помощью оператора Like вы можете найти частичные совпадения и задать нужную рабочую книгу для нового var myWB.

Вероятно, будет хорошей идеей использовать отдельные переменные wb(что уже было сделано с использованием wb и myWB в приведенном ниже примере) только потому, что вы не хотите использовать последний wb в цикле, если совпадение не найдено (то есть вы получите ошибку RT # 91 -что лучше, чем случайное перемещение данных из неверного wb).

Dim wb As Workbook, myWB As Workbook

For Each wb In Application.Workbooks
    If wb.Name Like "*" & Range("B3").Value & "*" Then
        Set myWB = wb
        Exit For
    End If
Next wb

myWB.Sheets(1).Range("A1").CurrentRegion.Copy

Примечание:

Я бы настоятельно рекомендовал , чтобы вы также квалифицировали Range("B3").Value каккак ваша рабочая книга (может быть ThisWorkbook, но не ActiveWorkbook), так и рабочая таблица, особенно если вы работаете с несколькими открытыми рабочими книгами.

Итак, что-то вроде:

If wb.Name Like "*" & ThisWorkbook.Worksheets("..SheetName..").Range("B3").Value & "*" Then
    ...
...