Сделать ячейку активной excel vba

Обновлено: 02.07.2024

Все начинающие изучать VBA сталкиваются с тем, что записанные через макрорекордер коды пестрят методами Select и Activate.
Если не знакомы с работой макрорекордера - Что такое макрос и где его искать?
Это значительно ухудшает читабельность кода и, как ни странно - быстродействие. Но есть недостатки и куда более критичные. Если код выполняется достаточно долго и он постоянно что-то выделяет - пользователь может заскучать и забыться и начнет тыкать мышкой по листам и ячейкам, выделяя не то, что выделил ранее код. Что повлечет ошибки логики. Т.е. код может и выполнится, но совершенно не так, как ожидалось. Поэтому избавляться от Select и Activate необходимо везде, где это возможно.

Для начала рассмотрим два кода, выполняющие одни те же действия - запись в ячейку А3 листа Лист2 слова "Привет". При этом сам код запускается с Лист1 и после выполнения код Лист1 должен остаться активным. Чтобы сделать эти действия вручную потребуется сначала перейти на Лист2, выделить ячейку А3, записать в неё слово "Привет" и вернуться на Лист1. Поэтому запись макрорекордером этих действий приведет к такому коду:

Sub Макрос1() Sheets("Лист2").Select 'выделяем Лист2 Range("A3").Select 'выделяем ячейку А3 ActiveCell.FormulaR1C1 = "Привет" 'записываем слово Привет Range("A4").Select 'после нажатия Enter автоматически выделяется ячейка А4 Sheets("Лист1").Select 'возвращаемся на Лист1 End Sub

Нигде не говорится, что в большинстве случаев все эти Select и Activate в кодах не нужны. Однако вышеприведенный код можно значительно улучшить, если убрать все ненужные Select и Activate:

Sub Макрос1() Sheets("Лист2").Range("A3").FormulaR1C1 = "Привет" End Sub

Как видно, вместо 5-ти строк кода получилась одна строка. Которая выполняет ту же задачу, что и код из 5-ти строк.
Прежде чем понять как правильно избавляться от лишнего давайте разберемся зачем же тогда VBA записывает эти Select и Activate? Как ни странно, но здесь все очень просто. VBA просто не знает, что Вы будете делать после того, как выделили Лист2. И когда Вы переходите на Лист2 - VBA записывает именно переход(его активацию, выделение). Когда выделяете ячейку - так же именно это действие записывает VBA. Захотите ли Вы затем выделить еще что-то, или закрасить ячейку, или записать в неё формулу/значение - VBA не знает. Поэтому в дальнейшем VBA работает именно с выделенным объектом Selection на активном листе.
Но при написании кода вручную или при правке записанного рекордером мы уже вольны в выборе и знаем, чего хотели добиться и какие действия нам точно не нужны.
Итак, чтобы записать в ячейку слово "Привет" рекордер предложит нам такой код:

Sub Макрос1() Range("A3").Select 'выделяем ячейку А3 ActiveCell.FormulaR1C1 = "Привет" 'записываем слово Привет Range("A4").Select 'после нажатия Enter автоматически выделяется ячейка А4 End Sub

однако выделять ячейку( Range("A3").Select ) совершенно необязательно. Значит один Select уже лишний. После этого идет обращение к активной ячейке - ActiveCell . .FormulaR1C1 = "Привет" означает запись значения "Привет" в эту ячейку.
Пусть не смущает FormulaR1C1 - VBA всегда так указывает запись и значения и формулы. Т.к. перед словом "Привет" нет знака равно - то это значение.
Т.к. ActiveCell является обращением к выделенной ячейке, а выделили мы до этого А3, значит их можно просто "сократить":

Sub Макрос1() Range("A3").FormulaR1C1 = "Привет" Range("A4").Select 'после нажатия Enter автоматически выделяется ячейка А4 End Sub

