Инструкция worksheets лист2 select используется для

Хитрости »

26 Июль 2015              77955 просмотров


Все начинающие изучать 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»:
VBA error 9 - 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» слово «Привет», потом делает жирным шрифт и назначает желтый цвет заливке. Убираем активацию книги, листа и ячейки, заменив их прямым обращением:

Workbooks("Книга3").Sheets("Лист3").Range("C7").FormulaR1C1 = "Привет"

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

Workbooks("Книга3").Sheets("Лист3").Range("C7").Font.Bold = True

и цвет заливки:

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.

Важный момент: лучше всегда указать имя книги вместе с расширением(.xlsx, xlsm, .xls и т.д.). Если в настройках ОС Windows(Панель управленияПараметры папок -вкладка ВидСкрывать расширения для зарегистрированных типов файлов) указано скрывать расширения — то указывать расширение не обязательно — Workbooks(«Книга2»). Но и ошибки не будет, если его указать. Однако, если пункт «Скрывать расширения для зарегистрированных типов файлов» отключен, то указание Workbooks(«Книга2») обязательно приведет к ошибке.

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

ActiveWorkbook.Sheets("Лист3").Range("A1").Value = "Привет"

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

ThisWorkbook.Sheets("Лист3").Range("A1").Value = "Привет"

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
Что такое переменная и как правильно её объявить?


Статья помогла? Поделись ссылкой с друзьями!

  Плейлист   Видеоуроки


Поиск по меткам



Access
apple watch
Multex
Power Query и Power BI
VBA управление кодами
Бесплатные надстройки
Дата и время
Записки
ИП
Надстройки
Печать
Политика Конфиденциальности
Почта
Программы
Работа с приложениями
Разработка приложений
Росстат
Тренинги и вебинары
Финансовые
Форматирование
Функции Excel
акции MulTEx
ссылки
статистика

Excel VBA Worksheets

Excel is a workbook. In that workbook, it contains worksheets or sheets. Understanding the concept of Worksheets in VBA is important because we all work with worksheets. In a normal Excel file, we call it sheets, but in VBA terminology, it is called a “Worksheet.” All the collections of a worksheet are called “Worksheets.”

In VBA, a Worksheet is an object. Therefore, there are two ways of referring to the worksheet, one using the “Worksheet” object and another using the “Sheets” object.

We know your question is what the difference between them is. We can see two sheets in Excel: regular worksheets and chart sheets.

The “worksheet” tab in excel considers only the worksheets in the workbook except for chart sheets. On the other hand, “Sheets” considers all the worksheets in the workbook, including the chart sheet. For example, look at the below image.

Worksheets name

In the above, we have a total of 5 sheets. Of these 5 sheets, 3 are worksheets, and 2 are chart sheets.

Here, the “Worksheet” count is 3, and the “Sheets” count is 2.

Now, look at the below image.

Worksheets sheets

All the sheets are worksheets, so the count of both “Worksheets” and “Sheets” is 3.

So, as part of the code, if you want to use worksheets, and objects, remember this point.

Table of contents
  • Excel VBA Worksheets
    • Syntax of VBA Worksheets
    • How to use Worksheets Object in VBA?
      • Example #1
      • Example #2 – Select Worksheets by Name
      • Example #3 – Problem with Worksheet Name
      • Example #4 – Get the Count of Total Sheets in the Workbook
      • Example #5 – Methods Using Worksheet Object
    • Recommended Articles

Syntax of VBA Worksheets

As we said, the worksheet is an object variable. However, this has syntax too.

Worksheets syntax

The index is nothing that is the worksheet number we are referring to. However, as you can see in the end, it is referred to as an Object.

For example, Worksheet(1).Select means to select the first worksheet of the workbook. It doesn’t matter what the worksheet’s name is; whatever the worksheet inserted first in the workbook will be selected.

We can also refer to the worksheet by its name. We need to mention the complete as it is a worksheet name in double quotes.

