Я знаю, что это может возникнуть как тривиальный вопрос, но я не могу объявить 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):
Свойство 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:UsersismailDesktopuretim_takipMAKİNELEREBT_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
Доброго времени суток! Для того, чтобы можно было работать с двумя открытыми книгами, мне необходимо 2-е переменные «Книга1» и «Книга2» (Книга1 — рабочая книга, Книга2 — любая открытая из которой черпаем информацию). Вот начало кода: Подскажите пожалуйста, что нужно написать после равно?! Знаю, что можно так: P.S. Возможно снова неправильно описал свою проблему, поэтому прошу задавать вопросы, буду исправляться. |
|
Hugo Пользователь Сообщений: 23253 |
|
Если я правильно понял, — то так: set Книга1 = ThisWorkbook Сама функция GetAnotherWorkbook http://excelvba.ru/code/GetAnotherWorkbook |
|
Hugo, там все красиво, но там и названия книг известны, у меня же, имя 2-й книги — неизвестно. А мне ее, допустим, потом нужно закрыть макросом, без всяких поисков и т.д., например: |
|
Ещё раз перечитал название темы, и понял, что нифига не понял… Что в вашем понимании «открытая книга из проводника»? http://excelvba.ru/code/GetFileOrFolderPath |
|
KuklP Пользователь Сообщений: 14868 E-mail и реквизиты в профиле. |
Если открытых книг только две, то: Я сам — дурнее всякого примера! … |
EducatedFool, Вы все правильно поняли в своем первом посте. «Какая разница, как и откуда она открыта?» — никакой. «А, может, надо отобразить диалоговое окно выбора файла?» — не нужно Спасибо большое за ответы и примеры! Буду пробовать. |
|
KuklP Пользователь Сообщений: 14868 E-mail и реквизиты в профиле. |
Забыл(с коленки писал) Я сам — дурнее всякого примера! … |
KuklP, спасибо Вам! P.S. можно после «Then» поставить |
|
Я как-то обратил внимание на фразу «любая открытая из которой черпаем информацию» — значит название известно. Это кидать информацию можно в любую, а вот черпать имхо надо знать, откуда ActivateExcel Set excelSheet1 = GetSheet(objExcel, «Example1 Sheet Name») excelSheet1.cells(1,1).value = 10 ‘тест msgbox excelSheet1.cells(1,1).value ‘проверка Private Function ActivateExcel() ‘The GetSheet method returns an Excel Sheet according to the sheetIdentifier |
|
Может я плохо пояснил, но слово «любая» на мой взгляд — неизвестная А за пример спасибо! |
|
Hugo Пользователь Сообщений: 23253 |
Это там выше вчера я был |
Hugo, неизвестно только название книги, вот и все, данные известны |
|
KuklP Пользователь Сообщений: 14868 E-mail и реквизиты в профиле. |
{quote}{login=ТолькоУчусь}{date=15.06.2010 12:29}{thema=}{post}Hugo, неизвестно только название книги, вот и все, данные известны ;){/post}{/quote} Я сам — дурнее всякого примера! … |
Hugo Пользователь Сообщений: 23253 |
ммм, типа такого тогда? Sub tt() Там внутри сделать поиск известных данных по листам этих wb… |
Hugo, есть Книга1 (основаная, где расположен код программы), название ее Пользователи могут менять на какое-угодно, назавем ее так: Книга1 = х. Для внесения данных в «x» нужно открыть другую книгу, Книга2 = y. Название «y» тоже не известно. Вот. Надеюсь так понятнее? |
|
Hugo Пользователь Сообщений: 23253 |
ненамного. |
Hugo, ну если не намного, лучше удалить эту тему, а то совсем опозорился, объяснять не умею Да и в принципе все понял и тему закрыли модераторы, спасибо за помощь! |
|
KuklP Пользователь Сообщений: 14868 E-mail и реквизиты в профиле. |
{quote}{login=ТолькоУчусь}{date=15.06.2010 04:18}{thema=}{post}Hugo, ну если не намного, лучше удалить эту тему, а то совсем опозорился, объяснять не умею Я сам — дурнее всякого примера! … |
Юрий М Модератор Сообщений: 60585 Контакты см. в профиле |
#20 16.06.2010 00:35:41 ТолькоУчусь, зря Вы злитесь — действительно непонятно Ваше объяснение про любую другую книгу, название которой неизвестно. Например, четвёртую в списке, отсортированном по названию. Такое может быть? А вдруг там нет нужных данных? Ведь Вы, пробегая глазами по списку файлов, каким-то образом для себя определяете — ВОТ ЭТУ открыть нужно. Вот Вас и «пытают»… А уж привязать её к переменной — дело техники. |
Адрес другой книги в формуле в виде переменных |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
5 / 5 / 2 Регистрация: 21.07.2013 Сообщений: 362 |
|
1 |
|
Присвоение переменной имени книги и листа17.11.2013, 19:04. Показов 52484. Ответов 34
Есть файл (Расчет.xls). В нем 3 листа(Лист1, Лист2, Лист3). Как при открытии файла присвоить переменной (F) имя файла и имя нужного листа для использования в range(F.cells(….))
0 |
Alex77755 11482 / 3773 / 677 Регистрация: 13.02.2009 Сообщений: 11,145 |
||||
17.11.2013, 19:09 |
2 |
|||
вариантов несколько. Некоторые из них?
0 |
ali_vlad 5 / 5 / 2 Регистрация: 21.07.2013 Сообщений: 362 |
||||
17.11.2013, 19:11 [ТС] |
3 |
|||
вариантов несколько. Некоторые из них?
Мне надо F=Файл(«Расчет»)+Worksheets(«Лист1»)’ так можно?
0 |
Hugo121 6875 / 2807 / 533 Регистрация: 19.10.2012 Сообщений: 8,562 |
||||
17.11.2013, 19:17 |
4 |
|||
Так нельзя.
1 |
ali_vlad 5 / 5 / 2 Регистрация: 21.07.2013 Сообщений: 362 |
||||
17.11.2013, 19:23 [ТС] |
5 |
|||
Так нельзя.
А VBA не перепутает книги, например если открыто 2 файла и в каждом есть свой код на VBA Добавлено через 4 минуты
0 |
Hugo121 6875 / 2807 / 533 Регистрация: 19.10.2012 Сообщений: 8,562 |
||||
17.11.2013, 19:23 |
6 |
|||
Вопрос был «Как при открытии файла присвоить переменной» — так что смотрите сами не перепутайте
1 |
5 / 5 / 2 Регистрация: 21.07.2013 Сообщений: 362 |
|
17.11.2013, 19:59 [ТС] |
7 |
Set wb = Workbooks.Open(filename, False, True) По моему это не совсем то, что я хотел. Я хотел, чтобы при открытии книги переменной присваивалось имя этой же книги: wb=имя_книги.xls Добавлено через 18 минут
0 |
Hugo121 6875 / 2807 / 533 Регистрация: 19.10.2012 Сообщений: 8,562 |
||||
17.11.2013, 20:16 |
8 |
|||
Ещё за час до того, как Вы разобрались, было написано:
0 |
5 / 5 / 2 Регистрация: 21.07.2013 Сообщений: 362 |
|
17.11.2013, 20:22 [ТС] |
9 |
В Вашем примере указывается непосредственно «Лист1». Я же хотел, чтобы VBA сам получал имя файла и имя листа и присваивал это переменной. Set F = Application.ActiveWorkbook.Sheets(1)
0 |
6875 / 2807 / 533 Регистрация: 19.10.2012 Сообщений: 8,562 |
|
17.11.2013, 20:34 |
10 |
В чём принципиальная разница? Лист могут переименовать? Так могут же и передвинуть!
0 |
5 / 5 / 2 Регистрация: 21.07.2013 Сообщений: 362 |
|
17.11.2013, 20:45 [ТС] |
11 |
В чём принципиальная разница? Лист могут переименовать? Так могут же и передвинуть! В таком случае можно ли при загрузке книги запретить переименование и перемещение листов?
0 |
6875 / 2807 / 533 Регистрация: 19.10.2012 Сообщений: 8,562 |
|
17.11.2013, 20:50 |
12 |
При загрузке? Вы им запретите это делать до сохранения!
0 |
5 / 5 / 2 Регистрация: 21.07.2013 Сообщений: 362 |
|
17.11.2013, 21:02 [ТС] |
13 |
При загрузке? Вы им запретите это делать до сохранения! В моей книге идет «онлайн» расчет, При работе на 1м листе идет выборка данных со 2-го и наоборот. Если в процессе работы переименовать или переместить листы, то это вызовет «kernel panic» . Вот бы запретить переименование и перемещение сразу после открытия. Как бы «защита от дурака». А как они называются — это не важно. Да и еще как запретить открывать другие книги при открытой этой?
0 |
6875 / 2807 / 533 Регистрация: 19.10.2012 Сообщений: 8,562 |
|
17.11.2013, 21:11 |
14 |
Линейкой по пальцам. Думаю самое простое и надёжное P.S. Вообще правильно написанному макросу другие книги не помеха.
0 |
5 / 5 / 2 Регистрация: 21.07.2013 Сообщений: 362 |
|
17.11.2013, 21:19 [ТС] |
15 |
Сразу это Workbook_Open()
0 |
6875 / 2807 / 533 Регистрация: 19.10.2012 Сообщений: 8,562 |
|
17.11.2013, 21:22 |
16 |
Ну просто старайтесь нигде не использовать selection и activate — и уже будет намного надёжнее. И быстрее.
0 |
5 / 5 / 2 Регистрация: 21.07.2013 Сообщений: 362 |
|
17.11.2013, 21:25 [ТС] |
17 |
Как это правильно оформить
0 |
Hugo121 6875 / 2807 / 533 Регистрация: 19.10.2012 Сообщений: 8,562 |
||||
17.11.2013, 21:29 |
18 |
|||
Хотя и Ваш вариант рабочий, но я обычно пишу Not.
0 |
ali_vlad 5 / 5 / 2 Регистрация: 21.07.2013 Сообщений: 362 |
||||
17.11.2013, 21:38 [ТС] |
19 |
|||
Хотя и Ваш вариант рабочий, но я обычно пишу Not. Так на что заменить (ячейка_в_которую_вводится_значение)
0 |
Hugo121 6875 / 2807 / 533 Регистрация: 19.10.2012 Сообщений: 8,562 |
||||
17.11.2013, 21:43 |
20 |
|||
Я например так сделал:
Хотя конечно сомнительно, что тут нужна переменная, но бывает что и нужна…
0 |
Глобальная переменная в проекте VBA Excel. Объявление глобальной переменной в модуле проекта VBA и обращение к ней из других модулей того же проекта.
Объявление глобальной переменной
Глобальная переменная — это переменная, которая объявлена в одном из модулей проекта VBA и доступна для использования во всех остальных модулях.
Чтобы переменная стала глобальной, она должна быть объявлена в начале модуля перед первой процедурой (раздел Declarations) с помощью оператора Public. Этот способ работает во всех модулях проекта VBA Excel.
Допускается объявление глобальной переменной с помощью оператора Global, но такой способ считается устаревшим и на сайте разработчиков уже не упоминается. Объявить глобальную переменную с оператором Global можно только в стандартном модуле.
Пример объявления глобальных переменных в любом модуле проекта VBA:
Public myGlobVar1 ‘по умолчанию — As Variant Public myGlobVar2 As String Public myGlobVar3 As Double |
Объявление глобальных переменных
Обращение к глобальной переменной
Примеры обращения к глобальной переменной, объявленной в разных типах модулей проекта VBA Excel. Актуально для обращения из модуля любого типа данного проекта.
Переменная в стандартном модуле
Если глобальная переменная (myGlobVar) объявлена в стандартном модуле (Module1) с уникальным именем, не повторяющимся в других модулях, к ней можно обращаться из других модулей по одному имени (в примере — из модуля формы):
Private Sub CommandButton1_Click() myGlobVar = «Глобальная переменная» TextBox1.Text = myGlobVar End Sub |
Стандартное обращение с указанием имени модуля (Module1), в котором объявлена глобальная переменная (myGlobVar):
Private Sub CommandButton1_Click() Module1.myGlobVar = «Глобальная переменная» TextBox1.Text = Module1.myGlobVar End Sub |
Переменная в модуле книги
Глобальная переменная (myGlobVar), объявленная в модуле книги, доступна при обращении к ней из других модулей с помощью следующего кода VBA Excel:
Sub Primer1() ThisWorkbook.myGlobVar = «Глобальная переменная» MsgBox ThisWorkbook.myGlobVar End Sub |
Переменная в модуле листа
Обращение к глобальной переменной (myGlobVar), объявленной в модуле рабочего листа (Лист1), из других модулей по имени листа (в проводнике проекта находится без скобок слева от имени ярлыка):
Sub Primer2() Лист1.myGlobVar = «Глобальная переменная» MsgBox Лист1.myGlobVar End Sub |
По имени ярлыка (в проводнике проекта находится в полукруглых скобках справа от имени листа):
Sub Primer3() Worksheets(«Лист1»).myGlobVar = «Глобальная переменная» MsgBox Worksheets(«Лист1»).myGlobVar End Sub |
Переменная в модуле формы
Глобальная переменная (myGlobVar), объявленная в модуле формы (UserForm1), доступна при обращении к ней из других модулей с помощью следующего кода VBA Excel:
Sub Primer4() UserForm1.myGlobVar = «Глобальная переменная» MsgBox UserForm1.myGlobVar End Sub |
Переменная в личной книге макросов
Обращение к глобальной переменной (myGlobVar), объявленной в модуле ЭтаКнига
проекта VBAProject (PERSONAL.XLSB)
из модуля проекта VBA обычной книги Excel:
Sub Primer5() Workbooks(«PERSONAL.XLSB»).myGlobVar = «Глобальная переменная» MsgBox Workbooks(«PERSONAL.XLSB»).myGlobVar End Sub |
Мне не удалось получить доступ из проекта VBA текущей книги Excel к глобальной переменной, объявленной в стандартном модуле личной книги макросов.