VBA Excel
242 subscribers
88 photos
24 links
VBA Excel для начинающих. Справка по VBA Excel. Visual Basic for Applications. Справочник. Самоучитель.
Download Telegram
Пример цикла While… Wend
Sub test1()
Dim a As Byte
  While a < 100
    a = a + 7
  Wend
MsgBox a
End Sub

Информационное сообщение MsgBox выведет число 105.
Функции для работы с буфером обмена

🛠 Функция записи текста в буфер обмена:
Function SetClipBoardText(ByVal Text As Variant) As Boolean
    SetClipBoardText = CreateObject("htmlfile").parentWindow.clipboardData.SetData("Text", Text)
End Function


🛠 Функция вставки текста из буфера обмена:
Function GetClipBoardText() As String
    On Error Resume Next
    GetClipBoardText = CreateObject("htmlfile").parentWindow.clipboardData.GetData("Text")
End Function


🛠 Функция очистки буфера обмена:
Function ClearClipBoardText() As Boolean
    ClearClipBoardText = CreateObject("htmlfile").parentWindow.clipboardData.clearData("Text")
End Function


Пример использования функций для работы с буфером обмена:
Sub Primer()
Dim s As String
    s = "Копирование текста из переменной в буфер обмена"
    'Копируем текст в буфер обмена
    SetClipBoardText (s)
    'Вставляем текс из буфера обмена в ячейку "A1"
    Range("A1") = GetClipBoardText
    'Очищаем буфер обмена, если это необходимо
    ClearClipBoardText
End Sub


#VBA #ExcelVBA #БуферОбмена #ClipBoard
Ячейка в VBA Excel

Ячейка в VBA Excel - это частный случай объекта Range (диапазона), состоящего из одной ячейки. Cells - это свойство объекта Range, возвращающее объект Range, состоящий из одной ячейки.

#VBA #ExcelVBA #Range #Cells #Ячейка #Ячейки
Обращение к ячейке
Все известные мне способы обращения к ячейке в VBA Excel.

Обращение к ячейке по адресу

Обращение к ячейке "C5" на активном листе:
Range("C5")
Cells(5, 3)
Cells(5, "C")
[C5]


Обращение к активной (выбранной) ячейке на активном листе:
ActiveCell


Обращение к ячейке "C5" на неактивном листе книги с кодом:
'по основному имени листа
Лист2.Range("C5")
Лист2.Cells(5, 3)
Лист2.Cells(5, "C")
Лист2.[C5]
'по имени ярлыка
Sheets("Имя ярлыка").Range("C5")
Sheets("Имя ярлыка").Cells(5, 3)
Sheets("Имя ярлыка").Cells(5, "C")
Sheets("Имя ярлыка").[C5]

Имя ярлыка может совпадать с основным именем листа. Увидеть эти имена можно в окне редактора VBA в проводнике проекта. Без скобок отображается основное имя листа, в скобках – имя ярлыка.

Обращение к ячейке "C5" на листе "Лист2" другой открытой книги из книги с кодом:
Workbooks("Книга2.xlsm").Sheets("Лист2").Range("C5")
Workbooks("Книга2.xlsm").Sheets("Лист2").Cells(5, 3)
Workbooks("Книга2.xlsm").Sheets("Лист2").Cells(5, "C")
Workbooks("Книга2.xlsm").Sheets("Лист2").[C5]

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

#VBA #ExcelVBA #ОбращениеКЯчейке #Range #Cells
Обращение к ячейке по индексу

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

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

По индексу можно обращаться к ячейке не только на всем рабочем листе, но и в отдельном диапазоне. Нумерация ячеек осуществляется в пределах заданного диапазона по тому же правилу: слева-направо и сверху-вниз. Вот индексы ячеек диапазона Range("A1:C3"):
Обращение к ячейке Range("A1:C3").Cells(5) соответствует выражению Range("B2").
Обращение к ячейке по имени

Если ячейке на рабочем листе Excel присвоено имя (Формулы –> Присвоить имя), то обращаться к ней можно по присвоенному имени.

Допустим одной из ячеек присвоено имя – "Итого", тогда обратиться к ней можно – Range("Итого").
Запись, чтение, очистка

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

Содержание ячейки определяется ее свойством "Value", которое в VBA Excel является свойством по умолчанию и его можно явно не указывать. Записывается информация в ячейку при помощи оператора присваивания "=":
Cells(2, 4).Value = 15
Cells(2, 4) = 15
Range("A1") = "Этот текст записываем в ячейку"
ActiveCell = 28 + 10*36

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

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

Считать информацию из ячейки в переменную можно также при помощи оператора присваивания "=":
Sub Test()
Dim a1 As Integer, a2 As Integer, a3 As Integer
Range("A3") = 6
Cells(2, 5) = 15
a1 = Range("A3")
a2 = Cells(2, 5)
a3 = a1 * a2
MsgBox a3
End Sub


Точно также можно обмениваться информацией между ячейками:
Cells(2, 2) = Range("A4")


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

Очищается ячейка от значения с помощью метода ClearContents. Кроме того, можно присвоить ячейке значение нуля, пустой строки или Empty:
Cells(10, 2).ClearContents
Range("D23") = 0
ActiveCell = ""
Cells(5, "D") = Empty


#Запись #Чтение #Очистка #Range #Cells
👍1
Цвет ячейки (заливка, фон)

Свойство .Interior.Color объекта Range

Начиная с Excel 2007 основным способом заливки диапазона или отдельной ячейки цветом является использование свойства .Interior.Color объекта Range путем присваивания ему значения цвета в виде десятичного числа от 0 до 16777215 (всего 16777216 цветов).
Sub ColorTest1()
Range("A1").Interior.Color = 31569
Range("A4:D8").Interior.Color = 4569325
Range("C12:D17").Cells(4).Interior.Color = 568569
Cells(3, 6).Interior.Color = 12659
End Sub


Если присвоить свойству .Interior.Color отрицательное значение от -16777215 до -1, то цвет будет соответствовать значению, равному сумме максимального значения палитры (16777215) и присвоенного отрицательного значения. Например, заливка всех трех ячеек после выполнения следующего кода будет одинакова:
Sub ColorTest11()
Cells(1, 1).Interior.Color = -12207890
Cells(2, 1).Interior.Color = 16777215 + (-12207890)
Cells(3, 1).Interior.Color = 4569325
End Sub


Числовые значения цветов запомнить невозможно, поэтому часто возникает вопрос о том, как узнать числовое значение фона ячейки. Следующий код VBA Excel выводит сообщения о числовых значениях присвоенных ранее цветов:
Sub ColorTest2()
MsgBox Range("A1").Interior.Color
MsgBox Range("A4:D8").Interior.Color
MsgBox Range("C12:D17").Cells(4).Interior.Color
MsgBox Cells(3, 6).Interior.Color
End Sub

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

Использование предопределенных констант
В VBA Excel есть предопределенные константы часто используемых цветов для заливки ячеек:

#ЦветЯчейки #Заливка #Фон #InteriorColor #Interior #Color
👍1
Присваивается цвет ячейке предопределенной константой в VBA Excel точно так же, как и числовым значением:
Range("A1").Interior.Color = vbGreen
👍1
Цветовая модель RGB

Цветовая система RGB представляет собой комбинацию различных по интенсивности основных трех цветов: красного, зеленого и синего. Они могут принимать значения от 0 до 255. Если все значения равны 0 — это черный цвет, если все значения равны 255 — это белый цвет.

Выбрать цвет и узнать его значения RGB можно с помощью палитры Excel:
1
Чтобы можно было присвоить ячейке или диапазону цвет с помощью значений RGB, их необходимо перевести в десятичное число, обозначающее цвет. Для этого существует функция VBA Excel, которая так и называется — RGB.

Range("A1").Interior.Color = RGB(100, 150, 200)


#RGB #Цвет #Color
Очистка ячейки (диапазона) от заливки

Для очистки ячейки (диапазона) от заливки используется константа xlNone:
Range("A1").Interior.Color = xlNone


#VBA #ExcelVBA #xlNone #ОчисткаЯчейки
Свойство .Interior.ColorIndex объекта Range

До появления Excel 2007 существовала только ограниченная палитра для заливки ячеек фоном, состоявшая из 56 цветов, которая сохранилась и в настоящее время. Каждому цвету в этой палитре присвоен индекс от 1 до 56. Присвоить цвет ячейке по индексу или вывести сообщение о нем можно с помощью свойства .Interior.ColorIndex:
Range("A1").Interior.ColorIndex = 8
MsgBox Range("A1").Interior.ColorIndex


Просмотреть ограниченную палитру для заливки ячеек фоном можно, запустив в VBA Excel простейший макрос:
Sub ColorIndex()
Dim i As Byte
For i = 1 To 56
Cells(i, 1).Interior.ColorIndex = i
Next
End Sub

Номера строк активного листа от 1 до 56 будут соответствовать индексу цвета, а ячейка в первом столбце будет залита соответствующим индексу фоном.

#VBA #ExcelVBA #ColorIndex #InteriorColorIndex #Interior
Цвет текста (шрифта) в ячейке

Свойство .Font.Color (основная палитра)

Основная палитра, начиная c Excel 2007, состоит из 16777216 цветов. Свойство .Font.Color может принимать значения от 0 до 16777215, причем 0 соответствует черному цвету, а 16777215 — белому.
Cells(1, 1).Font.Color = 0
Cells(2, 1).Font.Color = 6777215
Cells(3, 1).Font.Color = 4569325


При записи макрорекордером макроса с присвоением шрифту цвета используются отрицательные значения свойства .Font.Color, которые могут быть в пределах от -16777215 до -1. Отрицательные значения соответствуют по цвету положительному значению, равному сумме наибольшего индекса основной палитры и данного отрицательного значения. Например, отрицательное значение -8257985 соответствует положительному значению 8519230, являющегося результатом выражения 16777215 + (-8257985). Цвета текста двух ячеек из следующего кода будут одинаковы:
Cells(1, 1).Font.Color = -8257985
Cells(2, 1).Font.Color = 8519230


#VBA #ExcelVBA #ЦветТекста #FontColor #Font #Color
Свойство .Font.Color и модель RGB

Для изменения цвета текста в ячейке можно использовать цветовую модель RGB:
Range("A1").Font.Color = RGB(200, 150, 250)
Cells(2, 1).Font.Color = RGB(200, 150, 100)


Аргументы функции RGB могут принимать значения от 0 до 255. Если все аргументы равны 0, цвет — черный, если все аргументы равны 255, цвет — белый. Функция RGB преобразует числовые значения основных цветов (красного, зеленого и синего) в индекс основной палитры.

Свойство .Font.Color и предопределенные константы

Цвет шрифту в ячейке можно присвоить с помощью предопределенных констант:
Range("A1:C3").Font.Color = vbGreen
Range(Cells(4, 1), Cells(6, 3)).Font.Color = vbBlue
Cells(7, 1).Font.Color = vbRed

Список предопределенных констант смотрите в таблице ниже.

#VBA #ExcelVBA #RGB #FontColor
Свойство .Font.ColorIndex

Свойство .Font.ColorIndex может принимать значения от 1 до 56. Это стандартная ограниченная палитра, которая существовала до Excel 2007 и используется до сих пор. Посмотрите примеры:
Range("A1:D6").Font.ColorIndex = 5
Cells(1, 6).Font.ColorIndex = 12


Таблица соответствия значений ограниченной палитры цвету:

#VBA #ExcelVBA #FontColorIndex #Font #ColorIndex
Свойство .Font.ThemeColor

Свойство .Font.ThemeColor может принимать числовые или текстовые значения констант из коллекции MsoThemeColorIndex:
Range("A1").Font.ThemeColor = msoThemeColorHyperlink
Cells(2, 1).Font.ThemeColor = msoThemeColorAccent4


#ThemeColor #FontThemeColor

Коллекция MsoThemeColorIndex
Оператор With

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

Синтаксис оператора With:
With object
[statements]
End With


Параметры оператора With:
1️⃣ object - имя объекта или пользовательского типа данных.
2️⃣ statements - один или несколько операторов (строк кода), которые выполняются в отношении указанного объекта.

Примеры

В следующей процедуре выполняется несколько идущих подряд операторов (строк кода) в отношении одного и того же объекта Range("A1:E5"):
Sub Primer1()
    Range("A1:E5").Value = "Тест"
    Range("A1:E5").Interior.Color = vbMagenta
    Range("A1:E5").Font.Size = 14
    Range("A1:E5").Font.Color = vbYellow
    Range("A1:E5").Font.Italic = True
    Range("A1:E5").Borders.LineStyle = True
End Sub


Если в процедуре выполняется несколько идущих подряд операторов в отношении одного и того же объекта, то оператор With позволяет указать объект только один раз:
Sub Primer2()
With Range("A1:E5")
.Value = "Тест"
.Interior.Color = vbMagenta
.Font.Size = 14
.Font.Color = vbYellow
.Font.Italic = True
.Borders.LineStyle = True
End With
End Sub

Такое написание кода делает его более понятным, а выполнение – более быстрым.

Конструкции с оператором With можно вкладывать одну в другую:
Sub Primer3()
    With Range("A1:E5")
        .Value = "Тест"
        .Interior.Color = vbMagenta
            With .Font
                .Size = 14
                .Color = vbYellow
                .Italic = True
            End With
        .Borders.LineStyle = True
    End With
End Sub

Такой код удобен, когда необходимо выполнить ряд операторов по отношению к некоторому объекту [Range("A1:E5")], а также по отношению к одному из содержащихся в нем объектов [Range("A1:E5").Font].

Примечания от разработчика:

1️⃣ После входа в блок With параметр object изменить нельзя. Следовательно, один оператор With не может быть использован для изменения нескольких объектов.
2️⃣ Во вложенном блоке With необходимо указывать полные ссылки на любые элементы объекта из внешнего блока With.
3️⃣ Не рекомендуется использовать переходы в блоки With или из них.

#VBA #ExcelVBA #With #Оператор #Operator