vba excel столбец по номеру
VBA Excel. Ячейки (обращение, запись, чтение, очистка)
Обращение к ячейке на листе Excel из кода VBA по адресу, индексу и имени. Чтение информации из ячейки. Очистка значения ячейки. Метод ClearContents объекта Range.
Обращение к ячейке по адресу
Допустим, у нас есть два открытых файла: «Книга1» и «Книга2», причем, файл «Книга1» активен и в нем находится исполняемый код VBA.
В общем случае при обращении к ячейке неактивной рабочей книги «Книга2» из кода файла «Книга1» прописывается полный путь:
Удобнее обращаться к ячейке через свойство рабочего листа Cells(номер строки, номер столбца), так как вместо номеров строк и столбцов можно использовать переменные. Обратите внимание, что при обращении к любой рабочей книге, она должна быть открыта, иначе произойдет ошибка. Закрытую книгу перед обращением к ней необходимо открыть.
Теперь предположим, что у нас в активной книге «Книга1» активны «Лист1» и ячейка на нем «A1». Тогда обращение к ячейке «A1» можно записать следующим образом:
Точно также можно обращаться и к другим ячейкам активного рабочего листа, кроме обращения ActiveCell, так как активной может быть только одна ячейка, в нашем примере – это ячейка «A1».
Если мы обращаемся к ячейке на неактивном листе активной рабочей книги, тогда необходимо указать этот лист:
Имя ярлыка может совпадать с основным именем листа. Увидеть эти имена можно в окне редактора VBA в проводнике проекта. Без скобок отображается основное имя листа, в скобках – имя ярлыка.
Обращение к ячейке по индексу
К ячейке на рабочем листе можно обращаться по ее индексу (порядковому номеру), который считается по расположению ячейки на листе слева-направо и сверху-вниз.
Например, индекс ячеек в первой строке равен номеру столбца. Индекс ячеек во второй строке равен количеству ячеек в первой строке (которое равно общему количеству столбцов на листе, зависящему от версии Excel) плюс номер столбца. Индекс ячеек в третьей строке равен количеству ячеек в двух первых строках плюс номер столбца. И так далее.
Для примера, Cells(4) та же ячейка, что и Cells(1, 4). Используется такое обозначение редко, тем более, что у разных версий Excel может быть разным количество столбцов и строк на рабочем листе.
По индексу можно обращаться к ячейке не только на всем рабочем листе, но и в отдельном диапазоне. Нумерация ячеек осуществляется в пределах заданного диапазона по тому же правилу: слева-направо и сверху-вниз. Вот индексы ячеек диапазона Range(«A1:C3»):
Обращение к ячейке по имени
Если ячейке на рабочем листе Excel присвоено имя (Формулы –> Присвоить имя), то обращаться к ней можно по присвоенному имени.
Запись информации в ячейку
Содержание ячейки определяется ее свойством «Value», которое в VBA Excel является свойством по умолчанию и его можно явно не указывать. Записывается информация в ячейку при помощи оператора присваивания «=»:
Ссылки на строки и столбцы
Используйте свойство Rows или свойство Columns для работы со всеми строками или столбцами. Эти свойства возвращают объект Range, который представляет диапазон ячеек. В следующем примере Rows(1) возвращает строку 1 на листе1. Затем свойство Bold объекта Font для диапазона настроено на True.
В следующей таблице иллюстрируют некоторые ссылки строки и столбцы с использованием свойств Строки и Столбцы.
Справочник | Смысл |
---|---|
Rows(1) | Строка 1 |
Rows | Все строки на таблице |
Columns(1) | Столбец 1 |
Columns(«A») | Столбец 1 |
Columns | Все столбцы на таблице |
Чтобы одновременно работать с несколькими строками или столбцами, создайте переменную объекта и используйте метод Union, объединяя несколько вызовов в свойство Rows или Columns. В следующем примере формат строк 1, 3 и 5 на таблице один в активной книге изменяется на жирный.
В этом примере удаляются пустые столбцы из выбранного диапазона.
Об участнике
Поддержка и обратная связь
Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.
Как обратиться к диапазону из VBA
Полагаю не совру когда скажу, что все кто программирует в VBA очень часто в своих кодах общаются к ячейкам листов. Ведь это чуть ли не основное предназначение VBA в Excel. В принципе ничего сложного в этом нет. Например, чтобы записать в ячейку A1 слово Привет необходимо выполнить код:
Тоже самое можно сделать сразу для нескольких ячеек:
Если необходимо обратиться к именованному диапазону:
Cells(1, 1).Value = «Привет»
Синтаксис объекта Range:
Range(Cell1, Cell2)
Синтаксис объекта Cells:
Cells(Rowindex, Columnindex)
Исходя из этого несложно предположить, что к диапазону можно обратиться, используя Cells и Range:
‘выделяем диапазон «A1:B10» на активном листе Range(Cells(1,1), Cells(10,2)).Select
и для чего? Ведь можно гораздо короче:
Range(«D5:F56»).Offset(2, 1).Resize(1, 1).Select
И неплохо бы теперь понять, как значение диапазона присвоить переменной. Для начала переменная должна быть объявлена с типом Range. А т.к. Range относится к глобальному типу Object, то присвоение значения такой переменной должно быть обязательно с применением оператора Set:
Dim rR as Range Set rR = Range(«D5»)
если оператор Set не применять, то в лучшем случае получите ошибку, а в худшем(он возможен, если переменной rR не назначать тип) переменной будет назначено значение Null или значение ячейки по умолчанию. Почему это хуже? Потому что в таком случае код продолжит выполняться, но логика кода будет неверной, т.к. эта самая переменная будет содержать значение неверного типа и применение её в коде в дальнейшем все равно приведет к ошибке. Только ошибку эту отловить будет уже сложнее.
Использовать же такую переменную в дальнейшем можно так же, как и прямое обращение к диапазону:
Вроде бы на этом можно было завершить, но. Это как раз только начало. То, что я написал выше знает практически каждый, кто пишет в VBA. Основной же целью этой статьи было пояснить некоторые нюансы обращения к диапазонам. Итак, поехали.
Обычно макрорекордер при обращении к диапазону(да и любым другим объектам) сначала его выделяет, а потом уже изменяет свойство или вызывает некий метод:
‘так выглядит запись слова Test в ячейку А1 Range(«A1»).Select Selection.Value = «Test»
‘запишем слово Test в ячейку A1 на активном листе Range(«A1»).Value = «Test»
‘запишем слово Test в ячейку A1 на активном листе Range(«A1»).Value = «Test»
‘активируем Лист2 Worksheets(«Лист2»).Select ‘записываем слово Test в ячейку A1 Range(«A1»).Value = «Test»
Чтобы не активируя другой лист записать в него данные, необходимо явно указать принадлежность объекта Range именно этому листу:
‘запишем слово Test в ячейку A1 на Лист2 независимо от того, какой лист активен Worksheets(«Лист2»).Range(«A1»).Value = «Test»
‘считываем значение ячейки A1 с Лист2 независимо от того, какой лист активен MsgBox Worksheets(«Лист2»).Range(«A1»).Value
Т.к. ячейка является частью листа, то лист в свою очередь является частью книги. Исходя из того легко сделать вывод, что при открытых двух и более книгах мы так же можем обратиться к ячейкам любого листа любой открытой книги не активируя при этом ни книгу, ни лист:
‘запишем слово Test в ячейку A1 на Лист2 книги Книга2.xlsx независимо от того, какая книга и какой лист активен Workbooks(«Книга2.xlsx»).Worksheets(«Лист2»).Range(«A1»).Value = «Test» ‘считываем значение ячейки A1 с Лист2 книги Книга3.xlsx независимо от того, какой лист активен MsgBox Workbooks(«Книга3.xlsx»).Worksheets(«Лист2»).Range(«A1»).Value
Dim wsSh As Worksheet For Each wsSh In ActiveWorkbook.Worksheets Range(«A1»).Value = wsSh.Name ‘записываем в ячейку А1 имя листа MsgBox Range(«A1»).Value ‘проверяем, то ли имя записалось Next wsSh
Dim wsSh As Worksheet For Each wsSh In ActiveWorkbook.Worksheets wsSh.Activate ‘активируем каждый лист Range(«A1»).Value = wsSh.Name ‘записываем в ячейку А1 имя листа MsgBox Range(«A1»).Value ‘проверяем, то ли имя записалось Next wsSh
Dim wsSh As Worksheet For Each wsSh In ActiveWorkbook.Worksheets wsSh.Range(«A1»).Value = wsSh.Name ‘записываем в ячейку А1 имя листа MsgBox wsSh.Range(«A1»).Value ‘проверяем, то ли имя записалось Next wsSh
Sheets(«Итог»).Range(Cells(1, 1), Cells(10, 1))
это вызовет ошибку «Run-time error ‘1004’: Application-defined or object-defined error». А ошибка появляется потому, что контейнер и объекты внутри него не могут располагаться на разных листах, равно как и:
Sheets(«Итог»).Range(Cells(1, 1), Sheets(«Итог»).Cells(10, 1)) ‘запись ниже так же неверна Range(Cells(1, 1), Sheets(«Итог»).Cells(10, 1))
Sheets(«Итог»).Range(Sheets(«Итог»).Cells(1, 1), Sheets(«Итог»).Cells(10, 1)) Range(Sheets(«Итог»).Cells(1, 1), Sheets(«Итог»).Cells(10, 1))
Разберем пример, приближенный к жизненной ситуации. Необходимо на лист Итог занести формулу вычитания, начиная с ячейки А2 и до последней заполненной. На момент записи активен Лист1. Очень часто начинающие записывают так:
Но и здесь неверное обращение с диапазоном может сыграть злую шутку. Например, надо получить последнюю заполненную ячейку в конкретной книге:
lLastRow = Workbooks(«Книга3.xls»).Sheets(«Лист1»).Cells(Rows.Count, 1).End(xlUp).Row
lLastRow = Workbooks(«Книга3.xls»).Sheets(«Лист1»).Cells(Workbooks(«Книга3.xls»).Sheets(«Лист1»).Rows.Count, 1).End(xlUp).Row
или применить конструкцию With
Union(Range(«A1»), Range(«B10»)).Value = «Привет»
Однако существует и другой метод:
В чем отличие(я бы даже сказал преимущество) Union: можно применять в цикле по условию. Например, выделить в диапазоне A1:F50 только те ячейки, значение которых больше 10 и меньше 20:
Sub SelOne() Dim rCell As Range, rSel As Range For Each rCell In Range(«A1:F50») If rCell.Value > 10 And rCell.Value Статья помогла? Поделись ссылкой с друзьями!
Поиск по меткам
Доброго всем дня,коллеги! Подскажите чайнику простейшее.. Есть макрос,который вставляет в активную ячейку текущее время+текст. Необходимо,что бы текст возможно было вставить только в определенном диапазоне (н-р пару столбцов), т.к. при вставке «не туда» данные,записанные ранее удаляются,и откатиться назад уже нельзя. Буду благодарен за помощь! Девочек с наступающим.
Добрый день всем! В очередной раз за помощью! Простой макрос по кнопке вставляет дату + N дней. Но часто полученная дата попадает на выходной. Что нужно дописать,или изменить, что бы полученная дата «проскакивала» вперед на ближайший рабочий день?
Sub Через_10д()
If Not Intersect(ActiveCell, Range(«J14:M350»)) Is Nothing Then ActiveCell = Date + 10
End Sub
Артем,
1. Спасибо. Вообще в самом начале статьи написан другой код:
Range(«A1»).Value = «Привет»
Тоже самое можно сделать сразу для нескольких ячеек:
Range(«A1:C10»).Value = «Привет»
Основной же целью этой статьи было пояснить некоторые нюансы обращения к диапазонам. Итак, поехали.
Dim arr ‘объявляем переменную, в которую помещать массив arr = Range(«A1:F10»).Value ‘дальше делаем с массивом все, что надо
Есть еще один забавный способ адресоваться в VBA к ячейке.
[a2] = «Привет!» ‘ Занесет в ячейку А2 текущей книги текущего листа «Привет!»
Работает при способе адресации А1. При адресации RC будет работать такой способ:
[r1c2] = «Привет!»
Подскажите, пожалуйста, можно ли так же обращаться к динамическим диапазонам, нижняя граница которых записана через ИНДЕКС(ПОИСКПОЗ. У меня всякие ошибки вылезают при попытке обращения к такому диапазону.
Матвей, можно. Но не зная как и что Вы там задаете и какие лезут ошибки помочь нечем 🙁 Попробуйте создать тему на форуме с приложенным файлом и подробным описанием проблемы.
VBA Excel. Свойство Cells объекта Range
Свойство Cells объекта Range в VBA Excel, представляющее коллекцию ячеек заданного диапазона. Обращение к ячейкам диапазона с помощью свойства Cells.
Свойство Cells объекта Worksheet
Обращение к ячейке «A1» активного рабочего листа с помощью свойства Cells:
В данном случае в качестве объекта Range выступает диапазон всего активного рабочего листа (ActiveSheet). Полный путь к ячейке «A1» можно записать так:
Обращение в VBA Excel к ячейке «C5» с помощью свойства Cells по имени рабочего листа (Worksheet) в другой книге Excel:
Обращение к диапазону «C5:G10» с помощью свойства Cells активного рабочего листа:
Свойство Cells объекта Range
Обращение в VBA Excel к ячейкам заданного диапазона с помощью свойства Cells рассмотрим на коллекции ячеек диапазона «C5:G10». Обращаться будем к ячейке «D8» активного листа:
Обратите внимание, что отсчет номеров строк, номеров и буквенных обозначений столбцов для указания адреса ячейки внутри диапазона ведется от верхней левой ячейки данного диапазона.
Обход диапазона ячеек циклом
Обход ячеек циклом For Each… Next
Обход ячеек циклом For Each… Next — это самый простой способ обхода всех ячеек заданного диапазона. Он может быть применен, например, для присвоения ячейкам свойств и значений или поиска ячейки с определенным свойством или значением.
Присвоение ячейкам диапазона «B3:F10» числовых значений, соответствующих их порядковым номерам (индексам) в диапазоне:
Поиск в диапазоне «B3:F10», заполненном предыдущим кодом VBA Excel значениями, ячейки со значением «27», окрашивание ее в зеленый цвет и выход из цикла:
Обход диапазона циклом For… Next
Цикл For… Next позволяет указывать переменные в качестве индексов ячеек или номеров строк и столбцов для обхода ячеек заданного диапазона.
Присвоение ячейкам диапазона «B3:F10» числовых значений, соответствующих их порядковым номерам (индексам) в диапазоне, с помощью цикла For… Next:
Применение в качестве параметров свойства Cells объекта Range переменных, задающих номера строк и номера столбцов указанного диапазона при обходе его ячеек циклом For… Next:
Колонки VBA
Свойство столбцов Excel VBA
Нам всем хорошо известен тот факт, что рабочая таблица Excel организована в столбцы и строки, и каждое пересечение строк и столбцов рассматривается как ячейка. Всякий раз, когда мы хотим сослаться на ячейку в Excel через VBA, мы можем использовать свойства Range или Cells. Что если мы хотим сослаться на столбцы из таблицы Excel? Есть ли какая-либо функция, которую мы можем использовать для ссылки на то же самое? Ответ большой ДА!
Да, в VBA есть свойство под названием «Столбцы», которое помогает вам ссылаться, а также возвращать столбец из данной таблицы Excel. Мы можем ссылаться на любой столбец на листе, используя это свойство, и можем манипулировать им.
Синтаксис столбцов VBA:
Синтаксис для свойства столбцов VBA показан ниже:
Очевидно, какой столбец необходимо включить / использовать для дальнейшего разбирательства, используется этими двумя аргументами. Оба являются необязательными и, если они не предоставлены по умолчанию, будут рассматриваться как первая строка и первый столбец.
Как использовать свойство столбцов в Excel VBA?
Ниже приведены различные примеры использования свойства столбцов в Excel с использованием кода VBA.
Мы увидим, как можно выбрать столбец на листе, используя свойство VBA Columns. Для этого выполните следующие шаги:
Шаг 1: Вставьте новый модуль в Visual Basic Editor (VBE), где вы можете написать блок кодов. Нажмите на вкладку « Вставка » и выберите « Модуль» на панели VBA.
Шаг 2: Определите новую подпроцедуру, которая может содержать макрос, который вы собираетесь написать.
Шаг 3: Используйте свойство Columns.Select из VBA, чтобы выбрать первый столбец на рабочем листе. Это на самом деле по-разному, вы можете использовать Columns (1). Выберите изначально. Смотрите скриншот ниже:
Свойство Columns в этом небольшом фрагменте кода указывает номер столбца, а свойство Select позволяет VBA выбирать столбец. Поэтому в этом коде столбец 1 выбран на основе заданных входных данных.
Шаг 4: Нажмите F5 или нажмите кнопку «Выполнить», чтобы запустить этот код и увидеть результат. Вы можете видеть, что столбец 1 будет выбран в вашем листе Excel.
Это один из способов использования свойства столбцов для выбора столбца на листе. Мы также можем использовать имена столбцов вместо номеров столбцов в коде. Ниже код также дает тот же результат.
Если мы используем свойство Columns без какого-либо спецификатора, оно будет работать только на всех активных рабочих листах, присутствующих в рабочей книге. Однако, чтобы сделать код более безопасным, мы можем использовать спецификатор рабочего листа со столбцами и сделать наш код более безопасным. Следуйте инструкциям ниже:
Шаг 1: Определите новую подпроцедуру, которая может содержать макрос под модулем.
Теперь мы будем использовать свойство Worksheets.Columns для выбора столбца из указанного листа.
Шаг 2: Начните вводить квалификатор Worksheets под данным макросом. Этому классификатору нужно имя листа, укажите имя листа как « Пример 2 » (не забудьте добавить скобки). Это позволит системе получить доступ к рабочему листу с именем Пример 2 из текущей рабочей книги.
Шаг 3: Теперь используйте свойство Columns, которое позволит вам выполнять различные операции над столбцами на выбранном листе. Я выберу 4- й столбец. Я могу выбрать его, написав индекс как 4 или указав алфавит столбца «D».
На данный момент мы выбрали рабочий лист с именем Пример 2 и получили доступ к столбцу D из него. Теперь нам нужно выполнить некоторые операции со столбцом, к которому осуществляется доступ.
Шаг 4. Используйте свойство Выбрать после столбцов, чтобы выбрать столбец, указанный в текущем рабочем листе.
Шаг 5: Запустите код, нажав клавишу F5 или нажав кнопку воспроизведения.
Предположим, мы хотим выбрать диапазон ячеек в разных столбцах. Мы можем комбинировать свойство Range и Columns для этого. Следуйте инструкциям ниже:
Предположим, что у нас есть данные, распределенные между B1 и D4 на листе, как показано ниже:
Шаг 1: Определите новую подпроцедуру для хранения макроса.
Шаг 2: Используйте квалификатор « Рабочие листы», чтобы получить доступ к рабочему листу с именем « Пример 3 », где у нас есть данные, показанные на снимке экрана выше.
Шаг 3: Используйте свойство Range, чтобы установить диапазон для этого кода от B1 до D4. Используйте следующий диапазон кодов («B1: D4») для того же.
Шаг 4: Используйте свойство Columns для доступа ко второму столбцу из выбора. Используйте код как Столбцы (2) для доступа ко второму столбцу из доступного диапазона.
Шаг 5: Теперь самая важная часть. Мы получили доступ к рабочему листу, диапазону и столбцу. Однако, чтобы выбрать доступный контент, нам нужно использовать свойство Select в VBA. Смотрите скриншот ниже для макета кода.
Шаг 6: Запустите этот код, нажав F5 или кнопку Run, и посмотрите результат.