For example, Worksheet(“Sales Sheet”).Select means select the sheet named “Sales Sheet.” Here it doesn’t matter what the number of the worksheet it always selects is.

How to use Worksheets Object in VBA?

You can download this VBA Worksheet Object Template here – VBA Worksheet Object Template

Example #1

Assume you have a total of 5 sheets in your workbook. The name of those worksheets is “Worksheet 1”, “Worksheet 2”, “Worksheet 3”, “Chart Sheet 1”, and “Chart Sheet 2.”

VBA Worksheets Example 1

If we use the numbering to select the worksheet, then we can use the number as the worksheet reference.

Worksheet(2). Select means it will select the second worksheet of the workbook.

Code:

Sub Worksheet_Example1()

  Worksheets(2).Select

End Sub

VBA Worksheets Example 1-1

We will run this code using the F5 key or manually and see the result.

VBA Worksheets Example 1-2

Now, we will change the sheet number to 3.

Code:

Sub Worksheet_Example1()

  Worksheets(3).Select

End Sub

VBA Worksheets Example 1-3

Now, see what happens when you run the code manually or using the F5 key code.

VBA Worksheets Example 1-4

If you look at the above image, it selected the 4th worksheet when we asked to select the 3rd one.

That is because we have used the Worksheet object, not the Sheets object. As we told earlier, the “Worksheets” object considers only worksheets, not chart sheets.

Use the Sheets object to select the third sheet of all the sheets in the workbook.

Code:

Sub Worksheet_Example1()

Sheets(3).Select

End Sub

VBA Worksheets Example 1-5

Now, it will select the exact third sheet.

VBA Worksheets Example 1-6

Example #2 – Select Worksheets by Name

Selecting the sheets by their name is an accurate way of referring to the sheet. For example, if we want to select the sheet “Worksheet 3,” you can use the code below.

Code:

Sub Worksheet_Example2()

   Worksheets("Worksheet 3").Select

End Sub

VBA Worksheets Example 2

It will select the exact sheet. It doesn’t matter where placed in the workbook.

VBA Worksheets Example 2-1

But if you try to access the chart sheet with the “Worksheets” object, we will get a “Subscript out of range errorSubscript out of range is an error in VBA that occurs when we attempt to reference something or a variable that does not exist in the code. For example, if we do not have a variable named x but use the msgbox function on x, we will receive a subscript out of range error.read more.”

Code:

Sub Worksheet_Example2()

  Worksheets("Chart Sheet 1").Select

End Sub

VBA Worksheets Example 2-2

Run this code through the F5 key or manually and see the result.

VBA Worksheets Example 2-3

Example #3 – Problem with Worksheet Name

There is one more problem with referring to the sheets by their name. If someone changes the worksheet’s name, we will get the “Subscript out of range error.”

To solve this issue go to the basic visual editor by pressing the ALT + F11 key.

Example 3-1

Select the sheet name and press the F4 key to see the “Properties” window.

Example 3

The window changes the worksheet’s name to your name in these properties.

Example 3-2

One interesting thing is that even though we have changed the worksheet’s name from “Worksheet 1” to “WS1,” we can still see the same name in the workbook.

VBA Worksheets Example 3-3

Now, we can refer to this sheet by the “WS1” name.

Code:

Sub Worksheet_Example2()
 
  Worksheets("WS1").Select

End Sub

VBA Worksheets Example 3-4

Now, it doesn’t matter who changes the name of the worksheet. Still, our code refers to the same sheet as long as it is not changing in the Visual Basic Editor.

Example #4 – Get the Count of Total Sheets in the Workbook

A worksheet is an object. We can use all the properties and methods associated with it. So what do we do with worksheets?

We insert worksheets. We rename worksheets. We delete worksheets and many other things we do with them.

Enter the object “Worksheets” and put a dot to see all the options with them.

Example 4

To get the count of the worksheets, use VBA Count PropertyThe count function in VBA counts how many cells have values in them. Cells with numbers or text enclosed in double quotes are counted, as are those whose values are typed directly. However, cells that contain random data that Excel is unable to translate are not counted.read more.

