Обращение к рабочим листам Excel из кода VBA. Переименование листов, скрытие и отображение с помощью кода VBA Excel. Свойства Worksheets.Name и Worksheets.Visible.
Обращение к рабочим листам
Рабочий лист (Worksheet) принадлежит коллекции всех рабочих листов (Worksheets) книги Excel. Обратиться к листу можно как к элементу коллекции и, напрямую, по его уникальному имени.
Откройте редактор VBA и обратите внимание на вашу книгу в проводнике, где уникальные имена листов указаны без скобок, а в скобках — имена листов, отображаемые на ярлычках в открытой книге Excel. Уникальные имена листов отсортированы по алфавиту и их расположение по порядку не будет соответствовать их индексам (номерам), если листы перемещались по отношению друг к другу. Индексы листов смотрите по порядку расположения ярлычков в открытой книге. Переместили листы — изменились их индексы.
Обращение к рабочему листу в коде VBA Excel:
‘По уникальному имени УникИмяЛиста ‘По индексу Worksheets(N) ‘По имени листа на ярлычке Worksheets(«Имя листа») |
- УникИмяЛиста — уникальное имя листа, отображаемое в проводнике редактора VBA без скобок, с помощью кода VBA изменить его невозможно.
- N — индекс листа от 1 до количества всех листов в книге, соответствует порядковому номеру ярлычка этого листа в открытой книге Excel.
- Имя листа — имя листа, отображаемое в проводнике редактора VBA в скобках, с помощью кода VBA изменить его можно.
Количество листов в рабочей книге Excel определяется так:
‘В активной книге Worksheets.Count ‘В любой открытой книге, ‘например, в «Книга1.xlsm» Workbooks(«Книга1.xlsm»).Worksheets.Count |
Переименование листов
В VBA Excel есть некоторые особенности в наименовании листов, так как у рабочего листа есть два свойства, связанных с именем: (Name) и Name. Откройте окно «Properties» в редакторе VBA, нажав клавишу «F4», и выделите любой лист в проводнике. Вы увидите, что в окне «Properties» свойству (Name) в скобках соответствует в проводнике уникальное имя листа без скобок, а свойству Name без скобок соответствует изменяемое имя листа в скобках. Оба имени в окне «Properties» можно редактировать.
С помощью кода VBA Excel можно редактировать только имя листа Name, отображаемое на ярлычке листа и в проводнике без скобок. Для этого используется свойство рабочего листа Worksheets.Name со следующим синтаксисом:
expression.Name
где expression — переменная, представляющая собой объект Worksheet. Смена имени осуществляется путем присвоения нового значения свойству Worksheets.Name.
Допустим, у нас есть лист с уникальным именем (Name) — Лист1, индексом — 1 и именем Name — МойЛист, которое необходимо заменить на имя — Реестр.
Лист1.Name = «Реестр» Worksheets(1).Name = «Реестр» Worksheets(«МойЛист»).Name = «Реестр» |
Скрытие и отображение листов
Для скрытия и отображения рабочих листов в VBA Excel используется свойство Worksheet.Visible со следующим синтаксисом:
expression.Visible
где expression — переменная, представляющая собой объект Worksheet. Свойству Worksheet.Visible могут присваиваться следующие значения:
- False — лист становится невидимым, но он будет присутствовать в списке скрытых листов, и пользователь сможет его отобразить с помощью инструментов рабочей книги Excel.
- xlVeryHidden — лист становится супер невидимым и его не будет в списке скрытых листов, пользователь не сможет его отобразить. Актуально для Excel 2003-2016.
- True — лист становится видимым.
Аналоги присваиваемых значений:
- False = xlHidden = xlSheetHidden = 1
- xlVeryHidden = xlSheetVeryHidden = 2
- True = xlSheetVisible = -1 (константа xlVisible вызывает ошибку)
Примеры:
Лист1.Visible = xlSheetHidden Лист2.Visible = —1 Worksheets(Worksheets.Count).Visible = xlVeryHidden Worksheets(«МойЛист»).Visible = True |
Как создать, скопировать, переместить или удалить рабочий лист с помощью кода VBA Excel, смотрите в этой статье.
Содержание
- VBA в Excel Объект Excel.Worksheet и программная работа с листами Excel средствами VBA
- 10.5 Коллекция Sheets и объект Worksheet, их свойства и методы
- Доступ к листам excel по vba
- Вариант 1
- Sheets(1).Cells(1,1)
- Вариант 2
- Sheets(«First»).Cells(1,1)
- Вариант 3
- Public Const wsFirst = «First»
- Sheets(wsFirst).Cells(1,1)
- Вариант 4
- Лист1.Cells(1,1) или [Лист1].Cells(1,1)
- Вариант 5
- Public wsData As Worksheet
- Set wsData = Лист1
- wsData.Cells(1,1)
- Вариант 6
- ActiveSheet.Cells(1,1)
- Вариант 7
- VBA Excel. Рабочий лист (обращение, переименование, скрытие)
- Обращение к рабочим листам
- Переименование листов
- Скрытие и отображение листов
VBA в Excel Объект Excel.Worksheet и программная работа с листами Excel средствами VBA
10.5 Коллекция Sheets и объект Worksheet, их свойства и методы
Объект Excel.Worksheet, программное создание, обнаружение, удаление листа Excel средствами VBA, свойства, методы и события объекта Excel.Worksheet
В Word ниже объекта Application и Document начинались уже объекты непосредственно для работы с текстом — Selection, Range и т.п. В Excel между объектом рабочей книги и ячейками есть еще один промежуточный объект — объект Worksheet (лист). Объекты Worksheet в книге объединены в коллекцию Sheets.
Чаще всего для ввода данных в Excel (напрямую или из базы данных) нам потребуется в первую очередь определиться с листом, на который пойдет ввод данных — либо просто выбрать его, либо вначале создать, а потом выбрать.
Процесс создания выглядит очень просто:
Dim oExcel As New Excel.Application ‘Запускаем Excel
oExcel.Visible = True ‘Делаем его видимым
Dim oWbk As Excel.Workbook
Set oWbk = oExcel.Workbooks.Add () ‘Создаем новую книгу
Dim oSheet As Excel.Worksheet
Set oSheet = oWbk.Worksheets.Add() ‘ Создаем новый лист
oSheet.Name = «Новый лист» ‘Присваиваем ему имя «Новый лист»
Метод Add() для коллекции Worksheets принимает несколько необязательных параметров, главная задача которых — определить, между какими существующими листами будет вставлен новый лист. Если ничего не указывать, то новый лист будет помещен самым первым.
Часто встречается и другая задача — просто найти нужный лист среди листов книги, например, если мы открыли существующую книгу. Сделать это очень просто, поскольку коллекция Worksheets умеет работать с именами листов. Ниже приведен пример, в котором мы так же запускаем Excel и создаем новую книгу, но при этом находим лист с именем «Лист1» и переименовываем его в «Новый лист»:
Dim oExcel As New Excel.Application ‘Запускаем Excel
oExcel.Visible = True ‘Делаем его видимым
Dim oWbk As Excel.Workbook
Set oWbk = oExcel.Workbooks.Add() ‘Создаем новую книгу
Dim oSheet As Excel.Worksheet
Set oSheet = oWbk.Worksheets.Item(«Лист 1») ‘ Находим Лист1
oSheet.Name = «Новый лист» ‘Присваиваем ему имя «Новый лист»
Обратите внимание, что в английской версии Excel этот код, скорее всего, не пройдет, поскольку листы там по умолчанию называются «Sheet1», «Sheet2» и т.п. Если вы в вашем коде используете имена листов по умолчанию и при этом вашей программе придется работать на компьютерах с разноязычными версиями Excel, обязательно предусмотрите дополнительные проверки или просто используйте номера листов вместо их имен.
У коллекции Sheets, помимо привычных нам свойств и методов ( Count, Item, Add(), Delete()) и свойств и методов, которые удобнее применять для объекта Worksheet ( Visible(), Copy(), Move(), PrintOut(), PrintPreview(), Select()) — поскольку все равно указывать конкретный лист — есть и один специфический метод FillAcrossSheets() — скопировать объект диапазона Range (варианты: полностью, только содержимое, только оформление) во все листы данной книги.
У объекта Worksheet — множество важных свойств и методов:
- Cells — одно из наиболее часто используемых свойств объекта Worksheet. Работает точно так же, как и рассмотренное выше одноименное свойство объекта Application — за исключением того, что вам больше не нужно ограничиваться только активным листом. Аналогично работают свойства Columns и Rows.
- EnableCalculation — возможность отключить автоматический пересчет значений ячеек в книге.
- EnableSelection — возможность запретить выделять на листе: все, ничего не запрещать, или разрешить выделять только незаблокированные ячейки.
- Next — возможность получить ссылку на следующий лист в книге. Previous — то же самое для предыдущего листа.
- PageSetup — как и в Word, возможность получить объект PageSetup, при помощи которого можно настроить те же параметры, что и через меню Файл ->Параметры страницы.
- свойство Protection позволяет получить объект Protection, при помощи которого можно запретить пользователю вносить изменения в лист Excel. Настройке параметров защиты также служат и другие свойства, названия которых начинаются на Protection.
- QueryTables — исключительно важное свойство. Оно возвращает коллекцию QueryTables — набор объектов QueryTable, которые, в свою очередь, представляют данные, полученные из внешних источников (как правило, из баз данных).
- Range — самое важное свойство объекта Worksheet. Возвращает объект Range (диапазон ячеек), который в объектной модели Excel занимает примерно такое же место, что и одноименный объект в объектной модели Word. Этот объект будет рассматриваться ниже.
- Type — возможность определить тип данного листа. Обычно используются два типа: xlWorksheet (обычный лист) и xlChart (диаграмма).
- UsedRange — возвращает объект Range, представляющий собой прямоугольную область, включающую все непустые ячейки. Удобно для целей копирования или форматирования.
- Visible — возможность спрятать лист с глаз пользователя (например, если он используется для служебных целей).
Некоторые важные методы объекта Worksheet:
- методы Activate() , Calculate(), Copy(), Paste(), Delete(), Move(), Evaluate(), Select(), SaveAs(), PrintOut(), PrintPreview(), Protect(), Unprotect()нам уже знакомы . Отличие заключается только в том, что теперь эти методы могут применяться для выбранного вами листа.
- метод PivotTables() возвращает коллекцию очень интересных объектов PivotTable (сводная таблица), которые будут рассматриваться ниже;
- метод Scenarios() возвращает коллекцию Scenarios, состоящую из объектов Scenario (сценарии). Сценарии — это именованные наборы вводных данных, которые можно использовать для проверки различных сценариев (разные суммы продаж, уровни налогов, расходов и т.п.)
- SetBackgroundPicture() — возможность назначить листу фоновое изображение (естественно, желательно, чтобы оно было полупрозрачное — «водяной знак», иначе на его фоне будет трудно читать текст в ячейках).
- ShowAllData() — показать все скрытые и отфильтрованные данные на листе.
Самое важное событие объекта Worksheet — это, конечно, Change. Существует множество практических задач, когда изменение пользователем значения ячейки должно приводить к изменению значения в ячейке другого листа/рабочей книги Excel или даже в базе данных. Другая ситуация, в которой используется это события — сложная проверка вводимого пользователем значения (например, опять-таки через обращение к базе данных). Эта событийная процедура работает со специальным параметром Target — то есть объектом Range, представляющим изменившуюся ячейку. При помощи свойств и методов объекта Range вы можете получить информацию об изменившемся значении, столбце и строке, в котором произошло изменение и т.п.
У объекта Worksheet есть еще два очень удобных события (их сильно не хватает объекту Document в Word). Это — события BeforeRightClick() и BeforeDoubleClick(). Как понятно из названия, первое событие позволяет перехватывать щелчок правой кнопкой мыши по любому месту в листе, а второе — двойной щелчок мышью. При помощи этих событий вы можете назначить свою реакцию (открытие контекстных меню, выдачу предупреждающих сообщений, переход в другой режим работы и т.п.) на действия пользователя.
Источник
Доступ к листам excel по vba
Поговорим про то, как в VBA обращаться к листам книги Excel.
Вариант 1
У глобального объекта Excel Application есть 2 коллекции листов: Sheets и Worksheets . Отличаются они тем, что вторая коллекция не включает в себя специальные листы макросов, которые поддерживала Excel 4.0 (на минуточку — 1992 год) во времена, когда VBA ещё не было в природе (появился в Excel 5.0). Тяжело найти эстетов, которые всё ещё пользуются такими листами с макросами, поэтому можно считать, что эти коллекции идентичны. Лично я использую коллекцию Sheets просто потому, что 5 букв лучше, чем 9.
Sheets(1).Cells(1,1)
Sheets(1) — это не первый лист, созданный в книге, а лист, который на панели ярлыков листов занимает КРАЙНЕЕ ЛЕВОЕ положение. То есть Sheets(2) будет указывать на второй слева лист на панели ярлыков. Если вам нужен конкретный лист, то ТАК ссылаться на него, как вы понимаете, плохая идея, ибо пользователь, изменив порядок следования листов, нарушит работоспособность вашей программы.
Во всех примерах я буду обращаться к ячейки A1, так как речь не о свойствах объекта Worksheet , а о том, какие есть способы получить синтаксическую конструкцию, указывающую на нужный нам лист.
Вариант 2
Sheets(«First»).Cells(1,1)
Пожалуй, такое обращение к листу наиболее популярно в народе. В скобках и кавычках мы видим пользовательское имя листа. Плохо только то, что имя листа, что называется «hard coded» (жёстко запрограммировано), что является моветоном в программировании. Ибо, если у вас в модуле конструкция Sheets(«First») встречается 100 раз, то при смене имени листа придётся делать поиск с заменой 100 констант в коде. Поэтому обычно делают иначе.
Вариант 3
Гораздо разумней добавить ещё один уровень абстракции и объявить константу, ссылающуюся на имя листа.
Public Const wsFirst = «First»
Sheets(wsFirst).Cells(1,1)
В случае смены имени вам придётся исправить ТОЛЬКО эту константу в начале модуля. Однако, если программа написана и сдана пользователю, а тот в один прекрасный момент берёт и переименовывает лист, то наш код тут же перестаёт работать, что, согласитесь, не слишком хорошо.
Вариант 4
У листа есть свойство Name , которое мы видим на ярлыке листа и которое можем менять (если не включена защита структуры книги, но сейчас не об этом), но ещё есть свойство CodeName , которое присваивается листу в момент создания, и которое пользователь сменить не может. В русской редакции офиса эти CodeName -ы формируются по принципу: Лист1 , Лист2 , Лист3 и т.д. В англоязычной версии это: Sheet1 , Sheet2 , Sheet3 , etc.
Если вы удалите лист, то его CodeName повторно не будет использовано. Так вот — VBA разпознаёт имена совпадающие с CodeName листа, как объекты типа Worksheet .
Лист1.Cells(1,1) или [Лист1].Cells(1,1)
Это отличная защита от того, что пользователь перенесёт или переименует лист. Но подобные имена ни о чём не говорят нам в процессе программирования в плане того, что располагается на листе, поэтому вы будете частенько ошибаться, путая листы. А те, кто будут потом разбираться в вашем коде, тоже спасибо вам не скажут. Поэтому я предлагаю следующую модификацию этого способа:
Вариант 5
Public wsData As Worksheet
Set wsData = Лист1
wsData.Cells(1,1)
Строку 1 размещаем в объявлениях модуля. Строку 2 размещаем в обработчике события Workbook_Open . И после этого в любом месте книги мы можем использовать объявленные переменные ( wsData , строка 3). На мой взгляд, это самый удобный и продвинутый вариант из рассмотренных.
Вариант 6
Не забываем про свойство ActiveSheet объекта Application , указывающее на активный лист книги. Если вы работаете с текущим листом, то использовать его, я считаю, оптимально.
ActiveSheet.Cells(1,1)
Вариант 7
Ну и последнее, если вам передан в подпрограмму объект типа Range, то не забываем, что ссылку на лист возвращает его свойство Worksheet .
Это всё, что я имел сказать по поводу ссылок на листы в Excel VBA 🙂
Источник
VBA Excel. Рабочий лист (обращение, переименование, скрытие)
Обращение к рабочим листам Excel из кода VBA. Переименование листов, скрытие и отображение с помощью кода VBA Excel. Свойства Worksheets.Name и Worksheets.Visible.
Обращение к рабочим листам
Рабочий лист (Worksheet) принадлежит коллекции всех рабочих листов (Worksheets) книги Excel. Обратиться к листу можно как к элементу коллекции и, напрямую, по его уникальному имени.
Откройте редактор VBA и обратите внимание на вашу книгу в проводнике, где уникальные имена листов указаны без скобок, а в скобках — имена листов, отображаемые на ярлычках в открытой книге Excel. Уникальные имена листов отсортированы по алфавиту и их расположение по порядку не будет соответствовать их индексам (номерам), если листы перемещались по отношению друг к другу. Индексы листов смотрите по порядку расположения ярлычков в открытой книге. Переместили листы — изменились их индексы.
Обращение к рабочему листу в коде VBA Excel:
- УникИмяЛиста — уникальное имя листа, отображаемое в проводнике редактора VBA без скобок, с помощью кода VBA изменить его невозможно.
- N — индекс листа от 1 до количества всех листов в книге, соответствует порядковому номеру ярлычка этого листа в открытой книге Excel.
- Имя листа — имя листа, отображаемое в проводнике редактора VBA в скобках, с помощью кода VBA изменить его можно.
Количество листов в рабочей книге Excel определяется так:
Переименование листов
В VBA Excel есть некоторые особенности в наименовании листов, так как у рабочего листа есть два свойства, связанных с именем: (Name) и Name. Откройте окно «Properties» в редакторе VBA, нажав клавишу «F4», и выделите любой лист в проводнике. Вы увидите, что в окне «Properties» свойству (Name) в скобках соответствует в проводнике уникальное имя листа без скобок, а свойству Name без скобок соответствует изменяемое имя листа в скобках. Оба имени в окне «Properties» можно редактировать.
С помощью кода VBA Excel можно редактировать только имя листа Name, отображаемое на ярлычке листа и в проводнике без скобок. Для этого используется свойство рабочего листа Worksheets.Name со следующим синтаксисом:
expression.Name
где expression — переменная, представляющая собой объект Worksheet. Смена имени осуществляется путем присвоения нового значения свойству Worksheets.Name.
Допустим, у нас есть лист с уникальным именем (Name) — Лист1, индексом — 1 и именем Name — МойЛист, которое необходимо заменить на имя — Реестр.
Скрытие и отображение листов
Для скрытия и отображения рабочих листов в VBA Excel используется свойство Worksheet.Visible со следующим синтаксисом:
expression.Visible
где expression — переменная, представляющая собой объект Worksheet. Свойству Worksheet.Visible могут присваиваться следующие значения:
- False — лист становится невидимым, но он будет присутствовать в списке скрытых листов, и пользователь сможет его отобразить с помощью инструментов рабочей книги Excel.
- xlVeryHidden — лист становится супер невидимым и его не будет в списке скрытых листов, пользователь не сможет его отобразить. Актуально для Excel 2003-2016.
- True — лист становится видимым.
Аналоги присваиваемых значений:
- False = xlHidden = xlSheetHidden = 1
- xlVeryHidden = xlSheetVeryHidden = 2
- True = xlSheetVisible = -1 (константа xlVisible вызывает ошибку)
Источник
На чтение 16 мин. Просмотров 14.8k.
Malcolm Gladwell
Мечтатель начинает с чистого листа бумаги и переосмысливает мир
Эта статья содержит полное руководство по использованию Excel
VBA Worksheet в Excel VBA. Если вы хотите узнать, как что-то сделать быстро, ознакомьтесь с кратким руководством к рабочему листу VBA ниже.
Если вы новичок в VBA, то эта статья — отличное место для начала. Мне нравится разбивать вещи на простые термины и объяснять их на простом языке.
Вы можете прочитать статью от начала до конца, так как она написана в логическом порядке. Или, если предпочитаете, вы можете использовать оглавление ниже и перейти непосредственно к теме по вашему выбору.
Содержание
- Краткое руководство к рабочему листу VBA
- Вступление
- Доступ к рабочему листу
- Использование индекса для доступа к рабочему листу
- Использование кодового имени рабочего листа
- Активный лист
- Объявление объекта листа
- Доступ к рабочему листу в двух словах
- Добавить рабочий лист
- Удалить рабочий лист
- Цикл по рабочим листам
- Использование коллекции листов
- Заключение
Краткое руководство к рабочему листу VBA
В следующей таблице приведен краткий обзор различных методов
Worksheet .
Примечание. Я использую Worksheet в таблице ниже, не указывая рабочую книгу, т.е. Worksheets, а не ThisWorkbook.Worksheets, wk.Worksheets и т.д. Это сделано для того, чтобы примеры были понятными и удобными для чтения. Вы должны всегда указывать рабочую книгу при использовании Worksheets . В противном случае активная рабочая книга будет использоваться по умолчанию.
Задача | Исполнение |
Доступ к рабочему листу по имени |
Worksheets(«Лист1») |
Доступ к рабочему листу по позиции слева |
Worksheets(2) Worksheets(4) |
Получите доступ к самому левому рабочему листу |
Worksheets(1) |
Получите доступ к самому правому листу |
Worksheets(Worksheets.Count) |
Доступ с использованием кодового имени листа (только текущая книга) |
Смотри раздел статьи Использование кодового имени |
Доступ по кодовому имени рабочего листа (другая рабочая книга) |
Смотри раздел статьи Использование кодового имени |
Доступ к активному листу | ActiveSheet |
Объявить переменную листа | Dim sh As Worksheet |
Назначить переменную листа | Set sh = Worksheets(«Лист1») |
Добавить лист | Worksheets.Add |
Добавить рабочий лист и назначить переменную |
Worksheets.Add Before:= Worksheets(1) |
Добавить лист в первую позицию (слева) |
Set sh =Worksheets.Add |
Добавить лист в последнюю позицию (справа) |
Worksheets.Add after:=Worksheets(Worksheets.Count) |
Добавить несколько листов | Worksheets.Add Count:=3 |
Активировать рабочий лист | sh.Activate |
Копировать лист | sh.Copy |
Копировать после листа | sh1.Copy After:=Sh2 |
Скопировать перед листом | sh1.Copy Before:=Sh2 |
Удалить рабочий лист | sh.Delete |
Удалить рабочий лист без предупреждения |
Application.DisplayAlerts = False sh.Delete Application.DisplayAlerts = True |
Изменить имя листа | sh.Name = «Data» |
Показать/скрыть лист | sh.Visible = xlSheetHidden sh.Visible = xlSheetVisible sh.Name = «Data» |
Перебрать все листы (For) | Dim i As Long For i = 1 To Worksheets.Count Debug.Print Worksheets(i).Name Next i |
Перебрать все листы (For Each) | Dim sh As Worksheet For Each sh In Worksheets Debug.Print sh.Name Next |
Вступление
Три наиболее важных элемента VBA — это Рабочая книга, Рабочий лист и Ячейки. Из всего кода, который вы пишете, 90% будут включать один или все из них.
Наиболее распространенное использование Worksheet в VBA для доступа к его ячейкам. Вы можете использовать его для защиты, скрытия, добавления, перемещения или копирования листа.
Тем не менее, вы будете в основном использовать его для выполнения некоторых действий с одной или несколькими ячейками на листе.
Использование Worksheets более простое, чем использование рабочих книг. С книгами вам может потребоваться открыть их, найти, в какой папке они находятся, проверить, используются ли они, и так далее. С рабочим листом он либо существует в рабочей книге, либо его нет.
Доступ к рабочему листу
В VBA каждая рабочая книга имеет коллекцию рабочих листов. В этой коллекции есть запись для каждого рабочего листа. Эта коллекция называется просто Worksheets и используется очень похоже на коллекцию Workbooks. Чтобы получить доступ к рабочему листу, достаточно указать имя.
Приведенный ниже код записывает «Привет Мир» в ячейках A1 на листах: Лист1, Лист2 и Лист3 текущей рабочей книги.
Sub ZapisVYacheiku1() ' Запись в ячейку А1 в листе 1, листе 2 и листе 3 ThisWorkbook.Worksheets("Лист1").Range("A1") = "Привет Мир" ThisWorkbook.Worksheets("Лист2").Range("A1") = "Привет Мир" ThisWorkbook.Worksheets("Лист3").Range("A1") = "Привет Мир" End Sub
Коллекция Worksheets всегда принадлежит книге. Если мы не
указываем рабочую книгу, то активная рабочая книга используется по умолчанию.
Sub ZapisVYacheiku1() ' Worksheets относятся к рабочим листам в активной рабочей книге. Worksheets("Лист1").Range("A1") = "Привет Мир" Worksheets("Лист2").Range("A1") = "Привет Мир" Worksheets("Лист3").Range("A1") = "Привет Мир" End Sub
Скрыть рабочий лист
В следующих примерах показано, как скрыть и показать лист.
ThisWorkbook.Worksheets("Лист1").Visible = xlSheetHidden ThisWorkbook.Worksheets("Лист1").Visible = xlSheetVisible
Если вы хотите запретить пользователю доступ к рабочему
листу, вы можете сделать его «очень скрытым». Это означает, что это может быть
сделано видимым только кодом.
' Скрыть от доступа пользователя ThisWorkbook.Worksheets("Лист1").Visible = xlVeryHidden ' Это единственный способ сделать лист xlVeryHidden видимым ThisWorkbook.Worksheets("Лист1").Visible = xlSheetVisible
Защитить рабочий лист
Другой пример использования Worksheet — когда вы хотите защитить его.
ThisWorkbook.Worksheets("Лист1").Protect Password:="Мойпароль" ThisWorkbook.Worksheets("Лист1").Unprotect Password:="Мойпароль"
Индекс вне диапазона
При использовании Worksheets вы можете получить сообщение об
ошибке:
Run-time Error 9 Subscript out of Range
Это означает, что вы пытались получить доступ к рабочему листу, который не существует. Это может произойти по следующим причинам:
- Имя Worksheet , присвоенное рабочим листам, написано неправильно.
- Название листа изменилось.
- Рабочий лист был удален.
- Индекс был большим, например Вы использовали рабочие листы (5), но есть только четыре рабочих листа
- Используется неправильная рабочая книга, например Workbooks(«book1.xlsx»).Worksheets(«Лист1») вместо
Workbooks(«book3.xlsx»).Worksheets («Лист1»).
Если у вас остались проблемы, используйте один из циклов из раздела «Циклы по рабочим листам», чтобы напечатать имена всех рабочих листов коллекции.
Использование индекса для доступа к рабочему листу
До сих пор мы использовали имя листа для доступа к листу.
Указатель относится к положению вкладки листа в рабочей книге. Поскольку
положение может быть легко изменено пользователем, не рекомендуется
использовать это.
В следующем коде показаны примеры использования индекса.
' Использование этого кода является плохой идеей, так как ' позиции листа все время меняются Sub IspIndList() With ThisWorkbook ' Самый левый лист Debug.Print .Worksheets(1).Name ' Третий лист слева Debug.Print .Worksheets(3).Name ' Самый правый лист Debug.Print .Worksheets(.Worksheets.Count).Name End With End Sub
В приведенном выше примере я использовал Debug.Print для печати в Immediate Window. Для просмотра этого окна выберите «Вид» -> «Immediate Window » (Ctrl + G).
Использование кодового имени рабочего листа
Лучший способ получить доступ к рабочему листу —
использовать кодовое имя. Каждый лист имеет имя листа и кодовое имя. Имя листа
— это имя, которое отображается на вкладке листа в Excel.
Изменение имени листа не приводит к изменению кодового имени, что означает, что ссылка на лист по кодовому имени — отличная идея.
Если вы посмотрите в окне свойств VBE, вы увидите оба имени.
На рисунке вы можете видеть, что кодовое имя — это имя вне скобок, а имя листа
— в скобках.
Вы можете изменить как имя листа, так и кодовое имя в окне
свойств листа (см. Изображение ниже).
Если ваш код ссылается на кодовое имя, то пользователь может
изменить имя листа, и это не повлияет на ваш код. В приведенном ниже примере мы
ссылаемся на рабочий лист напрямую, используя кодовое имя.
Sub IspKodImya2() ' Используя кодовое имя листа Debug.Print CodeName.Name CodeName.Range("A1") = 45 CodeName.Visible = True End Sub
Это делает код легким для чтения и безопасным от изменения
пользователем имени листа.
Кодовое имя в других книгах
Есть один недостаток использования кодового имени. Он относится только к рабочим листам в рабочей книге, которая содержит код, т.е. ThisWorkbook.
Однако мы можем использовать простую функцию, чтобы найти
кодовое имя листа в другой книге.
Sub ИспЛист() Dim sh As Worksheet ' Получить рабочий лист под кодовым именем Set sh = SheetFromCodeName("CodeName", ThisWorkbook) ' Используйте рабочий лист Debug.Print sh.Name End Sub ' Эта функция получает объект листа из кодового имени Public Function SheetFromCodeName(Name As String, bk As Workbook) As Worksheet Dim sh As Worksheet For Each sh In bk.Worksheets If sh.CodeName = Name Then Set SheetFromCodeName = sh Exit For End If Next sh End Function
Использование приведенного выше кода означает, что если
пользователь изменит имя рабочего листа, то на ваш код это не повлияет.
Существует другой способ получения имени листа внешней
рабочей книги с использованием кодового имени. Вы можете использовать элемент
VBProject этой Рабочей книги.
Вы можете увидеть, как это сделать, в примере ниже. Я включил это, как дополнительную информацию, я бы рекомендовал использовать метод из предыдущего примера, а не этот.
Public Function SheetFromCodeName2(codeName As String _ , bk As Workbook) As Worksheet ' Получить имя листа из CodeName, используя VBProject Dim sheetName As String sheetName = bk.VBProject.VBComponents(codeName).Properties("Name") ' Используйте имя листа, чтобы получить объект листа Set SheetFromCodeName2 = bk.Worksheets(sheetName) End Function
Резюме кодового имени
Ниже приведено краткое описание использования кодового имени:
- Кодовое имя рабочего листа может быть
использовано непосредственно в коде, например. Sheet1.Range - Кодовое имя будет по-прежнему работать, если имя
рабочего листа будет изменено. - Кодовое имя может использоваться только для
листов в той же книге, что и код. - Везде, где вы видите ThisWorkbook.Worksheets
(«имя листа»), вы можете заменить его кодовым именем рабочего листа. - Вы можете использовать функцию SheetFromCodeName
сверху, чтобы получить кодовое имя рабочих листов в других рабочих книгах.
Активный лист
Объект ActiveSheet ссылается на рабочий лист, который в данный момент активен. Вы должны использовать ActiveSheet только в том случае, если у вас есть особая необходимость ссылаться на активный лист.
В противном случае вы должны указать рабочий лист, который
вы используете.
Если вы используете метод листа, такой как Range, и не
упоминаете лист, он по умолчанию будет использовать активный лист.
' Написать в ячейку A1 в активном листе ActiveSheet.Range("A1") = 99 ' Активный лист используется по умолчанию, если лист не используется Range("A1") = 99
Объявление объекта листа
Объявление объекта листа полезно для того, чтобы сделать ваш
код более понятным и легким для чтения.
В следующем примере показан код для обновления диапазонов
ячеек. Первый Sub не объявляет объект листа. Вторая подпрограмма объявляет
объект листа, и поэтому код намного понятнее.
Sub NeObyavObektList() Debug.Print ThisWorkbook.Worksheets("Лист1").Name ThisWorkbook.Worksheets("Лист1").Range("A1") = 6 ThisWorkbook.Worksheets("Лист1").Range("B2:B9").Font.Italic = True ThisWorkbook.Worksheets("Лист1").Range("B2:B9").Interior.Color = rgbRed End Sub
Sub ObyavObektList() Dim sht As Worksheet Set sht = ThisWorkbook.Worksheets("Лист1") sht.Range("A1") = 6 sht.Range("B2:B9").Font.Italic = True sht.Range("B2:B9").Interior.Color = rgbRed End Sub
Вы также можете использовать ключевое слово With с объектом
листа, как показано в следующем примере.
Sub ObyavObektListWith() Dim sht As Worksheet Set sht = ThisWorkbook.Worksheets("Лист1") With sht .Range("A1") = 6 .Range("B2:B9").Font.Italic = True .Range("B2:B9").Interior.Color = rgbRed End With End Sub
Доступ к рабочему листу в двух словах
Из-за множества различных способов доступа к рабочему листу вы можете быть сбитыми с толку. Так что в этом разделе я собираюсь разбить его на простые термины.
- Если вы хотите использовать тот лист, который активен в данный момент, используйте ActiveSheet.
ActiveSheet.Range("A1") = 55
2. Если лист находится в той же книге, что и код, используйте кодовое имя.
3. Если рабочая таблица находится в другой рабочей книге, сначала получите рабочую книгу, а затем получите рабочую таблицу.
' Получить рабочую книгу Dim wk As Workbook Set wk = Workbooks.Open("C:ДокументыСчета.xlsx", ReadOnly:=True) ' Затем получите лист Dim sh As Worksheet Set sh = wk.Worksheets("Лист1")
Если вы хотите защитить пользователя от изменения имени листа, используйте функцию SheetFromCodeName из раздела «Имя кода».
' Получить рабочую книгу Dim wk As Workbook Set wk = Workbooks.Open("C:ДокументыСчета.xlsx", ReadOnly:=True) ' Затем получите лист Dim sh As Worksheet Set sh = SheetFromCodeName("sheetcodename",wk)
Добавить рабочий лист
Примеры в этом разделе показывают, как добавить новую
рабочую таблицу в рабочую книгу. Если вы не предоставите никаких аргументов для
функции Add, то новый
рабочий лист будет помещен перед активным рабочим листом.
Когда вы добавляете рабочий лист, он создается с именем по умолчанию, например «Лист4». Если вы хотите изменить имя, вы можете легко сделать это, используя свойство Name.
В следующем примере добавляется новый рабочий лист и изменяется имя на «Счета». Если лист с именем «Счета» уже существует, вы получите сообщение об ошибке.
Sub DobavitList() Dim sht As Worksheet ' Добавляет новый лист перед активным листом Set sht = ThisWorkbook.Worksheets.Add ' Установите название листа sht.Name = "Счета" ' Добавляет 3 новых листа перед активным листом ThisWorkbook.Worksheets.Add Count:=3 End Sub
В предыдущем примере вы добавляете листы по отношению к
активному листу. Вы также можете указать точную позицию для размещения листа.
Для этого вам нужно указать, какой лист новый лист должен
быть вставлен до или после. Следующий код показывает вам, как это сделать.
Sub DobavitListPervPosl() Dim shtNew As Worksheet Dim shtFirst As Worksheet, shtLast As Worksheet With ThisWorkbook Set shtFirst = .Worksheets(1) Set shtLast = .Worksheets(.Worksheets.Count) ' Добавляет новый лист на первую позицию в книге Set shtNew = Worksheets.Add(Before:=shtFirst) shtNew.Name = "FirstSheet" ' Добавляет новый лист к последней позиции в книге Set shtNew = Worksheets.Add(After:=shtLast) shtNew.Name = "LastSheet" End With End Sub
Удалить рабочий лист
Чтобы удалить лист, просто вызовите Delete.
Dim sh As Worksheet Set sh = ThisWorkbook.Worksheets("Лист12") sh.Delete
Excel отобразит предупреждающее сообщение при удалении листа. Если вы хотите скрыть это сообщение, вы можете использовать код ниже:
Application.DisplayAlerts = False sh.Delete Application.DisplayAlerts = True
Есть два аспекта, которые нужно учитывать при удалении таблиц.
Если вы попытаетесь получить доступ к рабочему листу после
его удаления, вы получите ошибку «Subscript out of Range», которую мы видели в
разделе «Доступ к рабочему листу».
Dim sh As Worksheet Set sh = ThisWorkbook.Worksheets("Лист2") sh.Delete ' Эта строка выдаст «Subscript out of Range», так как «Лист2» не существует Set sh = ThisWorkbook.Worksheets("Лист2")
Вторая проблема — когда вы назначаете переменную листа. Если вы попытаетесь использовать эту переменную после удаления листа, вы получите ошибку автоматизации, подобную этой:
Run-Time error -21147221080 (800401a8′) Automation Error
Если вы используете кодовое имя рабочего листа, а не
переменную, это приведет к сбою Excel,
а не к ошибке автоматизации.
В следующем примере показано, как происходят ошибки автоматизации.
sh.Delete ' Эта строка выдаст ошибку автоматизации Debug.Assert sh.Name
Если вы назначите переменную Worksheet действительному рабочему листу, он будет работать нормально.
sh.Delete ' Назначить sh на другой лист Set sh = Worksheets("Лист3") ' Эта строка будет работать нормально Debug.Assert sh.Name
Цикл по рабочим листам
Элемент «Worksheets» — это набор рабочих листов, принадлежащих рабочей книге. Вы можете просмотреть каждый лист в коллекции рабочих листов, используя циклы «For Each» или «For».
В следующем примере используется цикл For Each.
Sub CiklForEach() ' Записывает «Привет Мир» в ячейку A1 для каждого листа Dim sht As Worksheet For Each sht In ThisWorkbook.Worksheets sht.Range("A1") = "Привет Мир" Next sht End Sub
В следующем примере используется стандартный цикл For.
Sub CiklFor() ' Записывает «Привет Мир» в ячейку A1 для каждого листа Dim i As Long For i = 1 To ThisWorkbook.Worksheets.Count ThisWorkbook.Worksheets(i).Range("A1") = "Привет Мир" Next sht End Sub
Вы видели, как получить доступ ко всем открытым рабочим книгам и как получить доступ ко всем рабочим листам в ThisWorkbook. Давайте сделаем еще один шаг вперед — узнаем, как получить доступ ко всем рабочим листам во всех открытых рабочих книгах.
Примечание. Если вы используете код, подобный этому, для записи на листы, то сначала сделайте резервную копию всего, так как в итоге вы можете записать неверные данные на все листы.
Sub NazvVsehStr() ' Печатает рабочую книгу и названия листов для ' всех листов в открытых рабочих книгах Dim wrk As Workbook Dim sht As Worksheet For Each wrk In Workbooks For Each sht In wrk.Worksheets Debug.Print wrk.Name + ":" + sht.Name Next sht Next wrk End Sub
Использование коллекции листов
Рабочая книга имеет еще одну коллекцию, похожую на Worksheets под названием Sheets. Это иногда путает пользователей. Чтобы понять, в первую очередь, вам нужно знать о типе листа, который является диаграммой.
В Excel есть возможность создать лист, который является диаграммой. Для этого нужно:
- Создать диаграмму на любом листе.
- Щелкнуть правой кнопкой мыши на графике и выбрать «Переместить».
- Выбрать первый вариант «Новый лист» и нажмите «ОК».
Теперь у вас есть рабочая книга, в которой есть типовые листы и лист-диаграмма.
- Коллекция «Worksheets » относится ко всем рабочим листам в рабочей книге. Не включает в себя листы типа диаграммы.
- Коллекция Sheets относится ко всем листам, принадлежащим книге, включая листы типовой диаграммы.
Ниже приведены два примера кода. Первый проходит через все
листы в рабочей книге и печатает название листа и тип листа. Второй пример
делает то же самое с коллекцией Worksheets.
Чтобы опробовать эти примеры, вы должны сначала добавить лист-диаграмму в свою книгу, чтобы увидеть разницу.
Sub KollSheets() Dim sht As Variant ' Показать название и тип каждого листа For Each sht In ThisWorkbook.Sheets Debug.Print sht.Name & " is type " & TypeName(sht) Next sht End Sub Sub KollWorkSheets() Dim sht As Variant ' Показать название и тип каждого листа For Each sht In ThisWorkbook.Worksheets Debug.Print sht.Name & " is type " & TypeName(sht) Next sht End Sub
Если у вас нет листов диаграмм, то использование коллекции Sheets — то же самое, что использование коллекции WorkSheets.
Заключение
На этом мы завершаем статью о Worksheet VBA. Я надеюсь, что было полезным.
Три наиболее важных элемента Excel VBA — это рабочие книги, рабочие таблицы, диапазоны и ячейки.
Эти элементы будут использоваться практически во всем, что вы делаете. Понимание их сделает вашу жизнь намного проще и сделает изучение VBA увлекательнее.
Make a particular worksheet visible using a macro in Excel.
This is called activating a worksheet and is rather easy to do.
Sections:
Activate Worksheet by Name
Activate Worksheet by Index Number
Notes
Activate Worksheet by Name
Let’s navigate to, activate, the worksheet called «Sheet2».
Worksheets("Sheet2").Activate
Worksheets(«Shee2») is how we reference the sheet to which we want to navigate.
Sheet2 is the name of the sheet to which we want to navigate. Make sure to surround it with double quotation marks.
Activate is what actually takes the user to that worksheet.
Putting it all together, we get: Worksheets(«Sheet2»).Activate
It’s as simple as that.
Activate Worksheet by Index Number
This time, let’s navigate to the second worksheet using its index number.
All we do is to replace «Sheet2» from the last example with 2.
Worksheets(2).Activate
2 is the index number of the desired worksheet and Activate is what takes us to the desired worksheet.
This example can be confusing if you are not used to using index numbers, but index numbers are really helpful when you have to do something like loop through all of the worksheets in the workbook.
Notes
Basically, just reference the desired worksheet, however you want, and then type .Activate after it.
You should not use the Activate feature to navigate to a worksheet so that you can get data from it or put data into it. This is very bad Macro/VBA design and it will make your life hell later on. To get data from separate worksheets, read this tutorial: Select Data from Separate Worksheets with Macros VBA in Excel.
This feature should be used when you want the user to end up on a specific worksheet.
Make sure to download the sample file attached to this tutorial so that you can see this macro in Excel and work with it.
Similar Content on TeachExcel
Copy and Paste Data using Macro VBA in Excel
Tutorial: How to copy and paste data using a Macro in Excel. I’ll show you multiple ways to do this,…
Select Data from Separate Worksheets with Macros VBA in Excel
Tutorial: Select data from other worksheets with Macros and VBA without navigating to those workshee…
Get the Last Row using VBA in Excel
Tutorial:
(file used in the video above)
How to find the last row of data using a Macro/VBA in Exce…
Login to a Website using a Macro
: Connect and login to a website using a macro in Excel.
This allows you to open a website a…
Get the Name of a Worksheet in Macros VBA in Excel
Tutorial: How to get the name of a worksheet in Excel using VBA and Macros and also how to store tha…
Guide to Creating Charts with a Macro in Excel
Tutorial: How to add, edit, and position charts in Excel using VBA.
This tutorial covers what to do …
Subscribe for Weekly Tutorials
BONUS: subscribe now to download our Top Tutorials Ebook!
Поговорим про то, как в VBA обращаться к листам книги Excel.
Вариант 1
У глобального объекта Excel Application есть 2 коллекции листов: Sheets и Worksheets. Отличаются они тем, что вторая коллекция не включает в себя специальные листы макросов, которые поддерживала Excel 4.0 (на минуточку — 1992 год) во времена, когда VBA ещё не было в природе (появился в Excel 5.0). Тяжело найти эстетов, которые всё ещё пользуются такими листами с макросами, поэтому можно считать, что эти коллекции идентичны. Лично я использую коллекцию Sheets просто потому, что 5 букв лучше, чем 9.
Sheets(1).Cells(1,1)
Sheets(1) — это не первый лист, созданный в книге, а лист, который на панели ярлыков листов занимает КРАЙНЕЕ ЛЕВОЕ положение. То есть Sheets(2) будет указывать на второй слева лист на панели ярлыков. Если вам нужен конкретный лист, то ТАК ссылаться на него, как вы понимаете, плохая идея, ибо пользователь, изменив порядок следования листов, нарушит работоспособность вашей программы.
Во всех примерах я буду обращаться к ячейки A1, так как речь не о свойствах объекта Worksheet, а о том, какие есть способы получить синтаксическую конструкцию, указывающую на нужный нам лист.
Вариант 2
Sheets(«First»).Cells(1,1)
Пожалуй, такое обращение к листу наиболее популярно в народе. В скобках и кавычках мы видим пользовательское имя листа. Плохо только то, что имя листа, что называется «hard coded» (жёстко запрограммировано), что является моветоном в программировании. Ибо, если у вас в модуле конструкция Sheets(«First») встречается 100 раз, то при смене имени листа придётся делать поиск с заменой 100 констант в коде. Поэтому обычно делают иначе…
Вариант 3
Гораздо разумней добавить ещё один уровень абстракции и объявить константу, ссылающуюся на имя листа.
Public Const wsFirst = «First»
Sheets(wsFirst).Cells(1,1)
В случае смены имени вам придётся исправить ТОЛЬКО эту константу в начале модуля. Однако, если программа написана и сдана пользователю, а тот в один прекрасный момент берёт и переименовывает лист, то наш код тут же перестаёт работать, что, согласитесь, не слишком хорошо…
Вариант 4
У листа есть свойство Name, которое мы видим на ярлыке листа и которое можем менять (если не включена защита структуры книги, но сейчас не об этом), но ещё есть свойство CodeName, которое присваивается листу в момент создания, и которое пользователь сменить не может. В русской редакции офиса эти CodeName-ы формируются по принципу: Лист1, Лист2, Лист3 и т.д. В англоязычной версии это: Sheet1, Sheet2, Sheet3, etc.
Если вы удалите лист, то его CodeName повторно не будет использовано. Так вот — VBA разпознаёт имена совпадающие с CodeName листа, как объекты типа Worksheet.
Лист1.Cells(1,1) или [Лист1].Cells(1,1)
Это отличная защита от того, что пользователь перенесёт или переименует лист. Но подобные имена ни о чём не говорят нам в процессе программирования в плане того, что располагается на листе, поэтому вы будете частенько ошибаться, путая листы. А те, кто будут потом разбираться в вашем коде, тоже спасибо вам не скажут. Поэтому я предлагаю следующую модификацию этого способа:
Вариант 5
Public wsData As Worksheet
Set wsData = Лист1
wsData.Cells(1,1)
Строку 1 размещаем в объявлениях модуля. Строку 2 размещаем в обработчике события Workbook_Open. И после этого в любом месте книги мы можем использовать объявленные переменные (wsData, строка 3). На мой взгляд, это самый удобный и продвинутый вариант из рассмотренных.
Вариант 6
Не забываем про свойство ActiveSheet объекта Application, указывающее на активный лист книги. Если вы работаете с текущим листом, то использовать его, я считаю, оптимально.
ActiveSheet.Cells(1,1)
Вариант 7
Ну и последнее, если вам передан в подпрограмму объект типа Range, то не забываем, что ссылку на лист возвращает его свойство Worksheet.
Это всё, что я имел сказать по поводу ссылок на листы в Excel VBA
Получить доступ к листу Excel и прочитать данные — Visual Basic .NET
http://www.cyberforum.ru/vb-net/thread453716.html
Module mdlExcel
Dim SelectedSheet As String
Public Sub OpenSheet(ByVal Grid As DataGridView)
Dim OpenDialog As New OpenFileDialog, FileName As String = «»
With OpenDialog
.Title = «Открыть документ Excel»
.Filter = «Документы Excel|*.xls;*.xlsx»
If .ShowDialog = Windows.Forms.DialogResult.OK Then
FileName = .FileName : Application.DoEvents()
Else
Return
End If
End With
‘ Подключение к Excel.
Dim connection As OleDb.OleDbConnection, connectionString As String
Try
‘Для Excel 12.0
connectionString = «Provider=Microsoft.ACE.OLEDB.12.0; Data Source=» + FileName + «; Extended Properties=»»Excel 12.0 Xml;HDR=YES»»;»
connection = New OleDb.OleDbConnection(connectionString)
connection.Open()
Catch ex12 As Exception
Try
‘Для более ранних версий
connectionString = «Provider=Microsoft.Jet.OLEDB.4.0;Data Source=» + FileName + «; Extended Properties=»»Excel 8.0;HDR=Yes;IMEX=1″»;»
connection = New OleDb.OleDbConnection(connectionString)
connection.Open()
Catch ex11 As Exception
MsgBox(«Неизвестная версия Excel или файл имеет неизвестный формат!», MsgBoxStyle.Exclamation)
Return
End Try
End Try
‘Отобразить форму выбора листов
ShowSelectForm(GetExcelSheetNames(connection), FileName)
If SelectedSheet Is Nothing Then Return
‘Выборка данных
Dim command As OleDb.OleDbCommand = connection.CreateCommand()
command.CommandText = «Select * From [» & SelectedSheet & «$]»
Dim Adapter As New OleDb.OleDbDataAdapter(command), Table As New DataTable
Adapter.Fill(Table) : connection.Close()
With Grid
.Visible = False : .Parent.Cursor = Cursors.WaitCursor
.DataSource = Table : SetGridSettings(Grid)
.Visible = True : .Parent.Cursor = Cursors.Default
End With
End Sub
Private Function GetExcelSheetNames(ByVal connection As OleDb.OleDbConnection) As String()
Dim Table As DataTable
Try
Table = connection.GetOleDbSchemaTable(OleDb.OleDbSchemaGuid.Tables, New Object() {Nothing, Nothing, Nothing, «TABLE»})
If Table Is Nothing Then Return Nothing
With Table
Dim i As Integer = 0, SheetsArray() As String = Nothing, s As String
For n As Integer = 0 To .Rows.Count — 1
s = .Rows(n).Item(«TABLE_NAME»).ToString.Trim(New Char() {«‘»})
If Strings.Right(s, 1) = «$» Then
ReDim Preserve SheetsArray(i)
SheetsArray(i) = s.Trim(New Char() {«$»})
i += 1
End If
Next
Table.Dispose() : Return SheetsArray
End With
Catch ex As Exception
MsgBox(ex.Message, MsgBoxStyle.Exclamation)
Return Nothing
End Try
End Function
Private Sub ShowSelectForm(ByVal Sheets() As String, ByVal FileName As String)
If Sheets Is Nothing Then SelectedSheet = Nothing : Return
Dim F As New Form, T As New TreeView, I As New ImageList, P As New Panel, B1, B2 As New Button
With I
.ColorDepth = ColorDepth.Depth32Bit
.ImageSize = New Size(16, 16)
.Images.Add(«Книга», My.Resources.Images16x16.Excel) ‘рисунок 16×16 px для названия файла excel
.Images.Add(«Документ», My.Resources.Images16x16.Документ) ‘рисунок 16×16 px для названия листа excel
End With
With T
.Name = «T»
.ImageList = I : .Font = New Font(«Arial», 10, FontStyle.Bold)
.ShowPlusMinus = False : .ShowLines = False : .ShowRootLines = False
Dim N As TreeNode = .Nodes.Add(«Книга», FileIO.FileSystem.GetName(FileName), 0, 0)
Dim nn As TreeNode
For ni As Int16 = 0 To Sheets.Length — 1
nn = N.Nodes.Add(«Лист» & ni.ToString, Sheets(ni), 1, 1)
nn.NodeFont = New Font(.Font, FontStyle.Regular)
Next
.ExpandAll()
End With
With F
.Text = » Документ Excel»
.ShowInTaskbar = False
.StartPosition = FormStartPosition.CenterParent
.FormBorderStyle = FormBorderStyle.FixedToolWindow
.Height = .Height * 1.3
.AcceptButton = B1 : .CancelButton = B2
With P
.Name = «P» : .Parent = F
.Dock = DockStyle.Bottom
End With
With T
.Parent = F
.Dock = DockStyle.Fill
.BringToFront()
AddHandler .NodeMouseDoubleClick, AddressOf T_NodeDoubleClick
End With
With B2
.Name = «B2»
.Text = «Отмена»
.Parent = P : .Top = 5
.Left = P.Width — .Width — 5
AddHandler .Click, AddressOf B2_Click
End With
With B1
.Name = «B1»
.Text = «Открыть»
.Parent = P : .Top = 5
.Left = B2.Left — .Width — 5
.Font = New Font(.Font, FontStyle.Bold)
AddHandler .Click, AddressOf B1_Click
End With
P.Height = B1.Height + 10
AddHandler .Load, AddressOf F_Load
.ShowDialog()
End With
End Sub
Private Sub SetGridSettings(ByVal Grid As DataGridView)
With Grid
.ReadOnly = False : .MultiSelect = False
.SelectionMode = DataGridViewSelectionMode.CellSelect
.RowTemplate.Resizable = DataGridViewTriState.False
.RowHeadersWidthSizeMode = DataGridViewRowHeadersWidthSizeMode.DisableResizing
For n As Integer = 0 To .ColumnCount — 1
With .Columns(n)
.Resizable = DataGridViewTriState.False
.AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells
.SortMode = DataGridViewColumnSortMode.NotSortable
End With
Next
End With
End Sub
Private Sub F_Load(ByVal sender As Form, ByVal e As EventArgs)
Dim T As TreeView = sender.Controls(«T»)
With T
.Select()
If .Nodes(0).Nodes.Count > 0 Then .SelectedNode = .Nodes(0).Nodes(0)
End With
SelectedSheet = Nothing
End Sub
Private Sub B1_Click(ByVal sender As Button, ByVal e As EventArgs)
Dim F As Form = sender.Parent.Parent, T As TreeView = F.Controls(«T»)
Application.DoEvents()
If Strings.Left(T.SelectedNode.Name, 4) = «Лист» Then
F.DialogResult = DialogResult.OK
SelectedSheet = T.SelectedNode.Text : F.Close()
Else
MsgBox(«Необходимо выбрать лист.», MsgBoxStyle.Exclamation)
T.Select()
End If
End Sub
Private Sub B2_Click(ByVal sender As Button, ByVal e As EventArgs)
Dim F As Form = sender.Parent.Parent
F.DialogResult = DialogResult.Cancel
SelectedSheet = Nothing : F.Close()
End Sub
Private Sub T_NodeDoubleClick(ByVal sender As TreeView, ByVal e As TreeNodeMouseClickEventArgs)
If e.Node.Name = «Книга» Then sender.ExpandAll()
B1_Click(sender.Parent.Controls(«P»).Controls(«B1»), Nothing)
End Sub
End Module
Ссылки на листы по имени
Вы можете идентифицировать листы по имени с помощью свойств листы и диаграммы . Следующие утверждения активируют различные листы в активной книге.
Используйте свойство Sheets , чтобы вернуть лист, диаграмму, модуль или диалоговый лист. Коллекция Листов содержит все эти типы листов. В следующем примере активируется лист с именем «Chart1» в активной книге.
Примечание Диаграммы, встроенные в лист, являются членами коллекции ChartObjects , в то время как диаграммы, которые существуют на собственных листах, относятся к коллекции Charts .
Поддержка и обратная связь
Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.
Как работать с Excel через VBA или объектная модель Excel
Перед созданием своей первой программы в Excel необходимо разобраться в объектную модели приложения. Имея четкое понимания об объектной модели Excel вы сможете управлять практически всеми объектами, создавать/изменять листы, графики, отдельные файлы и многое другое. Возможно на первый взгляд она покажется довольно сложной, но не пугайтесь на конкретных примерах у вас сложится целостная картина.
Структура объектов
Проще всего рассматривать объектную модель как некое дерево или иерархическую структуру, так как каждый объект имеет свое ответвление. Кусочек этой структуры вы можете увидеть на рисунке далее.
Самый главный объект, вершина нашей структуры, это собственно само приложение Excel — объект Application. Какие объекты входят в Excel? правильно книги (файлы Excel), поэтому в объекте Application содержится коллекция из книг — объект Workbooks. Из чего состоят книги — из листов, диаграмм, соответственно внутри объекта Workbooks мы видим объект Worksheets и Charts. Идем дальше, лист в свою очередь состоит из строк, столбцов, ячеек это объекты Rows, Columns, Range.
Это, конечно, как вы понимаете только часть объектной модели Excel, мы перечислили только одни их самых основных объектов. Полное дерево объектов исчисляется сотнями объектов. Возможно она сейчас кажется сложной, не переживайте со временем вы начнете быстро в ней ориентироваться. Главное сейчас — это понять, что есть некие объекты, которые могут состоять из других объектов.
Объекты и коллекции объектов
Многие объекты, которые мы перечислили выше являются коллекциями. Коллекция — это группа однотипных объектов (или классов). Например Workbook s — это коллекция всех открытых в данный момент книг (объектов Workbook). А коллекция Worksheet s состоит из листов книги (объектов Worksheet), и так далее. Как правило все коллекции заканчиваются буквой S.
Давайте посмотрим, как обращаться к конкретным элементам коллекции в коде VBA.
Мы можем указать порядковый номер (начиная с единицы) элемента в коллекции. Worksheets(3) — в этом случае мы обращаемся к 3-му листу книги.
Мы также можем указать название листа в кавычках Worksheets(«Название листа»).
Аналогичным образом можно обратиться к конкретной книге Workbook(«Названием книги»).
Чтобы обратиться к объекту Excel (к листу, или ячейке) необходимо указать ссылку на этот объект, перечислив полный путь к нему в соответствии с объектной моделью.
Например, для ячейки A1 полная ссылка будет выглядеть следующим образом:
На самом деле полный путь писать не обязательно. Application — можно практически всегда не указывать. Workbooks(«Название книги») — можно не указывать, если необходимо обратиться к ячейке из активной книги, а Worksheets(«Название листа») можно не писать в случае если код должен выполнять действия на активном листе. Т.е. в можно упростить до:
Но всегда имейте ввиду, что это будет ячейка на активном листе.
Свойства объектов
Все объекты имеют свойства и методы. Например, объект Range (диапазон ячеек) имеет свойство Value, в котором содержится значение.
Вы можете получать значения из свойств объекта, просто указав путь к нужному свойству. Следующий код выведет значение ячейки A1 на активном листе.
А следующий код присвоит свойству Value новое значение 12345.
Протестируйте эти функции в своем файле.
Кстати, есть свойства объектов, которые доступны только для чтения. Т.е. вы сможете только получить значения этих свойств, но не сможете присвоить им другие значения. Например, свойство Range(«A1»).Address которое содержит адрес ячейки. При попытке записать новое значение в такое свойство будет возникать ошибка.
Или же свойство Worksheets.Count — вы можете только получить количество листов, но не можете изменить количество листов, задав новое свойство Count. Для этого существуют методы объектов.
Методы объектов
В отличие от свойств, которые просто сохраняют или передают значение, методы выполняют какие-либо действия с объектом. Например метод Worksheets.Add создает новый пустой лист в книге. Еще один пример это метод Clear, который позволяет очистить содержимое ячеек. Следующий код очистит данные и форматы из диапазона ячеек A1:C10.
Есть аналогичная функция, которая не удаляет при этом форматирование ячеек, а только очищает их от значений
Методы могут иметь дополнительные аргументы. Например, метод AddComment имеет обязательный аргумент Text, в котором необходимо передать текст комментария к ячейке.
Также можно использовать следующий код для вызова методов. Возможно это более привычная запись, когда по аналогией с функцией Excel мы в скобках передаем аргументы этой функции.
Приемы и лайфхаки
Автоматическое заполнение кода по начальным символам
Часто, особенно на первых порах, вы не запомните точное название всех объектов, но будете помнить их первые символы. В редакторе кода вы можете использовать отобразить список названий и автоматически записать объект по первым символам. Для этого используйте сочетание клавиш Ctrl+ J и увидите список из предложенных вариантов.
Просмотр свойств и методов у объекта
Когда вы будете писать свои программы, то редактор кода VBE будет подсказывать список свойств и методов у объекта. Чтобы отобразить этот список достаточно ввести объект, например, Worksheets и поставить точку, отобразится список свойств и методов. Выберите нужный с помощью мышки или же используйте стрелки. Вы также можете начать писать название свойства и редактор кода подберет подходящее. Когда выбор сделан — нажимайте клавишу Tab.
Явно указывайте тип переменных
Предыдущий лайфхак не будет работать для созданных локальных переменных до тех пор, пока вы явно не укажите их тип. Например, если вы захотели создать переменную MySheet в которой хотите хранить текущий лист. То список свойств и методов у такой переменной вы не увидите. Но стоит добавить строчку кода и явно указать тип переменной:
И подсказки снова заработают.
Быстрый просмотр справки
Все свойства и методы знать невозможно, так как их тысячи. Первое время вы будете активно пользоваться справкой. Советую использовать официальную справку на сайте Microsoft.
Чтобы быстро посмотреть информацию по интересующему вас объекту, свойству или методу просто поставьте курсор на интересующий элемент кода и нажмите клавишу F1. В окне браузера откроется официальная справка по этому элементу.
Поиск по объектной модели
Также вначале пути у вас постоянно будут возникать вопрос «А как называется свойство, которое отвечает за. «. Иногда мы и не заем есть ли такое свойство/метод вообще. Хороший вариант изучения — просмотр объектной модели. Переходите в редактор кода VBA и нажимайте клавишу F2. Откроется окно с поиском по объектной модели. Тут вы найдете все имеющиеся свойства, методы, события и прочие элементы в модели. Просматривайте их, как правило в названии элемента заложена его суть и вы найдете то что искали. А в процессе поиска будете запоминать и другие элементы, которые будут попадаться на глаза.
Давайте разберем на примере. Допустим нам надо защитить лист, но мы не знаем как точно зазывается свойство или метод.
- Открываем объектную модель клавишей F2.
- Так как мы хотим защитить лист, то логично предположить, что это метод в объекте Worksheet. Введем его в строку поиска и нажмем бинокль.
- В результатах поиска выбираем наш объект Worksheet и просматриваем его элементы.
- Находим метод Protect (Защита).
- Мы также можем просмотреть описание всех аргументов этого метода
- Конечно если что-то не понятно, то жмем клавишу F1 и открываем справку по этому методу с подробным описанием каждого аргумента.
На этом данную статью завершим, а в следующих мы более подробно поговорим про самый распространенный объект Excel — объект Range.
Поговорим про то, как в VBA обращаться к листам книги Excel.
Вариант 1
У глобального объекта Excel Application есть 2 коллекции листов: Sheets и Worksheets . Отличаются они тем, что вторая коллекция не включает в себя специальные листы макросов, которые поддерживала Excel 4.0 (на минуточку — 1992 год) во времена, когда VBA ещё не было в природе (появился в Excel 5.0). Тяжело найти эстетов, которые всё ещё пользуются такими листами с макросами, поэтому можно считать, что эти коллекции идентичны. Лично я использую коллекцию Sheets просто потому, что 5 букв лучше, чем 9.
Sheets(1).Cells(1,1)
Sheets(1) — это не первый лист, созданный в книге, а лист, который на панели ярлыков листов занимает КРАЙНЕЕ ЛЕВОЕ положение. То есть Sheets(2) будет указывать на второй слева лист на панели ярлыков. Если вам нужен конкретный лист, то ТАК ссылаться на него, как вы понимаете, плохая идея, ибо пользователь, изменив порядок следования листов, нарушит работоспособность вашей программы.
Во всех примерах я буду обращаться к ячейки A1, так как речь не о свойствах объекта Worksheet , а о том, какие есть способы получить синтаксическую конструкцию, указывающую на нужный нам лист.
Вариант 2
Sheets(«First»).Cells(1,1)
Пожалуй, такое обращение к листу наиболее популярно в народе. В скобках и кавычках мы видим пользовательское имя листа. Плохо только то, что имя листа, что называется «hard coded» (жёстко запрограммировано), что является моветоном в программировании. Ибо, если у вас в модуле конструкция Sheets(«First») встречается 100 раз, то при смене имени листа придётся делать поиск с заменой 100 констант в коде. Поэтому обычно делают иначе.
Вариант 3
Гораздо разумней добавить ещё один уровень абстракции и объявить константу, ссылающуюся на имя листа.
Public Const wsFirst = «First»
Sheets(wsFirst).Cells(1,1)
В случае смены имени вам придётся исправить ТОЛЬКО эту константу в начале модуля. Однако, если программа написана и сдана пользователю, а тот в один прекрасный момент берёт и переименовывает лист, то наш код тут же перестаёт работать, что, согласитесь, не слишком хорошо.
Вариант 4
У листа есть свойство Name , которое мы видим на ярлыке листа и которое можем менять (если не включена защита структуры книги, но сейчас не об этом), но ещё есть свойство CodeName , которое присваивается листу в момент создания, и которое пользователь сменить не может. В русской редакции офиса эти CodeName -ы формируются по принципу: Лист1 , Лист2 , Лист3 и т.д. В англоязычной версии это: Sheet1 , Sheet2 , Sheet3 , etc.
Если вы удалите лист, то его CodeName повторно не будет использовано. Так вот — VBA разпознаёт имена совпадающие с CodeName листа, как объекты типа Worksheet .
Лист1.Cells(1,1) или [Лист1].Cells(1,1)
Это отличная защита от того, что пользователь перенесёт или переименует лист. Но подобные имена ни о чём не говорят нам в процессе программирования в плане того, что располагается на листе, поэтому вы будете частенько ошибаться, путая листы. А те, кто будут потом разбираться в вашем коде, тоже спасибо вам не скажут. Поэтому я предлагаю следующую модификацию этого способа:
Вариант 5
Public wsData As Worksheet
Set wsData = Лист1
wsData.Cells(1,1)
Строку 1 размещаем в объявлениях модуля. Строку 2 размещаем в обработчике события Workbook_Open . И после этого в любом месте книги мы можем использовать объявленные переменные ( wsData , строка 3). На мой взгляд, это самый удобный и продвинутый вариант из рассмотренных.
Вариант 6
Не забываем про свойство ActiveSheet объекта Application , указывающее на активный лист книги. Если вы работаете с текущим листом, то использовать его, я считаю, оптимально.
ActiveSheet.Cells(1,1)
Вариант 7
Ну и последнее, если вам передан в подпрограмму объект типа Range, то не забываем, что ссылку на лист возвращает его свойство Worksheet .