Vba excel свойства ячейки
Объекты MS Excel
Свойства
Cвойство Range
Свойство Range возвращает объект Range , определяемый аргументами. Используются два разных способа записи свойства Range .
Первый способ object.Range(Cell1)
Второй способ object.Range(Cell1 [,Cell2])
- object — ссылка на объект, например, на рабочий лист или на интервал ячеек. Ссылка необязательна. По умолчанию используется активный лист;
- Cell1, Cell2 — аргументы для задания интервала ячеек. Cell1 — указание обязательно при обоих способах записи свойства Range .
Аргумент Cell1 задает интервал ячеек произвольного размера.
- Могут использоваться имена, определенные в таблице, или координаты ячеек, столбцов, строк или интервалов.
- Координаты задаются в стиле A1.
- Координаты и имена заключаются в кавычки.
- При задании интервалов координаты левого верхнего угла и правого нижнего угла интервала разделяются двоеточием.
- Для задания несмежных интервалов используется запятая.
- Для задания пересечения интервалов используется пробел.
Запись | Возвращаемый объект |
---|---|
ActiveSheet.Range(«A1: A10 «) | интервал ячеек A1: A10 на активном листе |
Range(«A:B») | столбцы A:B |
Range(«налог») | интервал с именем налог |
Range(«1:3») | строки с первой по третью |
Range(«A1: C2 , B10:D24») | объединение двух несмежных интервалов A1: C2 и B10:D24 |
Range(«A1:C10 B10:D24») | пересечение двух интервалов A1:C10 и B10:D24, т.е. интервал B10:C10 |
Аргументы задают координаты интервала:
- Cell1 — единственная ячейка (строка или столбец), задающая левый верхний угол интервала;
- Cell2 — единственная ячейка (строка или столбец), задающая правый нижний угол интервала. Необязательный аргумент.
Допустимо задание аргументов переменными, выражениями, свойствами или методами, представляющими объект Range — одну ячейку, одну строку или один столбец рабочего листа .
Запись | Возвращаемый объект |
---|---|
Range(«A5″,»D18») | интервал A5:D18 |
Range(Columns(1), Columns(5)) | интервал, содержащий первые пять столбцов рабочего листа |
- Если свойство Range применяется к объекту Range , то ссылка на интервал ячеек считается относительной и возвращается смещенный объект Range .
Например, если выделен интервал C1:D5, то запись Selection.Range(«B2») возвратит ячейку D2.
Свойство Cells
Свойство Cells возвращает единственную ячейку рабочего листа , которая находится на пересечении строки и столбца, задаваемых целыми числами.
Синтаксис object. Cells (RowIndex,ColumnIndex)
- object — ссылка на объект. Ссылка необязательна. По умолчанию используется активный лист;
- RowIndex — индекс строки;
- ColumnIndex — индекс столбца.
- В свойстве Cells индекс строки является первым аргументом, а индекс столбца — вторым аргументом, тогда как при задании адреса ячейки в стиле A1 сначала указывается столбец, а затем строка.
- Понятие «индекс» ( Index, ColumnIndex, RowIndex ) всегда подразумевает целое число, целочисленную переменную или выражение, результат вычисления которого есть целое число или может быть преобразован в целое число.
Запись | Комментарий | Возвращаемый объект |
---|---|---|
ActiveSheet. Cells | Свойство Cells без аргументов | все ячейки активного рабочего листа |
Range(«C5:C10»). Cells (1,1) | Свойство Cells применяется к объекту Range (относительная ссылка) | ячейка C5 |
Range( Cells (7,3), Cells (10,4)) | Свойство Cells используется в качестве аргументов свойства Range | интервал ячеек C7:D10 |
Свойство Offset
Свойство Offset позволяет задавать ячейки или интервалы при помощи числа строк и колонок, которые отделяют нужную ячейку от исходной ячейки, т.е. указывая смещение относительно выбранной ячейки. Например, Range(«A5»).Offset(-2,1) возвращает ячейку B3.
- object — ссылка на объект Range . Ссылка обязательна и определяет объект, относительно которого задается смещение;
- RowOffset — смещение строки искомой ячейки относительно исходной ячейки;
- ColumnOffset — смещение столбца искомой ячейки относительно исходной ячейки.
Необязательные аргументы RowOffset и ColumnOffset — числовые выражения. Если какой-то аргумент не задан, то соответствующее смещение равно нулю.
Например, если выделен интервал C1:D5, то запись Selection.Offset(2,1).Select выделяет интервал D3:E7.
Метод Union и свойство Areas
Метод Union используется для объединения двух и более объектов Range , заданных ссылками на непересекающиеся интервалы, в один объект Range .
Синтаксис Object. Union (arg1,arg2. )
- object — всегда объект Application . Ссылка необязательна;
- arg1,arg2 — интервалы ячеек. Количество аргументов произвольно. Обязательно наличие хотя бы двух аргументов.
Например, оператор Union (Range(«A1:C5»),Range(«B10:D12»)).Select выделяет несмежные интервалы A1:C5 и B10:D12.
Свойство Areas выполняет обратное действие, разделяя объединенные интервалы на несколько объектов Range .
- object — ссылка на объект Range , состоящий из нескольких интервалов;
- index — номер интервала в объекте. Аргумент необязателен.
Оператор | Комментарий | Результат |
---|---|---|
p= Union (Range(«A1:C5»), Range(«B10:D12»)).Areas(2).Count | Если аргумент задан, то свойство Areas возвращает интервал — объект Range , определенный индексом интервала | равен девяти, так как во втором интервале ровно 9 ячеек |
p= Union (Range(«A1:C5»), Range(«B10:D12»)).Areas.Count | Cвойство Areas без аргументов рассматривает каждый из несмежных интервалов как элемент коллекции объектов Range | равен двум, так как объект, определенный методом Union , состоит из двух областей — коллекции из двух элементов |
p=Range(«B10:D12»).Areas.Count | равен единице, так как объект Range представляет один элемент коллекции |
Свойства Column и Row (R/O Integer)
Свойства возвращают целое число, показывающее индекс первого столбца или первой строки соответственно для заданного объекта. Синтаксис свойств
- object — обязательная ссылка на объект Range .
Например, запись Range(«C5»).Column возвращает число 3, а запись Range(«C5»).Row возвращает число 5.
Свойства Columns и Rows
Свойство Columns (не путайте со свойством Column !) возвращает объект Range , представляющий колонку или коллекцию колонок в объекте, к которому это свойство было применено.
- object — ссылка на объект. Указание необязательно, по умолчанию используется активный рабочий лист ;
- index — индекс колонки в объекте.
Например, запись Columns(1) возвращает колонку A активного рабочего листа , а запись Range(«C1:D5»).Columns(1) возвращает колонку C заданного интервала, а именно, ячейки C1:C5.
- Если не указан индекс колонки, то возвращаются все колонки объекта в виде объекта Range .
- Индекс колонки можно указывать числом или буквой, при этом буква заключается в кавычки. Ссылки Columns(2) и Columns(«B») указывают на одну и ту же колонку B.
Свойство Rows (не путайте со свойством Row !) возвращает объект Range , представляющий строку или коллекцию строк в объекте, к которому это свойство было применено.
- object — ссылка на объект. Указание необязательно, по умолчанию используется активный рабочий лист ;
- index — индекс строки в объекте.
- Если не указан номер строки, то возвращаются все строки объекта в виде объекта Range .
Например, оператор nr=Selection.Rows(Selection.Rows.Count).Row позволяет получить номер последней строки в выделенном интервале ячеек.
Свойство CurrentRegion
Свойство CurrentRegion определяет объект Range , который соответствует интервалу ячеек, включающему заданную ячейку.
В процедуре сравниваются значения первой ячейки первой строки и первой ячейки каждой следующей строки заполненного данными интервала, включающего первую ячейку. Если значения совпадают, то очередная строка удаляется.
Предполагается, что данные начинаются с ячейки A1 и занимают несколько строк и столбцов, при этом расположены не плотно, т.е. внутри интервала с данными могут находиться пустые строки или пустые столбцы. Анализируются только строки заполненного данными интервала ячеек вокруг ячейки A1, не содержащего пустых строк и столбцов.
Свойства | Примеры и комментарии | ||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
ColumnW >Variant ) | Возвращает или изменяет ширину колонки в единицах, эквивалентных одному символу в стиле Обычный ( Normal ). Шрифт стиля по умолчанию Arial Cyr и размер шрифта 10. Range(«A1»).ColumnW > устанавливает ширину колонки A в 15 символов | ||||||||||||||||||||
W >Variant ) | Возвращает ширину интервала ячеек в пунктах. Range(«A1»).Width возвращает значение 93.75, если ширина колонки 15 символов, шрифт Times New Roman, размер шрифта 12 пунктов (72 пункта равны 1 дюйму или приблизительно 2,54 см). Debug.Print Range(«A1:C3»).ColumnWidth распечатает значение 8.43, а оператор Debug.Print Range(«A1:C3»).Width распечатает значение 144, если для колонок установлена стандартная ширина, шрифт Arial Cyr и размер шрифта 10 | ||||||||||||||||||||
RowHeight (R/W Variant ) | Возвращает или изменяет высоту строк интервала в пунктах. ActiveCell.RowHeight = 14 устанавливает высоту строки, в которой находится активная ячейка , в 14 пунктов | ||||||||||||||||||||
Height (R/O Variant ) | Возвращает суммарную высоту интервала строк, зависящую от названия и размера шрифта. Если шрифт Arial Cyr и размер шрифта 10, то Debug.Print Range(«A1»).Height распечатает 12,75 и Debug.Print Range(«A1:C3»).Height распечатает 38,25 | ||||||||||||||||||||
WrapText (R/W Boolean) | Range(«A1»).WrapText=True Значение True разбивает текст ячейки на несколько строк, если ширина столбца недостаточна для размещения текста целиком Объекты ExcelТермин Объекты Excel (понимаемый в широком смысле, как объектная модель Excel) включает в себя элементы, из которых состоит любая рабочая книга Excel. Это, например, рабочие листы (Worksheets), строки (Rows), столбцы (Columns), диапазоны ячеек (Ranges) и сама рабочая книга Excel (Workbook) в том числе. Каждый объект Excel имеет набор свойств, которые являются его неотъемлемой частью. Например, объект Worksheet (рабочий лист) имеет свойства Name (имя), Protection (защита), Visible (видимость), Scroll Area (область прокрутки) и так далее. Таким образом, если в процессе выполнения макроса требуется скрыть рабочий лист, то достаточно изменить свойство Visible этого листа. В Excel VBA существует особый тип объектов – коллекция. Как можно догадаться из названия, коллекция ссылается на группу (или коллекцию) объектов Excel. Например, коллекция Rows – это объект, содержащий все строки рабочего листа. Доступ ко всем основным объектам Excel может быть осуществлён (прямо или косвенно) через объект Workbooks, который является коллекцией всех открытых в данный момент рабочих книг. Каждая рабочая книга содержит объект Sheets – коллекция, которая включает в себя все рабочие листы и листы с диаграммами рабочей книги. Каждый объект Worksheet состоит из коллекции Rows – в неё входят все строки рабочего листа, и коллекции Columns – все столбцы рабочего листа, и так далее. В следующей таблице перечислены некоторые наиболее часто используемые объекты Excel. Полный перечень объектов Excel VBA можно найти на сайте Microsoft Office Developer (на английском).
Приведённая выше таблица показывает, как выполняется доступ к объектам Excel через родительские объекты. Например, ссылку на диапазон ячеек можно записать вот так: Присваивание объекта переменнойВ Excel VBA объект может быть присвоен переменной при помощи ключевого слова Set: Активный объектВ любой момент времени в Excel есть активный объект Workbook – это рабочая книга, открытая в этот момент. Точно так же существует активный объект Worksheet, активный объект Range и так далее. Сослаться на активный объект Workbook или Sheet в коде VBA можно как на ActiveWorkbook или ActiveSheet, а на активный объект Range – как на Selection. Если в коде VBA записана ссылка на рабочий лист, без указания к какой именно рабочей книге он относится, то Excel по умолчанию обращается к активной рабочей книге. Точно так же, если сослаться на диапазон, не указывая определённую рабочую книгу или лист, то Excel по умолчанию обратится к активному рабочему листу в активной рабочей книге. Таким образом, чтобы сослаться на диапазон A1:B10 на активном рабочем листе активной книги, можно записать просто: Смена активного объектаЕсли в процессе выполнения программы требуется сделать активной другую рабочую книгу, другой рабочий лист, диапазон и так далее, то для этого нужно использовать методы Activate или Select вот таким образом: Методы объектов, в том числе использованные только что методы Activate или Select, далее будут рассмотрены более подробно. Свойства объектовКаждый объект VBA имеет заданные для него свойства. Например, объект Workbook имеет свойства Name (имя), RevisionNumber (количество сохранений), Sheets (листы) и множество других. Чтобы получить доступ к свойствам объекта, нужно записать имя объекта, затем точку и далее имя свойства. Например, имя активной рабочей книги может быть доступно вот так: ActiveWorkbook.Name. Таким образом, чтобы присвоить переменной wbName имя активной рабочей книги, можно использовать вот такой код: Ранее мы показали, как объект Workbook может быть использован для доступа к объекту Worksheet при помощи такой команды: Это возможно потому, что коллекция Worksheets является свойством объекта Workbook. Некоторые свойства объекта доступны только для чтения, то есть их значения пользователь изменять не может. В то же время существуют свойства, которым можно присваивать различные значения. Например, чтобы изменить название активного листа на “Мой рабочий лист“, достаточно присвоить это имя свойству Name активного листа, вот так: Методы объектовОбъекты VBA имеют методы для выполнения определённых действий. Методы объекта – это процедуры, привязанные к объектам определённого типа. Например, объект Workbook имеет методы Activate, Close, Save и ещё множество других. Для того, чтобы вызвать метод объекта, нужно записать имя объекта, точку и имя метода. Например, чтобы сохранить активную рабочую книгу, можно использовать вот такую строку кода: Как и другие процедуры, методы могут иметь аргументы, которые передаются методу при его вызове. Например, метод Close объекта Workbook имеет три необязательных аргумента, которые определяют, должна ли быть сохранена рабочая книга перед закрытием и тому подобное. Чтобы передать методу аргументы, необходимо записать после вызова метода значения этих аргументов через запятую. Например, если нужно сохранить активную рабочую книгу как файл .csv с именем “Книга2”, то нужно вызвать метод SaveAs объекта Workbook и передать аргументу Filename значение Книга2, а аргументу FileFormat – значение xlCSV: Чтобы сделать код более читаемым, при вызове метода можно использовать именованные аргументы. В этом случае сначала записывают имя аргумента, затем оператор присваивания “:=” и после него указывают значение. Таким образом, приведённый выше пример вызова метода SaveAs объекта Workbook можно записать по-другому: В окне Object Browser редактора Visual Basic показан список всех доступных объектов, их свойств и методов. Чтобы открыть этот список, запустите редактор Visual Basic и нажмите F2. Рассмотрим несколько примеровПример 1Этот отрывок кода VBA может служить иллюстрацией использования цикла For Each. В данном случае мы обратимся к нему, чтобы продемонстрировать ссылки на объект Worksheets (который по умолчанию берётся из активной рабочей книги) и ссылки на каждый объект Worksheet отдельно. Обратите внимание, что для вывода на экран имени каждого рабочего листа использовано свойство Name объекта Worksheet. Пример 2В этом примере кода VBA показано, как можно получать доступ к рабочим листам и диапазонам ячеек из других рабочих книг. Кроме этого, Вы убедитесь, что если не указана ссылка на какой-то определённый объект, то по умолчанию используются активные объекты Excel. Данный пример демонстрирует использование ключевого слова Set для присваивания объекта переменной. В коде, приведённом ниже, для объекта Range вызывается метод PasteSpecial. Этот метод передаёт аргументу Paste значение xlPasteValues. Пример 3Следующий отрывок кода VBA показывает пример объекта (коллекции) Columns и демонстрирует, как доступ к нему осуществляется из объекта Worksheet. Кроме этого, Вы увидите, что, ссылаясь на ячейку или диапазон ячеек на активном рабочем листе, можно не указывать этот лист в ссылке. Вновь встречаем ключевое слово Set, при помощи которого объект Range присваивается переменной Col. Данный код VBA показывает также пример доступа к свойству Value объекта Range и изменение его значения. Несколько советов по работе с VBA в Excel
Некоторое время назад меня попросили «помочь с Экселем», а потом и работа подвернулась такая, так что за последние пару месяцев я узнал много полезного, чем и хочу поделиться в догонку к недавней статье. Предполагается, что вы знаете основы Visual Basic. Я не буду рассказывать, как создавать формы или модули, здесь только примеры кода. Visual BasicОпцииВо-первых, в VB массивы могут начинаться с индекса 1, что для многих странно, поэтому в начале модулей можно прописывать: Так же рекомендуется прописать: В этом случае интерпретатор потребует заблаговременного объявления всех переменных. Переменные объявлять нужно потому, что: Ещё одним важным оператором является ON ERROR. Привожу варианты: Возможности языкаХотя VB довольно прост, полезно почитать документацию по его синтаксису. Я, например, с удивлением узнал, что можно прописывать сложные усолвия в SELECT’ах (аналог switch): Ускорение работы макросовЧасто макросы требуют долгого времени выполнения, которое можно значительно сократить. В начале и в конце каждой ресурсоёмкой функции вызвать Prepare и Ended. По порядку: Важно понимать, что VBA выполняет все действия так же, как и пользователь. Поэтому для того, чтобы установить параметры страницы, он каждый раз открывает и закрывает окно параметров. У меня выставлялись параметры для 10 листов, это реально не быстро. Поэтому делаем так: Далее, часто нужно просмотреть различные диапазоны ячеек и что-то с ними сделать. Тут важно не использовать циклы for с перебором индексов, они медленные. Можно использовать встроенные функции Экселя, но удобнее всего такой вариант: Для любых переменных, которым вы собираетесь присвоить книгу, лист, диапазон (ячейку) нужно предварительно объявить как Variant. Естественно, что если вам нужны однотипные значения в ячейках, нужно использовать автозаполнение, всё равно как «растягивание» ячеек пользователем. Второй диапазон должен включать первый, а второй необязательный параметр указывает тип автозаполнения. Загрузка книги и событияПри открытии книги каждый раз срабатывает процедура. Список доступных событий можно посмотреть вверху редактора VB. Например, я делал на событие Change проверку, где лежит ячейка, в которой было изменения, и если это нужный диапазон, то делалась запись в лог со старым и новым значением. ЗащитаВо-первых сразу отмечу, что MS Office не исполняет макросы на компьютерах, где он не нашел антивируса, если книга зашифрована. Сталкивался на компьютерах, где антивирус был, но видимо Windows XP об этом не знала. Ещё антивирус может странным образом мешать работе, вызывать ошибки, не совсем объяснимые. Показал айтишникам, сказали ок, что-то сделали, не знаю. Итак, нам надо защитить книгу, чтобы ввод был разрешен только в нужные ячейки (формулы и заголовки поменять нельзя). Во-первых, нужно сделать соответствующие ячейки «не защищенными». Для этого делаем одно из: Далее нужно защитить лист. На вкладке Рецензирование есть такая кнопка. Окошко просит ввести пароль и установить исключения (что можно будет делать пользователю). К сожалению, список исключений маловат. Самое обидное, что нельзя разрешить сворачивать/разворачивать группы столбцов/строк. Поэтому действуем так, на загрузку книги прописываем: Тут мы сталкиваемся с парой сюрпризов. Во-первых, не все макросы будут работать даже так. Известный баг, ничего не сделаешь. Нельзя вставить строку, например. Приходится снимать и тут же ставить защиту. Если «злоумышленник» в этот момент нажмет ctrl+break, то защита слетит. Во-вторых, скажем никаким способом нельзя удалять строки (AllowDeletingRows), в которых есть защищенные ячейки, хоть одна. Подробнее вот тут. Решением (костылем) является добавление кнопки или сочетания клавиш для удаления. Заодно можно проверить, чтобы пользователь не удалил чего не надо. В Workbook_open добавляем: Теперь процедура будет вызываться при нажатии shift+delete. ЗаключениеVBA — весьма глючная вещь, которая позволяет сворачивать горы в MS Office. Многие предприятяи используют модели на Excel годами, и если они сделаны хорошо, то всё работает. Для изучения VBA подходит он сам, во-первых там хорошая справка. Например, чтобы узнать все варианты что можно разрешить в методе Protect, нажимаем F1, Protect, ввод. И вуаля. Во-вторых, можно проделать требуемые действия вручную, записав макрос, а потом просмотрев его код. Код будет ужасен (например, при изменении параметров страницы, макрос запишет значения всех параметров и полей, а не только измененного вами), но ответы найдутся. Хотя, например, .AutoFit, который записывается при изменении высоты ячейки по содержимому (двойной клик на границе слева), на самом деле не работает. Предлагаю знатокам поделиться своим опытом, дать советы в комментариях. Спасибо за внимание, удачных разработок вам. Чтение и запись значения ячейки в VBAВ приложении Excel все данные как правило находятся в ячейках на листах, с которыми макросы работают как с базой данных. Поэтому, начинающему программисту VBA важно понимать как читать значения из ячейки Excel в переменные или массивы и, наоборот, записывать какие-либо значения на лист в ячейки. Обращение к конкретной ячейкеПрежде чем читать или записывать значение в ячейке, нужно определиться с тем, как можно указать какая именно ячейка нам необходима. Полный путь к ячейке A1 в Книге1 на Листе1 можно записать двумя вариантами:
Пример 1: Обратиться к ячейке A3 находящейся в Книге1 на Листе1 Однако, как правило, полный путь редко используется, т.к. макрос работает с Книгой, в которой он записан и часто на активном листе. Поэтому путь к ячейке можно сократить и написать просто: Пример 2: Обратиться к ячейке A1 в текущей книге на активном листе Если всё же путь к книге или листу необходим, но не хочется его писать при каждом обращении к ячейкам, можно использовать конструкцию With End With. При этом, обращаясь к ячейкам, необходимо использовать в начале «.» (точку). Пример 3: Обратиться к ячейке A1 и B1 в Книге1 на Листе2. Так же, можно обратиться и к активной (выбранной в данный момент времени) ячейке. Пример 4: Обратиться к активной ячейке на Листе3 текущей книги. Чтение значения из ячейкиЕсть 3 способа получения значения ячейки, каждый из которых имеет свои особенности:
По-умолчанию, если при обращении к ячейке не указывать способ чтения значения, то используется способ Value. Пример 5: В ячейке A1 активного листа находится дата 01.03.2018. Для ячейки выбран формат «14 марта 2001 г.». Необходимо прочитать значение ячейки всеми перечисленными выше способами и отобразить в диалоговом окне. Пример 6: В ячейке С1 активного листа находится значение 123,456789. Для ячейки выбран формат «Денежный» с 3 десятичными знаками. Необходимо прочитать значение ячейки всеми перечисленными выше способами и отобразить в диалоговом окне. При присвоении значения переменной или элементу массива, необходимо учитывать тип переменной. Например, если оператором Dim задан тип Integer, а в ячейке находится текст, при выполнении произойдет ошибка «Type mismatch». Как определить тип значения в ячейке, рассказано в следующей статье. Пример 7: В ячейке B1 активного листа находится текст. Прочитать значение ячейки в переменную. Таким образом, разница между Text, Value и Value2 в способе получения значения. Очевидно, что Value2 наиболее предпочтителен, но при преобразовании даты в текст (например, чтобы показать значение пользователю), нужно использовать функцию Format. Запись значения в ячейкуОсуществить запись значения в ячейку можно 2 способами: с помощью Value и Value2. Использование Text для записи значения не возможно, т.к. это свойство только для чтения. Пример 8: Записать в ячейку A1 активного листа значение 123,45 Все три строки запишут в A1 одно и то же значение. Пример 9: Записать в ячейку A2 активного листа дату 1 марта 2018 года В данном примере тоже запишется одно и то же значение в ячейку A2 активного листа. Визуальное отображение значения на экране будет зависеть от того, какой формат ячейки выбран на листе. Adblockdetector |