VBA Excel
242 subscribers
88 photos
23 links
VBA Excel для начинающих. Справка по VBA Excel. Visual Basic for Applications. Справочник. Самоучитель.
Download Telegram
Арифметические операторы

#АрифметическиеОператоры #Операторы

Список арифметических операторов:
Приоритет арифметических операторов

Приоритет определяет очередность выполнения математических операторов в одном выражении. Очередность выполнения арифметических операторов в VBA Excel следующая:

1️⃣ «^» – возведение в степень;
2️⃣ «–» – отрицание;
3️⃣ «*» и «/» – умножение и деление;
4️⃣ «\» – целочисленное деление;
5️⃣ «Mod» – остаток от деления двух чисел;
6️⃣ «+» и «–» – сложение и вычитание.

1) Если умножение и деление выполняются в одном выражении, то каждая такая операция выполняется слева направо в порядке их следования.
2) Если сложение и вычитание выполняются в одном выражении, то каждая такая операция выполняется слева направо в порядке их следования.

Для переопределения приоритета выполнения математических операторов в VBA Excel используются круглые скобки. Сначала выполняются арифметические операторы внутри скобок, затем — операторы вне скобок. Внутри скобок приоритет операторов сохраняется.
a = 3 ^ 2 + 1 'a = 10
a = 3 ^ (2 + 1) 'a = 27
a = 3 ^ (2 + 1 * -2) 'a = 1


#VBA #ExcelVBA #ЦелочисленноеДеление #Mod
Особенности операторов «\» и «Mod»

Перед вычислением целочисленного результата или остатка от деления двух чисел делимое и делитель округляются. Причем, используется бухгалтерское округление:
-3.5 => -4
-2.5 => -2
-1.5 => -2
-0.5 => 0
0.5 => 0
1.5 => 2
2.5 => 2
3.5 => 4

Следующие строки вызовут ошибку «Division by zero» («Деление на ноль»):
a = 3 Mod 0.5
a = 3 \ (2 - 2.5)


Чтобы избежать ошибок, когда требуется общепринятое математическое округление, округляйте делитель и делимое с помощью оператора WorksheetFunction.Round.
Свойство ActiveCell

Свойство ActiveCell - это самый простой способ обратиться к активной ячейке.

Свойство ActiveCell объекта Application возвращает объект Range, представляющий активную ячейку на активном листе в активном или указанном окне приложения Excel. Если окно не отображает лист, применение свойства Application.ActiveCell приведет к ошибке.

Если свойство ActiveCell применяется к активному окну приложения Excel, то идентификатор объекта (Application или ActiveWindow) можно в коде VBA Excel не указывать. Следующие выражения, скопированные с сайта разработчиков, являются эквивалентными:
ActiveCell
Application.ActiveCell
ActiveWindow.ActiveCell
Application.ActiveWindow.ActiveCell


Но если нам необходимо обратиться к активной ячейке, находящейся в неактивном окне приложения Excel, тогда без указания идентификатора объекта на обойтись:
Sub Primer1()
    With Windows("Книга2.xlsx")
        .ActiveCell = 325
        MsgBox .ActiveCell.Address
        MsgBox .ActiveCell.Value
    End With
End Sub


Программно сделать ячейку активной в VBA Excel можно с помощью методов Activate и Select:
Range("E6").Select
Range("D4").Activate


#АктивнаяЯчейка #ВыбраннаяЯчейка #ActiveCell #Activate #Select
Объект Range

Определение и обращение

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

Обращение к заданному диапазону:
' Способы выделения диапазона ячеек E5:H11
Range("E5:H11").Select
Range(Cells(5, 5), Cells(11, 8)).Select
Range(Cells(5, "E"), Cells(11, "H")).Select
Range([E5], [H11]).Select