Теперь у нас код получился короче и понятнее. Однако остался один Select: Range("A4").Select . Если нет необходимости выделять ячейку А4 после записи в А3 значения, то надо просто удалить эту строку и после выполнения кода активной будет та ячейка, которая была выделена до выполнения(т.е. выделенная ячейка просто не изменится). Таким образом мы с трех строк сократим код до 1-ой:

Sub Макрос1() Range("A3").FormulaR1C1 = "Привет" End Sub

Теперь несложно догадаться, что с листами все в точности так же. Sheets("Лист2").Select - Select хоть и не нужен, но и ActiveSheet после него нет. Здесь необходимо знать некоторую иерархию в Excel. Сначала идет сам Excel - Application, потом книга - Workbook. В книгу входят рабочие листы(Worksheets), а уже в листах - ячейки и диапазоны - Range и Cells(Application ->Workbook ->Worksheet ->Range). Если перед Range или Cells не указывать явно лист: Range("A3").FormulaR1C1 = "Привет" , то значение будет записано на активный лист. Подробнее можно прочесть в статье: Как обратиться к диапазону из VBA

Маленький нюанс: если сокращаем обращение к объектам, то Select-ов быть не должно вообще. Иначе есть шанс получить ошибку "Subscript out of range":

буквально это означает, что указанный индекс вне досягаемости. А появляется эта ошибка потому, что нельзя выделить ячейку НЕактивного листа или лист НЕактивной книги. Легко эту ошибку получить например в таком коде:

Sub Макрос2() Windows("Книга3").Activate 'здесь появится ошибка, т.к. пытаемся выделить лист в Книга2 'а на данный момент активной является Книга3 Windows("Книга2").Sheets("Лист3").Select End Sub

Ошибка обязательно появится, т.к. сначала мы активировали кодом книгу "Книга3", а потом пытаемся активировать лист НЕактивной на этот момент книги "Книга2". А это сделать невозможно без активации той книги, в которой активируемый лист. Т.е. активация должна происходить именно последовательно: Книга ->Лист ->Ячейка. И никак иначе, если мы хотим активировать именно конкретную ячейку конкретного листа в конкретной книге.
И пример с ячейками:

Sub Макрос2() Sheets("Лист3").Select 'здесь появится ошибка, т.к. пытаемся выделить ячейку на листе "Лист1" 'а на данный момент активным является Лист3 Sheets("Лист1").Range("C7").Select End Sub

Так же такая ошибка может появиться и по той простой причине, что указанного листа или книги нет(листа с указанным именем нет в данной книге или книга, к которой обращаемся просто закрыта).

Еще небольшой пример оптимизации:

Sub Макрос2() Windows("Книга3").Activate Sheets("Лист3").Select Range("C7").Select ActiveCell.FormulaR1C1 = "Привет" Range("C7").Select Selection.Font.Bold = True With Selection.Interior .Pattern = xlSolid .PatternColorIndex = xlAutomatic .Color = 65535 .TintAndShade = 0 .PatternTintAndShade = 0 End With End Sub

Этот код записывает в ячейку С7 Лист3 книги "Книга3" слово "Привет", потом делает жирным шрифт и назначает желтый цвет заливке. Убираем активацию книги, листа и ячейки, заменив их прямым обращением:

далее делаем для ячейки жирный шрифт:

With Workbooks("Книга3").Sheets("Лист3").Range("C7").Interior .Pattern = xlSolid .PatternColorIndex = xlAutomatic .Color = 65535 .TintAndShade = 0 .PatternTintAndShade = 0 End With