Code:

Sub Worksheet_Example3()

  Dim i As Long

  i = Worksheets.Count

  MsgBox i

End Sub

Example 4-1

It will show the count of the worksheets.

VBA Worksheets Example 4-2-2

Example 4-3

Even though there are 5 sheets, we got the count as 3 because the other 2 sheets are chart sheets.

To get the overall count of sheets, use the “Sheets” object.

Code:

Sub Worksheet_Example3()

  Dim i As Long

  i = Sheets.Count

  MsgBox i

End Sub

VBA Worksheets Example 4-4

It will show the full count of the sheets.

VBA Worksheets Example 4-5

Example 4-3

Example #5 – Methods Using Worksheet Object

After entering the worksheet object, we can access all the associated properties and objects. For example, we can add a new sheet. We can delete, etc.

To Add New Sheet.

Worksheet.Add

To Delete Worksheet

Worksheet(“Sheet Name”).Delete

To Change the Name of the Worksheet

Worksheet(“Sheet Name”).Name = “New Name”

Recommended Articles

This article has been a guide to VBA Worksheets. Here, we learn how to use the VBA Worksheet object to find, select, and get the count of total worksheets in Excel, along with some simple to advanced examples. Below are some useful Excel articles related to VBA: –

  • GetObject in VBA
  • VBA Delete All Excel Files
  • Excel VBA Worksheet Function
  • VBA New Line

This Excel VBA tutorial explains how to use Worksheet.Select Method to select a single worksheet or multiple worksheets.

When you click on a worksheet tab, the worksheet is highlighted.

To select multiple worksheets, you can hold down Ctrl and then left click the mouse on each worksheet tab.

Excel Assign Page Number 01

To select all worksheets at once, right click on one of the sheet, and then click on Select All Sheets

Excel select multiple worksheets 01

One practical use of selecting multiple worksheets is to print selected worksheets.

In this tutorial, I will explain how to perform the same tasks in the above scenarios using Excel VBA Worksheet.Select Method.

Excel VBA Worksheet.Select Method

In Excel VBA, it is not necessary to select worksheets in order to run a Macro on selected worksheets, because you can use VBA to loop through worksheets with specific name.

Syntax of Worksheet.Select Method

Worksheet.Select(Replace)
Name Required/Optional Data Type Description
Replace Optional Variant (used only with sheets). True to replace the current selection with the specified object. False to extend the current selection to include any previously selected objects and the specified object.

Example 1 – Select a single worksheet

To select Sheet1 only

Sheets("Sheet1").Select

Example 2 – Select multiple worksheets

To select Sheet1 and Sheet2, use the False Property in Sheet2

you can also add the False argument for the first Worksheet

Sheets("Sheet1").Select False
Sheets("Sheet2").Select False

Excel VBA Worksheet.Select Method to select multiple worksheets 01

Example 3 – Select all worksheets in the workbook

The below example selects all worksheets in current workbook

Public Sub selectAllWS()
   For Each ws In ThisWorkbook.Sheets
      ws.Select flase
   Next
End Sub

Excel VBA Worksheet.Select Method to select worksheets 02

After you have selected all worksheets, you can deselect them by selecting anyone of the worksheet. To avoid specifying which worksheet, I use ActiveSheet in the below example.

In multiple selection, ActiveSheet refers to the first selected worksheet.

Public Sub deselectWS()
   ActiveSheet.Select
End Sub

You can also select multiple worksheets using Array.

Outbound References

https://msdn.microsoft.com/en-us/library/office/ff194988.aspx

Свойство Selection объекта Application, которое применяется в VBA для возвращения выбранного объекта на активном листе в активном окне приложения Excel.

Свойство Selection объекта Application возвращает выбранный в настоящее время объект на активном листе в активном окне приложения Excel. Если объект не выбран, возвращается значение Nothing.

Если выделить на рабочем листе диапазон «B2:E6», то обратиться к нему из кода VBA Excel можно через свойство Selection объекта Application, например, присвоить выбранный диапазон объектной переменной:

Sub Primer1()

Dim myRange As Object

    Set myRange = Selection

    MsgBox myRange.Address

End Sub

При использовании свойства Selection в коде VBA Excel указывать объект Application не обязательно. Результат работы кода:

На рабочем листе Excel может быть выбран не только диапазон ячеек, но и другие объекты: рисунок, надпись, диаграмма, элемент управления формы и другие.

Применение функции TypeName

Для программного выбора объекта в VBA Excel используется метод Select, а для определения типа ранее выбранного объекта — функция TypeName.

TypeName — это функция, которая возвращает данные типа String, предоставляющие информацию о типе переменной или типе объекта, присвоенного объектной переменной.

Выберем диапазон «D5:K9» методом Select и определим тип данных выбранного объекта с помощью функции TypeName:

Sub Primer2()

    Range(«D5:K9»).Select

    MsgBox TypeName(Selection)

End Sub

В качестве переменной для функции TypeName здесь используется свойство Selection. Результат работы кода:

Следующий пример кода VBA Excel очень хорошо иллюстрирует определение типа выбранного объекта с помощью функции TypeName. Он взят с сайта разработчиков, только в блок Select Case добавлены еще два элемента Case:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

Sub TestSelection()

    Dim str As String

    Select Case TypeName(Selection)

        Case «Nothing»

            str = «Объект не выбран.»

        Case «Range»

            str = «Выбран диапазон: « & Selection.Address

        Case «Picture»

            str = «Выбран рисунок.»

        Case «ChartArea»

            str = «Выбрана диаграмма.»

        Case «TextBox»

            str = «Выбрана надпись.»

        Case Else

            str = «Выбран объект: « & TypeName(Selection) & «.»

    End Select

    MsgBox str

End Sub

Если из предыдущей процедуры VBA Excel удалить переводы отдельных типов объектов и учесть, что рабочий лист без выбранного объекта встречается редко, то ее можно значительно упростить:

Sub TestSelection2()

    MsgBox «Выбран объект: « & TypeName(Selection) & «.»

End Sub

Пример рабочего листа без выбранного объекта: лист диаграммы, на котором диаграмма не выбрана (выделение снимается кликом по одному из полей вокруг диаграммы). Для такого листа в информационном окне MsgBox будет выведено сообщение: Выбран объект: Nothing.

Свойство Selection при выборе листа

Если метод Select применить к рабочему листу, то свойство Application.Selection возвратит объект, который ранее был выбран на данном листе. Проверить это можно с помощью следующего примера:

Sub Primer3()

    Worksheets(3).Select

    Select Case TypeName(Selection)

        Case «Range»

            MsgBox «Выбран диапазон: « & Selection.Address

        Case Else

            MsgBox «Выбран объект: « & TypeName(Selection) & «.»

    End Select

End Sub

Свойство Selection при выборе книги

Выбрать рабочую книгу Excel методом Select невозможно, так как у объекта Workbook в VBA нет такого метода. Но мы можем выбрать книгу, сделав ее активной с помощью метода Activate:

Sub Primer4()

    Workbooks(«Книга2.xlsx»).Activate

    Select Case TypeName(Selection)

        Case «Range»

            MsgBox «Выбран диапазон: « & Selection.Address

        Case Else

            MsgBox «Выбран объект: « & TypeName(Selection) & «.»

    End Select

End Sub

В данном случае, свойство Application.Selection возвратит объект, который ранее был выбран на активном листе активированной книги.

Обычно, свойство Application.Selection используется для работы с выделенным диапазоном ячеек, а для обращения к одной активной ячейке используется свойство Application.ActiveCell.


Bottom line: Learn the difference between these two commonly used methods in VBA.

Skill level: Intermediate

One question I hear often from new members of our VBA Pro Course is, “What’s the difference between Select and Activate? It seems like they do the same thing?”

Select vs Activate in VBA for Excel