Обращение ко всему диапазону рабочего листа в версии Excel 16.0:
' Выделение диапазона всего рабочего листа
ActiveSheet.Cells.Select
Cells.Select
Range(Cells(1), Cells(17179869184#)).Select
Range(Cells(1, 1), Cells(1048576, 16384)).Select
' 17179869184 - количество ячеек на листе Excel 16.0
' 1048576 - количество строк на листе Excel 16.0
' 16384 - количество столбцов на листе Excel 16.0


#VBA #ExcelVBA #Range #Диапазон #Ячейка
Сочетание клавиш Alt + F11

У меня в Windows 11 (версия Excel 16.0) не работает сочетание клавиш Alt + F11, которое должно открывать редактор VBA. Все необходимые разрешения включены (макросы, доступ к объектной модели проекта VBA).

Единственное решение, которое мне удалось найти: переустановить Microsoft Office по специальной инструкции разработчиков.

Проверять не стал, открываю редактор VBA кнопкой на ленте.

#VBA #ExcelVBA #AltF11
😱1
Курьезы с Error: Overflow

Запускаем следующую процедуру:
Sub test1()
Debug.Print 1048576 * 16384
End Sub


Получаем следующий результат:

#VBA #ExcelVBA #Error #Overflow
Следующие выражения работают правильно:
Sub test2()
Debug.Print 1048576 * 1638.4 * 10
Debug.Print 1048576 * 16384#
Debug.Print 1048576 * CSng(16384)
Debug.Print 1048576 * CDbl(16384)
Debug.Print 1048576 * CLngLng(16384)
End Sub


У разработчиков есть небольшая статья на эту тему: Overflow (Error 6).

Объяснение курьеза:

В произведении 1048576 * 16384 VBA определяет по наибольшему числу тип данных: 1048576 соответствует типу данных Long. Соответственно, для результата вычислений также предоставляется память типа Long, а результат произведения - 17179869184 - превышает диапазон значений Long. Вот и получается: Error 6 Overflow.

В строке 1048576 * 1638.4 * 10 дробное число 1638.4 соответствует типу данных Single, поэтому VBA для результата вычислений выделяет память с диапазоном значений Single. В других строках мы явно указываем тип данных числа 16384.
И еще один пример с Error 6 Overflow:
Debug.Print ActiveSheet.Cells.Count ' Error: Overflow
Debug.Print ActiveSheet.Cells.CountLarge ' 17179869184


#VBA #ExcelVBA #Error #Overflow #Count #CountLarge
🔥 Свойство Value объекта Range

Range.Value – одно из самых часто используемых свойств. Оно позволяет получать или задавать значение ячейки или диапазона.

📌 Примеры:

1️⃣ Записать значение в ячейку:
Range("A1").Value = "Привет, VBA!"  


2️⃣ Прочитать значение ячейки и вывести в MsgBox:
MsgBox Range("A1").Value  


3️⃣ Присвоить значение переменной:
Dim myValue As String  
myValue = Range("A1").Value


💡 Если диапазон содержит несколько ячеек, Value вернёт массив значений:
Dim arr As Variant  
arr = Range("A1:C3").Value


Теперь arr – это двумерный массив, содержащий данные из ячеек A1:C3.

Особенности:
1️⃣ Значение может быть числом, текстом, датой или пустым.
2️⃣ При установке значения ячейка автоматически очищается от формул.
3️⃣ Свойство Value является свойством объекта Range по умолчанию, поэтому, при работе со значениями, его можно не указывать.

#VBA #ExcelVBA #Range #Value #Значение
🔥 Свойство Formula объекта Range

Свойство Range.Formula позволяет записывать или получать формулу ячейки. В отличие от Value, это свойство работает с самими формулами, а не с их результатами.

📌 Примеры:

1️⃣ Записать формулу в ячейку:
Range("B1").Formula = "=SUM(A1:A5)"  



2️⃣ Прочитать формулу из ячейки:
MsgBox Range("B1").Formula  


Если в B1 формула =SUM(A1:A5), то в MsgBox отобразится именно эта формула, а не её результат.

3️⃣ Записать формулу в диапазон (Excel автоматически скорректирует ссылки):
Range("B1:B10").Formula = "=A1*2"  


Теперь в B1:B10 появится формула =A1*2, =A2*2, =A3*2 и так далее.

💡 Формулы должны вводиться в английском формате, независимо от локализации Excel! Например, вместо =СУММ(A1:A5) всегда пишите =SUM(A1:A5). А в качестве разделителей аргументов используйте запятые (,) вместо точек с запятой (;).

Чтобы вводить формулы на русском языке, используйте свойство Range.FormulaLocal.

#VBA #ExcelVBA #Range #Formula #Формула
🔥 Свойство FormulaR1C1 объекта Range

Range.FormulaR1C1 позволяет записывать формулы, используя относительную адресацию в стиле R1C1 (строка-колонка). В отличие от Formula, оно удобно для работы с формулами, которые нужно вставлять в разные места без привязки к конкретным ячейкам.

📌 Примеры:

1️⃣ Записать формулу с относительными ссылками:
Range("B2").FormulaR1C1 = "=R[-1]C+R[-1]C[-1]"  


🔹 В B2 появится формула =A1+B1, так как R[-1]C – это ячейка над текущей (B1), а R[-1]C[-1] – ячейка слева и выше (A1).

2️⃣ Записать формулу в диапазон:
Range("B2:B10").FormulaR1C1 = "=RC[-1]*2"  


🔹 Теперь в B2:B10 появится =A2*2, =A3*2, =A4*2 и так далее.

💡 Разница между Formula и FormulaR1C1:
Formula использует стандартные A1-ссылки (=A1+B1).
FormulaR1C1 позволяет легко задавать формулы независимо от конкретных адресов ячеек. Например, R[1]C[1] означает смещение на одну строку вниз и один столбец вправо.

#VBA #ExcelVBA #Range #FormulaR1C1 #ФормулаR1C1
1
🔥 Свойство Address объекта Range

Свойство Range.Address возвращает адрес диапазона в формате строки. Оно полезно, когда нужно динамически получить адрес ячеек, например, для работы с формулами или логикой кода.

📌 Примеры:

1️⃣ Получить адрес одной ячейки:
MsgBox Range("B2").Address  


🔹 Выведет $B$2 – это абсолютный адрес.

2️⃣ Получить адрес диапазона:
MsgBox Range("B2:D5").Address  


🔹 Выведет $B$2:$D$5.

3️⃣ Использовать параметры для изменения формата:
MsgBox Range("B2").Address(RowAbsolute:=False, ColumnAbsolute:=False)  


🔹 Выведет B2 без $, что делает ссылку относительной.

4️⃣ Получить адрес в стиле R1C1:
MsgBox Range("B2").Address(ReferenceStyle:=xlR1C1)  


🔹 Выведет R2C2, так как B2 – это вторая строка и второй столбец.

5️⃣ Еще примеры с параметрами:
' Абсолютный адрес
Debug.Print Range("B2").Address(True, True) ' Вернёт "$B$2"

' Относительный адрес
Debug.Print Range("B2").Address(False, False) ' Вернёт "B2"

' Адрес с указанием имени листа
Debug.Print Range("B2").Address(External:=True) ' Вернёт "[ИмяКниги]Лист1!$B$2"


💡 Address удобно использовать при автоматизации формул или динамическом выделении диапазонов.

#VBA #ExcelVBA #Range #Address #Адрес
🔥 Свойство Row объекта Range

Свойство Range.Row возвращает номер первой строки указанного диапазона. Это свойство полезно, когда нужно определить положение ячейки или диапазона в таблице.

📌 Примеры:

1️⃣ Получить номер строки для одной ячейки:
MsgBox Range("C5").Row  


🔹 Выведет 5, так как C5 находится в пятой строке.

2️⃣ Получить номер первой строки диапазона:
MsgBox Range("B3:D10").Row  


🔹 Выведет 3, так как первая строка диапазона – это 3.

3️⃣ Использовать Row в цикле:
Dim rng As Range  
For Each rng In Range("A2:A10")
rng.Value = "Строка " & rng.Row
Next rng


🔹 В A2:A10 появятся значения Строка 2, Строка 3 и так далее.

💡 Если диапазон состоит из нескольких строк, Row вернёт номер только первой строки.

#VBA #ExcelVBA #Range #Row #Строка
🔥 Свойство Rows объекта Range

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

📌 Примеры:

1️⃣ Выделить третью строку в диапазоне A1:C5:
Range("A1:C5").Rows(3).Select  


🔹 Выделит A3:C3, так как Rows(3) означает третью строку внутри диапазона.

2️⃣ Изменить высоту всех строк в диапазоне:
Range("A1:C5").Rows.RowHeight = 25  


🔹 Установит высоту строк в 25 пикселей.

3️⃣ Заполнить строки номерами в первом столбце:
Dim r As Range  
For Each r In Range("A1:A5").Rows
r.Value = r.Row
Next r


🔹 В A1:A5 появятся числа 1, 2, 3, 4, 5, соответствующие номерам строк.

💡 Важно:
✔️ Rows.Count покажет количество строк в диапазоне.
✔️ Rows(1) – это первая строка внутри диапазона, а не в листе!

#VBA #ExcelVBA #Range #Rows #Строки
🔥 Свойство Interior объекта Range

Свойство Range.Interior позволяет управлять фоновым цветом ячеек и их заливкой. Это свойство используется для выделения данных, форматирования таблиц и создания цветовой индикации.

📌 Примеры:

1️⃣ Изменяем цвет фона ячейки A1:
Range("A1").Interior.Color = RGB(255, 255, 0)  


🔹 Ячейка A1 станет жёлтой (RGB(255, 255, 0)).

2️⃣ Устанавливаем стандартный цвет Excel (красный):
Range("B2").Interior.ColorIndex = 3  


🔹 ColorIndex = 3 — это красный цвет в палитре Excel.

3️⃣ Очищаем от заливки ячейки A1:C3:
Range("A1:C3").Interior.ColorIndex = xlNone  


🔹 Убирает заливку (возвращает стандартный фон).

4️⃣ Закрашиваем строки с чётными номерами:
Dim r As Range  
For Each r In Range("A1:A10").Rows
If r.Row Mod 2 = 0 Then
r.Interior.Color = RGB(200, 200, 200) ' Серый
End If
Next r


🔹 Закрашивает все чётные строки серым цветом.

5️⃣ Добавляем серый узор 50%:
Range("A1").Interior.Pattern = xlPatternGray50

🔹 Значения Pattern берутся из набора констант Excel, таких как xlPatternNone, xlPatternSolid, xlPatternGray50, и других.

6️⃣ Устанавливаем зелёный цвет узора:
Range("A1").Interior.PatternColor = RGB(0, 255, 0)

🔹 Цвет узора (PatternColor) перекрывает основной цвет заливки. Вы можете создать узор из цветных линий поверх однотонного фона.

7️⃣ Задаем оттенок узора:
Range("A1").Interior.PatternTintAndShade = 0.5 ' Светлый оттенок узора

🔹 PatternTintAndShade позволяет регулировать яркость и насыщенность цвета узора. Значение варьируется от -1 (насыщенный тёмный) до 1 (очень светлый).

8️⃣ Затемняем основную заливку:
Range("A1").Interior.TintAndShade = -0.25 ' Заливка с затемнением

🔹 TintAndShade позволяет регулировать яркость и насыщенность основной заливки ячейки. Значение варьируется от -1 (насыщенный тёмный) до 1 (очень светлый).

9️⃣ Применяем сразу несколько свойств к объекту Interior:
With Range("A1").Interior
.Color = RGB(255, 255, 0) ' Основной цвет - жёлтый
.Pattern = xlPatternChecker ' Шахматный узор
.PatternColor = RGB(0, 0, 255) ' Цвет узора - синий
.PatternTintAndShade = 0.3 ' Осветляем узор
End With

🔹 Можно комбинировать основные свойства заливки, чтобы добиться сложных визуальных эффектов.

💡 Interior можно комбинировать с Font, Borders и другими свойствами для комплексного форматирования.

#Interior #Color #Pattern #PatternColor #PatternTintAndShade #TintAndShade
🔥 Свойство Text объекта Range

Свойство Range.Text возвращает текстовое представление значения ячейки так, как оно отображается на экране. В отличие от Value, это свойство учитывает форматирование ячейки, но доступно только для чтения.

📌 Примеры:

1️⃣ Получить текстовое значение ячейки:
MsgBox Range("A1").Text  


Если в A1 записано число 1234,567, но оно отформатировано как 1 234,57, то Text вернёт 1 234,57, а Value – 1234.567.

2️⃣ Разница между Text и Value:
Range("A1").Value = 0.5  
MsgBox "Value: " & Range("A1").Value & vbNewLine & "Text: " & Range("A1").Text


🔹 Если A1 отформатирована как %, то Value вернёт 0.5, а Text – 50%.

💡 Важно:
Text корректно работает, только если ячейка видима. Если колонка слишком узкая, то может вернуть #####.

#VBA #ExcelVBA #Range #Text #Текст
🔥 Свойство Column объекта Range

Свойство Range.Column возвращает номер первого столбца указанного диапазона. Это свойство удобно для определения положения ячеек или работы с динамическими диапазонами.

📌 Примеры:

1️⃣ Получить номер столбца для одной ячейки:
MsgBox Range("D3").Column  


🔹 Выведет 4, так как D – это четвёртый столбец.

2️⃣ Получить номер первого столбца диапазона:
MsgBox Range("C2:E5").Column  


🔹 Выведет 3, так как C – это третий столбец.

3️⃣ Использовать Column в цикле:
Dim rng As Range  
For Each rng In Range("B1:E1")
rng.Value = "Столбец " & rng.Column
Next rng


🔹 В B1:E1 появятся значения Столбец 2, Столбец 3 и так далее.

💡 Если диапазон включает несколько столбцов, Column вернёт номер только первого столбца.

#VBA #ExcelVBA #Range #Column #Столбец
🔥 Свойство Columns объекта Range

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

📌 Примеры:

1️⃣ Выделить второй столбец в диапазоне A1:D5:
Range("A1:D5").Columns(2).Select  


🔹 Выделит B1:B5, так как Columns(2) означает второй столбец внутри диапазона.

2️⃣ Изменить ширину всех столбцов в диапазоне:
Range("A1:D5").Columns.ColumnWidth = 15  


🔹 Установит ширину столбцов в 15 пикселей.

3️⃣ Заполнить столбцы номерами в первой строке:
Dim c As Range  
For Each c In Range("A1:D1").Columns
c.Value = c.Column
Next c


🔹 В A1:D1 появятся числа 1, 2, 3, 4, соответствующие номерам столбцов.

💡 Важно:
✔️ Columns.Count покажет количество столбцов в диапазоне.
✔️ Columns(1) – это первый столбец внутри диапазона, а не в листе!

#VBA #ExcelVBA #Range #Columns #Столбцы
🔥 Свойство Font объекта Range

Свойство Range.Font позволяет изменять шрифт, цвет, размер и другие текстовые атрибуты в ячейках. Это свойство полезно для выделения данных, стилизации заголовков и форматирования отчётов.

📌 Примеры:

1️⃣ Изменить шрифт и размер текста в A1:
With Range("A1").Font  
.Name = "Arial"
.Size = 14
End With


🔹 Устанавливает шрифт Arial и размер 14.

2️⃣ Сделать текст жирным и красным в B2:
With Range("B2").Font  
.Bold = True
.Color = RGB(255, 0, 0)
End With


🔹 Текст станет жирным и красным.

3️⃣ Применить курсив и подчеркнуть текст в C3:
With Range("C3").Font  
.Italic = True
.Underline = xlUnderlineStyleSingle
End With


🔹 Устанавливает курсив и подчёркивание.

4️⃣ Изменить цвет шрифта в строках с нечётными номерами:
Dim r As Range  
For Each r In Range("A1:A10").Rows
If r.Row Mod 2 = 1 Then
r.Font.Color = RGB(0, 0, 255) ' Синий
End If
Next r


🔹 Закрашивает шрифт в нечётных строках в синий цвет.

💡 Font можно комбинировать с Interior, Borders и другими свойствами для создания красивого форматирования.

#VBA #ExcelVBA #Range #Font #Шрифт