Тут есть нюанс. Windows необходимо всегда заменять на Workbooks - в кодах я сделал именно так. Если этого не сделать, то получите ошибку 438 - объект не поддерживает данное свойство или метод(object dos't support this property or metod), т.к. коллекция Windows не содержит определения для Sheets.

Вместо Workbooks("Книга3.xlsx") можно использовать обращение к активной книге или книге, в которой расположен код. Обращение к Лист3 активной книги, когда активен Лист2 или другой:

Но бывают случаи, когда необходимо производить действия исключительно в той книге, в которой сам код. И не зависеть при этом от того, какая книга активна в данный момент и как она называется. Ведь в процессе книга может быть переименована. За это отвечает ThisWorkbook:

ActiveWorkbook - действия с активной на момент выполнения кода книгой
ThisWorkbook - действия с книгой, в которой записан код

Однако так же бывают случаи, когда необходимо обращаться к новой книге или листу, которые были созданы в процессе работы кода. В таком случае необходимо использовать переменные:

Sub NewBook() 'объявляем переменную для дальнейшего обращения Dim wbNewBook As Workbook 'создаем книгу Set wbNewBook = Workbooks.Add 'теперь можно обращаться к wbNewBook как к любой другой книге 'но уже не указывая её имя wbNewBook.Sheets(1).Range("A1").Value = "Привет" 'Sheets(1) - обращение к листу по его порядковому номеру '(отсчет с начинается с 1 слева) End Sub Sub NewSheet() 'объявляем переменную для дальнейшего обращения Dim wsNewSheet As Worksheet 'добавляем новый лист в активную книгу Set wsNewSheet = ActiveWorkbook.Sheets.Add 'теперь можно обращаться к wsNewSheet как к любому другому листу 'но уже не указывая его имя или индекс wsNewSheet.Range("A1").Value = "Привет" End Sub

Не везде Activate лишний
Но есть и такие свойства и методы, которые требуют обязательной активации книги/листа. Одним из таких свойств является свойство окна FreezePanes(Закрепление областей):

Sub Freeze_Panes() ThisWorkbook.Activate Sheets(2).Activate Range("B2").Select ActiveWindow.FreezePanes = True End Sub

В этом коде нельзя убирать Select и Activate, т.к. свойство FreezePanes применяется исключительно к активному листу и активной ячейке, потому что является оно именно методом окна, а не листа или ячейки.
Так же сюда можно отнести свойства: Split, SplitColumn, SplitHorizontal и им подобные. Иными словами все свойства, которые работают исключительно с активным окном приложения, а не с объектами напрямую.

Язык VBA позволяет писать макросы в Excel. Как это делать рассматривается ниже.

Application

Application — это объект, занимающий вершину иерархии объектов в Excel. Application – это и есть Excel. Вот примеры использования Application:

окно нормальных размеров

окно максимальных размеров

Workbooks

Workbooks — это коллекция рабочих книг, которые открыты. Каждая рабочая книга представлена объектом Workbook. Узнать сколько рабочих книг сейчас в коллекции можно так:

Обатиться к нужной рабочей книге в коллекции Workbooks можно обратиться по его номеру или по имени:

здесь мы активизировали второй элемент коллекции Workbooks.

Другие примеры мы увидим ниже.

Workbook

Workbook — это рабочая книга.

Сохранить рабочую книгу:

И где же в этом примере рабочая книга Workbook? Здесь: Workbooks.Item(1), это выражение возвращает первый элемент коллекции Workbooks, а это и есть Workbook.

Закрыть рабочую книгу:

Sheets

Sheets — это все листы рабочей книги. Листы рабочей книги представлены двумя типами: рабочие листы — это обычные листы Excel и второй тип — это листы диаграмм. Те и другие и составляют коллекцию Sheets.

Charts

Charts — это только диаграммы рабочей книги.

Chart

Chart — это объект, представляющий одину диаграмму. Если диаграмма содержится в обычном рабочем листе, то она объектом Chart не является.

Worksheets

Worksheets — это только рабочие листы рабочей книги.

Добавим рабочий лист в коллекцию Worksheets:

Worksheet

Worksheet — это один лист рабочей книги Excel.

Все ячейки рабочего листа Worksheet:

Range. Работа с ячейками в Excel

Закройте окно свойств кнопки, и кликаем по нашей кнопке правой кнопкой мыши, из выпавшего меню выбираем «Исходный текст». Открывается окно редактора VBA, оно называется Microsoft Visual Basic. В нём уже есть заготовка обработчика нажатия на кнопку CommandButton:

Кстати, помотрите на эту заготовку, ключевое слово Sub говорит, что это процедура, а слово Private указывает, что эта процедура видна лишь в данном модуле.

Всё у нас готово для начала изучения работы с ячейками рабочего листа Excel.

Как задать активную ячейку?

Сделаем активной ячейку A2:A2:

Java

Выделим любую другую ячейу и нажимём на кнопку Range Test. Вновь выделится ячейка «А2». Это значит, что обработчик нажатия на кнопку работает исправно.

Как выделить ряд ячеек?

Выделим интервал ячеек «A2:D2». Вносим в нашу заготовку макроса новый код:

Java

Как установить значение в ячейку?


Активная ячейка означает конкретную ячейку, которая активна в текущей активной рабочей таблице. Например, если на листе 2 выбрана ячейка B4, это означает, что активной ячейкой является лист B4 на листе 2. В VBA мы используем ссылку на активную ячейку для изменения свойств или значений активной ячейки. ИЛИ мы используем эту функцию в определенных ситуациях, когда нам нужно внести некоторые изменения в активную ячейку в некоторых определенных условиях, которые отвечают требованиям.

Активная ячейка является собственностью в VBA. Мы используем его в разных ситуациях в VBA. Мы можем присвоить значения активной ячейке, используя функцию активной ячейки VBA, или получить адрес активной ячейки. Что вернули эти функции? Функция активной ячейки возвращает свойство диапазона активной ячейки в активной рабочей таблице. Как объяснено в приведенном выше утверждении в определении, если лист 2 активен, а ячейка B4 является активной ячейкой, функция активной ячейки в VBA извлекает свойства диапазона ячейки B4 на листе 2.

Синтаксис активной ячейки в Excel VBA

Ниже приведен синтаксис Active Cell в Excel VBA


Синтаксис используется для присвоения определенного значения активной ячейке.

Синтаксис выберет значение или свойство активной ячейки в активной рабочей таблице.

Если нам нужно изменить шрифт активной ячейки, то синтаксис будет следующим

Мы также можем отобразить строки и столбец активной ячейки, используя следующий синтаксис

Давайте используем синтаксис, описанный в нескольких примерах, и научимся играть с активными ячейками.

Примечание: Для того, чтобы использовать VBA убедитесь, что на вкладке разработчика включен в закладке Файл из раздела настроек.

Примеры активной ячейки Excel VBA

Ниже приведены различные примеры активной ячейки VBA в Excel:

Вы можете скачать этот шаблон VBA Active Cell Excel здесь - Шаблон VBA Active Cell Excel

VBA Active Cell - Пример № 1

В этом примере мы хотим изменить значение текущей ячейки на какую-то ячейку. Например, на листе 1 выберите ячейку A2 и вставьте значение как ANAND, и мы хотим изменить значение для этой активной ячейки как ARAN.

Выполните следующие шаги, чтобы использовать VBA Active Cell в Excel.

Шаг 1: Перейдите на вкладку разработчика и нажмите на Visual Basic, чтобы открыть VB Editor.


Шаг 2: Нажмите на вкладку «Вставка» и нажмите на модули, чтобы вставить новый модуль.


Шаг 3: Объявите подфункцию, чтобы начать писать код.

Код:


Шаг 4: Активируйте рабочий лист 1 с помощью функции ниже.

Код:


Шаг 5: Мы можем проверить, что в ячейке A2 на листе 1 у нас есть значение как ANAND, и это активная ячейка.


Шаг 6: Теперь используйте следующую инструкцию, чтобы изменить значение активной ячейки.

Код:


Шаг 7: Запустите приведенный выше код с помощью кнопки запуска или нажмите F5.

Мы видим, что значение в ячейке A2 было изменено.

VBA Active Cell - Пример № 2

Теперь мы изменили значение активной ячейки с ANAND на ARAN. Как мы отображаем текущее значение активной ячейки? Об этом мы узнаем в этом примере.

Выполните следующие шаги, чтобы использовать VBA Active Cell в Excel.

Шаг 1: Перейдите на вкладку разработчика и нажмите Visual Basic, чтобы открыть редактор VB.

Шаг 2: В том же самом модуле объявить подфункцию, чтобы начать писать код.

Код:


Шаг 3: Активируйте лист 1 с помощью следующего кода.

Код:


Шаг 4: Теперь давайте выберем активную ячейку с помощью следующего кода.

Код:


Шаг 5: Теперь давайте отобразим значение выбранной ячейки с помощью следующего кода.

Код:


Шаг 6: Запустите приведенный выше код, нажав клавишу F5 или предоставленную кнопку запуска, и просмотрите следующий результат.

Активная ячейка была A2 и имеет значение ARAN, поэтому отображаемое свойство - ARAN.

VBA Active Cell - Пример № 3

Давайте изменим шрифт ячейки A2, которая была выбранной ячейкой. Давайте сделаем шрифт как жирный. Изначально не было выбрано ни одного шрифта.

Для этого выполните следующие действия, чтобы использовать VBA Active Cell в Excel.

Шаг 1: Перейдите на вкладку разработчика и нажмите Visual Basic, чтобы открыть VB Editor.

Шаг 2: В том же модуле объявите подфункцию, чтобы начать писать код.

Код:


Шаг 3: Давайте сначала активируем рабочий лист, чтобы использовать активную ячейку.

Код:


Шаг 4: Давайте изменим шрифт выбранной ячейки следующим кодом.

Код:


Шаг 5: Запустите приведенный выше код, нажав клавишу F5 или предоставленную кнопку запуска, и посмотрите результат.

Шрифт активной ячейки изменяется на BOLD.

VBA Active Cell - Пример № 4

Теперь мы хотим знать, в какой строке или в каком столбце находится текущая активная ячейка. Как это сделать, мы узнаем в этом примере.

Для этого выполните следующие действия, чтобы использовать VBA Active Cell в Excel.

Шаг 1: Перейдите на вкладку разработчика и нажмите на Visual Basic, чтобы открыть VB Editor.

Шаг 2: В том же модуле объявите подфункцию, чтобы начать писать код.

Код:


Шаг 3: Давайте сначала активируем рабочий лист, чтобы использовать свойства активной ячейки.

Код:


Шаг 4: Теперь мы выбираем активную ячейку с помощью следующего кода.

Код:


Шаг 5: Теперь мы можем отобразить текущую строку активной ячейки с помощью следующего кода.

Код:


Шаг 6: Мы также можем получить текущий столбец активной ячейки с помощью следующего кода.

Код:


Шаг 7: Теперь нажмите F5 или кнопку запуска, чтобы запустить приведенный выше код и увидеть следующий результат.

Вышеуказанным результатом была строка активной ячейки. Нажмите ОК, чтобы увидеть столбец активной ячейки.

То, что нужно запомнить

Есть несколько вещей, которые мы должны помнить об активной ячейке в VBA:

  • Активная ячейка - это текущая или выбранная ячейка на любом листе.
  • Мы можем отобразить или изменить свойства активного адреса ячейки в VBA.
  • Чтобы использовать свойства активной ячейки, мы должны сначала активировать текущую рабочую таблицу.

Рекомендуемые статьи

Это было руководство по Excel VBA Active Cell. Здесь мы обсудили, как использовать свойство VBA Active Cell для присвоения значения или получения адреса активной ячейки в Excel, а также некоторые практические примеры и загружаемый шаблон Excel. Вы также можете просмотреть наши другие предлагаемые статьи -

Здравствуйте. Googl меня не понимает, может вы подскажите?

Есть форма календарь, которая запускается кнопкой.

При выборе даты в календаре, заполняется активная ячейка листа, а нужно что бы дата вставлялась в определенную.

Можно в продцедуре календаря изменить

но на листе несколько ячеек, в которые нужно вставлять разные даты.

Поскольку календарь вызывается кнопкой, то мне кажется логичным сделать несколько кнопок (для каждой ячейки с датой своя), которые будут вызывать одну и ту же форму календаря, но при этом активировать нужную ячейку, в которую будет вставлена дата с формы календаря.

Отображение формы запускается так

в этот макрос нужно добавить строку, которая будет активировать нужную ячейку.

Excel VBA: Приёмы программирования

Как определить адрес активной ячейки.

Q: Как в макросе узнать и использовать текущее положение курсора (не мышиного, естественно)?

A:Очень просто! 🙂 ActiveCell.Row и ActiveCell.Column — покажут координаты активной ячейки.

можно использовать BB-коды

Максимальная длина комментария — 4000 символов.

Чтобы оставить комментарий, необходимо авторизоваться. Можно ввести логин и пароль, или авторизоваться через социальные сети.

17 апреля 2013 года

17 апреля 2013, 22:49:22

Спасибо, освежило память))

