Ответ 1
Используйте Листы, а не Лист и последовательно активируйте их:
Sub kl()
Dim wb As Workbook
Dim ws As Worksheet
Set wb = ActiveWorkbook
Set ws = Sheets("Sheet1")
wb.Activate
ws.Select
End Sub
Я знаю, что это может возникнуть как тривиальный вопрос, но я не могу объявить 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
.
Используйте Листы, а не Лист и последовательно активируйте их:
Sub kl()
Dim wb As Workbook
Dim ws As Worksheet
Set wb = ActiveWorkbook
Set ws = Sheets("Sheet1")
wb.Activate
ws.Select
End Sub
Если рабочий лист, который вы хотите получить, существует во время компиляции в ThisWorkbook
(то есть в книге, содержащей код VBA, на который вы смотрите), то самый простой и наиболее надежный способ ссылаться на этот Worksheet
объект должен использовать свое кодовое имя:
Debug.Print Sheet1.Range("A1").Value
Вы можете установить кодовое имя на все, что вам нужно (до тех пор, пока оно является действительным идентификатором VBA), независимо от его "имени вкладки" (которое пользователь может изменить в любое время), изменив свойство (Name)
в Окно свойств (F4):
Свойство 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
.
Третье решение:
Я бы установил 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
Попробуйте изменить имя переменной, поскольку иногда она сталкивается с другими модулями /subs
Dim Workbk As Workbook
Dim Worksh As Worksheet
Но попробуйте
Set ws = wb.Sheets("name")
Я не могу вспомнить, работает ли это с Sheet
У меня была такая же проблема. Я использовал Worksheet
вместо Worksheets
, и он был разрешен. Не уверен, какая разница между ними.
Dim ws as Object
Set ws = Worksheets("name")
при объявлении рабочего листа в качестве рабочего листа вместо ojbect У меня возникли проблемы с работой с OptionButtons (Active X) на этом листе (я думаю, это будет и с любым элементом Active-X. Когда объявлено как объект, все работает нормально.
Много ответов выше! вот мой прием:
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 на что-либо, кроме текущей книги, оно правильно выполнит
к вашему удивлению, вам нужно объявить переменную для рабочей книги и рабочего листа в 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
пожалуйста помоги. У меня есть пользовательские формы в моих двух книгах. сделать передачу данных. но не позволяйте пользовательской форме на пути к месту. книга должна быть открытой или закрытой. как ты будешь благодарен
Частный 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