The short answer is that Select and Activate can perform the same action, but the differences are:

  • Select can be used to select multiple objects (sheets, ranges, shapes, etc.) at the same time.
  • Activate can be used to active one object within the selection.

Let’s take a look at an example to see how this works.

Which Method Should I Use?

First, it’s important to note that both methods can be used on many different types of objects in Excel. This includes sheets, ranges, cells, shapes, charts, slicers, etc. We’ll use worksheets in this example.

The use case for each method depends on the scenario. And as I explain below, it’s usually best to use neither. 😲

When to use the Select Method

The Select method is typically the one we’re most familiar with because the macro recorder uses it when generating code.

Select allows us to select a single object OR multiple objects.

The following line of VBA code selects a single worksheet.

  Worksheets("Sheet2").Select

We can also use Select to select multiple objects. Here is an example of selecting multiple ranges.

Range("A1:B10,D1:F10,J1:K10").Select

Here is an example of selecting multiple sheets. The Array function is used to reference the sheets. This same technique can be used for shapes.

  Worksheets(Array("Sheet2", "Sheet3", "Sheet5")).Select

When that line of code is run, the first item in the array is activated. That means that Sheet2 will be the active sheet that the user sees.

VBA Select Method First Object in Array is Active

What if we want to keep the three sheets selected, but have the user view Sheet3 instead? This is where the Activate method comes into play.

When to use the Activate Method

The Activate method allows us to select a single object. This can be a single object within a selection, if multiple objects are already selected.

The following lines would select the three sheets, then make Sheet3 the active sheet that the user sees.

Worksheets(Array("Sheet2", "Sheet3", "Sheet5")).Select

Worksheets("Sheet3").Activate

VBA Active vs Select Methods Multiple Sheets Selected

If you do not have a group of objects selected, then Activate will just select a single object. It does NOT add to the current selection and will work the same way that Select works.

Be Careful with Activate

You might not always know which objects are selected in the workbook. Therefore, you can’t always use Activate to select a single object.

For example, let’s say you have a line of code in your macro to activate Sheet1.

If the user has Sheet1 to Sheet3 selected before the macro is runs, then all three sheets will remain selected. You might not want this if your next line of code modifies a cell on Sheet1. Depending on how the code is written, all three sheets could be modified, causing unwanted results. 😬

If you activate an object that is NOT in the selection, then that single object will be selected and the previously selected objects will no longer be selected. For example, if the user has Sheet1 to Sheet3 selected and your code activates Sheet4, then only Sheet4 will be selected.

The main takeaway here is that there are a lot of potential unwanted outcomes when using Activate to select a single object. So, it’s best to use Select for selecting single objects.

Activate for Workbooks

The Activate method is also used when activating Workbooks and Windows. There is no Select method for these objects.

ThisWorkbook.Activate

Workbooks("Book3.xlsx").Activate

Windows("Book3.xlsx").Activate

Avoid Select and Activate Whenever Possible

It’s great to know the difference between these two methods, but you might not need them as often as you think. Especially if you are just starting out with VBA and using the macro recorder a lot.

The macro recorder code contains a lot of lines with the Select method because it is generating code for every action we take. However, we do NOT need to select an object before we take actions on it. This can slow down our code and make it more prone to errors.

The Select Method is Like Using a TV without a Remote Control

Here is an article on How to Avoid the Select Method in VBA & Why that explains more.

Conclusion

It’s best to use Select when you want to select a single object or multiple objects. Activate should be used when you want to activate (view/select) an object within an existing selection. Activate is also used to select Workbooks, as there is not Select method for that object.

Did I miss anything? Please leave a comment below with questions or suggestions. Thank you! 🙂

Понравилась статья? Поделить с друзьями:
  • Скачать мануал тойота рав 4 3 поколения
  • Эвгетин инструкция по применению в стоматологии
  • Люберецкое ово руководство
  • Как собрать шар из змейки рубика пошаговая инструкция
  • Ацикловир таблетки 400 мг инструкция по применению взрослым при герпесе