28 сентября 2010 года




28 сентября 2010, 16:25:13

А не проще ли использовать — ActiveCell.Address или Activecell.AddressLocal?

Обращение к ячейке на листе Excel из кода VBA. Запись информации в ячейку. Чтение информации из ячейки. Очистка значения ячейки. Метод ClearContents объекта Range.

  1. Обращение к ячейке
  2. Запись информации в ячейку
  3. Чтение информации из ячейки
  4. Очистка значения ячейки

Обращение к ячейке

Допустим, у нас есть два открытых файла: «Книга1» и «Книга2», причем, файл «Книга1» активен и в нем находится исполняемый код VBA.

В общем случае при обращении к ячейке неактивной рабочей книги «Книга2» из кода файла «Книга1» прописывается полный путь:

Удобнее обращаться к ячейке через свойство рабочего листа Cells(номер строки, номер столбца), так как вместо номеров строк и столбцов можно использовать переменные. Обратите внимание, что при обращении к любой рабочей книге, она должна быть открыта, иначе произойдет ошибка. Закрытую книгу перед обращением к ней необходимо открыть.

Теперь предположим, что у нас в активной книге «Книга1» активны «Лист1» и ячейка на нем «A1». Тогда обращение к ячейке «A1» можно записать следующим образом:

Точно также можно обращаться и к другим ячейкам активного рабочего листа, кроме обращения ActiveCell, так как активной может быть только одна ячейка, в нашем примере — это ячейка «A1».

