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

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

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

Для приведенного ниже кода, если я сопоставлю ячейку B3 с точным именем книги, код будет работать, поэтому не может быть, что лист1 не существует. Однако я пробовал все приведенные ниже варианты значения ячейки 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

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

Рассматриваемая рабочая тетрадь уже открыта?

K.Dᴀᴠɪs 20.11.2018 05:24

Да это уже открыто

A.J.A 20.11.2018 05:41
Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
1
2
37
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

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

Просмотрите все открытые книги в коллекции Application.Workbooks и с помощью оператора Like можно найти частичные совпадения и установить для нужной книги новую переменную 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
    ...

Я попробовал, и должно быть что-то не так с тем, как я это делаю. Значение в диапазоне B3 - «Ежедневные данные за 19 ноября 2018 года», тогда как книга фактически называется «Ежедневные данные за 19 ноября 2018 года (4)». Почти то же самое. Но когда я перехожу, я вижу, что цикл не находит его, поскольку он устанавливает mywb = Nothing

A.J.A 20.11.2018 06:15

@ A.J.A О, я так понимаю, вы использовали подстановочные знаки в B3, например Today Data *

K.Dᴀᴠɪs 20.11.2018 06:16

Да, даже когда я изменяю значение в Range B3, чтобы оно было точно таким же, как в книге, оно все равно не принимает его.

A.J.A 20.11.2018 06:17

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

K.Dᴀᴠɪs 20.11.2018 06:19

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

A.J.A 20.11.2018 06:21

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