Объявление переменной рабочей книги/Рабочего листа vba

Я знаю, что это может возникнуть как тривиальный вопрос, но я не могу объявить workbook или worksheet как переменную в VBA. У меня есть следующий код, но я не могу понять, что я делаю неправильно, это должно быть прямо. Обычно у меня нет проблем с объявлением переменных, таких как Dim i As Integer и т.д.

sub kl() 

    Dim wb As Workbook
    Dim ws As Worksheet

    Set wb = ActiveWorkbook
    Set ws = Sheet("name")

    wb.ws.Select

End Sub

Когда я запускаю вышеуказанный код, я получаю ошибку type missmatch.

Ответ 1

Используйте Листы, а не Лист и последовательно активируйте их:

Sub kl()
    Dim wb As Workbook
    Dim ws As Worksheet
    Set wb = ActiveWorkbook
    Set ws = Sheets("Sheet1")
    wb.Activate
    ws.Select
End Sub

Ответ 2

Если рабочий лист, который вы хотите получить, существует во время компиляции в ThisWorkbook (то есть в книге, содержащей код VBA, на который вы смотрите), то самый простой и наиболее надежный способ ссылаться на этот Worksheet объект должен использовать свое кодовое имя:

Debug.Print Sheet1.Range("A1").Value

Вы можете установить кодовое имя на все, что вам нужно (до тех пор, пока оно является действительным идентификатором VBA), независимо от его "имени вкладки" (которое пользователь может изменить в любое время), изменив свойство (Name) в Окно свойств (F4):

Sheet1 properties

Свойство Name ссылается на "имя вкладки", которое пользователь может изменить по прихоти; свойство (Name) относится к кодовому имени рабочего листа, и пользователь не может его изменить, не обращаясь к редактору Visual Basic.

VBA использует это кодовое имя для автоматического объявления объектной переменной global-scope Worksheet, которую ваш код будет использовать в любом месте, чтобы ссылаться на этот лист, бесплатно.

Другими словами, если лист существует в ThisWorkbook во время компиляции, нет необходимости объявлять для него переменную - переменная уже существует!


Если рабочий лист создается во время выполнения (внутри ThisWorkbook или нет), вам необходимо объявить и назначить для него переменную Worksheet.

Используйте свойство Worksheets объекта Workbook для его получения:

Dim wb As Workbook
Set wb = Application.Workbooks.Open(path)

Dim ws As Worksheet
Set ws = wb.Worksheets(nameOrIndex)

Важные примечания...

  • И имя и индекс рабочего листа могут быть легко изменены пользователем (случайно или нет), , если структура рабочей книги не защищена. Если рабочая книга не защищена, вы просто не можете предположить, что только имя или индекс предоставит вам конкретный рабочий лист, который вам нужен, - всегда полезно проверить формат листа (например, проверить, что ячейка A1 содержит определенный текст, или что там таблица с определенным именем, которая содержит некоторые заголовки столбцов).

  • Использование коллекции Sheets содержит объекты Worksheet, но также может содержать экземпляры Chart и полдюжины более старых типов листов, которые не являются листами. Присвоение ссылки Worksheet из любого Sheets(nameOrIndex) возвращает, рискует выбросить ошибку времени несовпадения типа по этой причине.

  • Не квалифицировать коллекцию Worksheets - это неявная ссылка ActiveWorkbook, то есть коллекция Worksheets вытягивается из любой рабочей книги, которая активна в момент выполнения команды. Такие неявные ссылки делают код слабым и подверженным ошибкам, особенно если пользователь может перемещаться и взаимодействовать с пользовательским интерфейсом Excel во время работы кода.

  • Если вы не хотите активировать определенный лист, вам не нужно вызывать ws.Activate, чтобы сделать 99% того, что вы хотите сделать с листом. Просто используйте вместо этого переменную ws.

Ответ 3

Третье решение: Я бы установил ws на лист книги wb, так как использование Sheet("name") всегда относится к активной книге, которая может измениться по мере развития вашего кода.

sub kl() 

    Dim wb As Workbook
    Dim ws As Worksheet

    Set wb = ActiveWorkbook
    'be aware as this might produce an error, if Shet "name" does not exist
    Set ws = wb.Sheets("name")
    ' if wb is other than the active workbook
    wb.activate
    ws.Select

End Sub

Ответ 4

Попробуйте изменить имя переменной, поскольку иногда она сталкивается с другими модулями /subs

 Dim Workbk As Workbook
 Dim Worksh As Worksheet

Но попробуйте

 Set ws = wb.Sheets("name")

Я не могу вспомнить, работает ли это с Sheet

Ответ 5

У меня была такая же проблема. Я использовал Worksheet вместо Worksheets, и он был разрешен. Не уверен, какая разница между ними.

Ответ 6

Dim ws as Object

Set ws = Worksheets("name")

при объявлении рабочего листа в качестве рабочего листа вместо ojbect У меня возникли проблемы с работой с OptionButtons (Active X) на этом листе (я думаю, это будет и с любым элементом Active-X. Когда объявлено как объект, все работает нормально.

Ответ 7

Много ответов выше! вот мой прием:

Sub kl()

    Dim wb As Workbook
    Dim ws As Worksheet

    Set ws = Sheets("name")
    Set wb = ThisWorkbook

With ws
    .Select
End With

End Sub

ваша первая (возможно, случайная) ошибка, так как мы все упомянули "Лист"... должны быть "Листы"

Этот блок полезен, потому что если вы установите значение wb на что-либо, кроме текущей книги, оно правильно выполнит

Ответ 8

к вашему удивлению, вам нужно объявить переменную для рабочей книги и рабочего листа в Excel 2007 или более поздней версии. Просто добавьте однострочное выражение.

Sub kl()

    Set ws = ThisWorkbook.Sheets("name")
    ws.select
End Sub

Удалите все остальное и наслаждайтесь. Но зачем выбирать лист? выбор листов теперь старомодный для расчета и манипуляции. Просто добавьте формулу, подобную этой

Sub kl()

    Set ws = ThisWorkbook.Sheets("name")
    ws.range("cell reference").formula = "your formula"
'OR in case you are using copy paste formula, just use 'insert or formula method instead of ActiveSheet.paste e.g.:
   ws.range("your cell").formula
'or
   ws.colums("your col: one col e.g. "A:A").insert
'if you need to clear the previous value, just add the following above insert line
   ws.columns("your column").delete

End Sub

Ответ 9

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

Частный Sub CommandButton6_Click()

Dim listesatiripersonel As Variant Dim ebtpersonelsonsatir As String

listesatiripersonel = ListBox1.ListIndex + 1

Dim x As Рабочая тетрадь 'Bu kitap Dim y As Рабочая тетрадь' Veri aktarma yapacağım kitap

Set x = Workbooks ("PERSONEL KAYIT.xlsm") Set y = Workbooks.Open (Имя файла: = ("C:\Users\ismail\Desktop\uretim_takip\MAKİNELER\EBT_100.xlsm"))

x.Sheets("PERSONEL_KAYIT"). Диапазон ("A" & listesatiripersonel, "N" & listesatiripersonel). Выберите Selection.Copy

ebtpersonelsonsatir = Workbooks ("EBT_100.xlsm"). Sheets ("ebtpersonel"). Range ("A565536"). End (xlUp).Row y.Sheets("EBTPERSONEL"). Range ("A" & ebtpersonelsonsatir). Выберите Selection.PasteSpecial

y.Save y.Close

Application.WindowState = xlMaximized End Sub