Если мы обращаемся к ячейке на неактивном листе активной рабочей книги, тогда необходимо указать этот лист:

Кроме того к ячейке на рабочем листе можно обращаться по ее индексу (порядковому номеру), который считается по расположению ячейки на листе слева-направо и сверху-вниз. Например, индекс ячеек в первой строке равен номеру столбца. Индекс ячеек во второй строке равен количеству ячеек в первой строке (которое равно общему количеству столбцов на листе — зависит от версии Excel) плюс номер столбца. Индекс ячеек в третьей строке равен количеству ячеек в двух первых строках плюс номер столбца. И так далее. Для примера, Cells(4) та же ячейка, что и Cells(1, 4). Используется такое обозначение редко, тем более, что у разных версий Excel может быть разным количество столбцов и строк на рабочем листе.

Запись информации в ячейку

Содержание ячейки определяется ее свойством — «Value», которое в VBA Excel является свойством по умолчанию и его можно явно не указывать. Записывается информация в ячейку при помощи оператора присваивания «=»:

Вместе с числами и текстом можно использовать переменные. Примеры здесь и ниже приведены для активного листа. Для неактивных листов дополнительно необходимо указывать имя листа, как в разделе «Обращение к ячейке».

Чтение информации из ячейки

Считать информацию из ячейки в переменную можно также при помощи оператора присваивания «=»:

Точно также можно обмениваться информацией между ячейками:

Очистка значения ячейки

Очищается ячейка от значения с помощью метода ClearContents. Кроме того, можно присвоить ячейке значение нуля или пустой строки:

Читайте также: