VBA Excel
242 subscribers
88 photos
24 links
VBA Excel для начинающих. Справка по VBA Excel. Visual Basic for Applications. Справочник. Самоучитель.
Download Telegram
🔹 Функция CVar
Функция CVar используется для преобразования аргументов в тип данных Variant.

📌 Пример:
Dim a As Double, b As String, c
a = 549258.232546
b = "Новое сообщение"
c = CVar(a) 'Результат: 549258,232546 (Variant/Double)
c = CVar(b) 'Результат: "Новое сообщение" (Variant/String)


#VBA #ExcelVBA #CVar
🔥 Метод Activate объекта Range

Метод Activate делает указанную ячейку активной. Активная ячейка — это та, в которой находится фокус. Этот метод удобен при перемещении по листу, когда нужно установить фокус на конкретную ячейку.

📌 Разница между Activate и Select
🔹 Activate — устанавливает фокус в указанную ячейку.
🔹 Select — выделяет одну или несколько ячеек, делая их текущим диапазоном, активной становится только одна ячейка, расположенная в левом верхнем углу выделенного диапазона.

📌 Примеры

1. Сделать ячейку B2 активной
Sub ActivateCell()  
Range("B2").Activate ' Фокус окажется в ячейке B2
End Sub


2. Разница между Activate и Select
Sub ActivateVsSelect()
Range("B2:E6").Select ' Выделен диапазон B2:E6, фокус в ячейке B2
MsgBox ActiveCell.Address ' $B$2
Range("D4").Activate ' Выделен диапазон B2:E6, фокус в ячейке D4
MsgBox ActiveCell.Address ' $D$4
Range("A1").Activate ' Выделен диапазон A1, фокус в ячейке A1
MsgBox ActiveCell.Address ' $A$1
End Sub


⚠️ Важно!
🔹 Метод Activate работает только с одной ячейкой, его нельзя применить к диапазону.
🔹 Работает только на активном листе.
🔹 Если указанная ячейка находится внутри выделенного диапазона, метод Activate не изменяет ранее выделенный диапазон, а просто ставит фокус в указанную ячейку. Если указанная ячейка находится вне выделенного диапазона, выделение текущего диапазона снимается.

💡 Когда использовать?
Когда нужно переместить курсор в ячейку перед вводом данных через SendKeys.
В макросах, где требуется точное управление фокусом без изменения выделенного диапазона.

#VBA #ExcelVBA #Range #Activate
👍1
🔥 Метод AutoFit объекта Range

Метод Range.AutoFit автоматически изменяет ширину столбцов или высоту строк в диапазоне так, чтобы все данные в ячейках были видны полностью.

📌 Примеры

1️⃣ Для одной строки и одного столбца
Rows(1).AutoFit ' можно и Rows("1").AutoFit
Columns("A").AutoFit


2️⃣ Для нескольких строк и нескольких столбцов
Rows("1:5").AutoFit
Columns("A:E").AutoFit


3️⃣ Для определенного диапазона
Range("A1:C10").Columns.AutoFit
Range("A1:C10").Rows.AutoFit


4️⃣ Для всего листа
Cells.Columns.AutoFit
Cells.Rows.AutoFit


⚠️ Важно:
🔹 Если в ячейках содержатся длинные строки текста, метод Range.AutoFit подгонит столбец/строку до его максимальной ширины/высоты.
🔹 Метод Range.AutoFit не работает для объединённых ячеек.

💡 Когда использовать?
Когда нужно быстро подогнать размеры столбцов или строк в зависимости от содержимого ячеек.

Смотрите на нашем сайте, как работает автоподбор ширины объединенной ячейки и как работает автоподбор высоты объединенной ячейки.

#VBA #ExcelVBA #AutoFit #Range
🔥 Метод Clear объекта Range
Метод Clear полностью очищает ячейки от всего содержимого, форматирования, комментариев и гиперссылок, но сами ячейки остаются на месте (не удаляются). Это быстрый способ очистить диапазон.

📌 Что удаляет Clear?
✔️ Значения и формулы
✔️ Форматирование (цвет, границы, шрифт)
✔️ Комментарии и примечания
✔️ Гиперссылки

📌 Пример:
VBA  
Sub ClearExample()
Range("A1:C10").Clear ' Полностью очистит диапазон A1:C10
End Sub


🔹 Если нужно удалить только определённые элементы, используйте другие методы:

Удалить только данные (оставив форматирование):
Sub ClearOnlyContents()  
Range("A1:C10").ClearContents ' Удалит значения и формулы, но сохранит формат
End Sub



Удалить только форматирование (оставив данные):
Sub ClearOnlyFormats()  
Range("A1:C10").ClearFormats ' Удалит цвет, шрифт, границы и другие стили
End Sub



Удалить только комментарии и примечания:
Sub ClearOnlyComments()  
Range("A1:C10").ClearComments ' Удалит комментарии, но не данные
End Sub



Удалить только гиперссылки:
Sub ClearOnlyHyperlinks()  
Range("A1:C10").ClearHyperlinks ' Удалит гиперссылки, но оставит текст
End Sub



⚠️ Важно:
Метод Clear не удаляет объединение ячеек — для этого используйте UnMerge.
Если Clear применяется к ячейкам с формулами, формулы будут удалены, а не пересчитаны.

💡 Когда использовать метод Clear?
Когда нужно быстро очистить ячейки от всех данных и форматирования.
В макросах для подготовки таблицы перед загрузкой новых данных.

#Range #Clear #ClearContents #ClearFormats #ClearComments #ClearHyperlinks
🔥 Метод Copy объекта Range
Метод Copy позволяет скопировать содержимое и форматирование ячеек в буфер обмена или в другой диапазон. Он аналогичен сочетанию клавиш Ctrl + C в Excel.

📌 Как работает?
🔹 Если не указывать целевой диапазон, данные копируются в буфер обмена.
🔹 Если указать целевой диапазон, копируемый диапазон вставляется сразу.

📌 Примеры

1. Копировать диапазон в буфер обмена
Sub CopyToClipboard()  
Range("A1:C3").Copy ' Копирует диапазон A1:C3 в буфер обмена
End Sub



2. Копировать и вставить в другой диапазон
Sub CopyToAnotherRange()  
Range("A1:C3").Copy Destination:=Range("E1") ' Вставит копию в E1:G3
End Sub



3. Копировать на другой лист
Sub CopyToAnotherSheet()  
Sheets("Лист1").Range("A1:C3").Copy Destination:=Sheets("Лист2").Range("A1")
End Sub



4. Копировать весь столбец
Sub CopyColumn()  
Columns("A").Copy Destination:=Columns("D") ' Копирует столбец A в столбец D
End Sub



5. Копировать и вставить специальным способом (PasteSpecial), когда требуется вставить только значения, формулы или форматы:
Sub CopyAndPasteValues()  
Range("A1:C3").Copy
Range("E1").PasteSpecial Paste:=xlPasteValues ' Вставит только значения
Application.CutCopyMode = False ' Убирает пунктирную рамку после копирования
End Sub



⚠️ Важно:
🔹 Если не указывать Destination, данные просто копируются в буфер обмена.
🔹 Copy копирует всё: значения, формулы, формат, комментарии, примечания.
🔹 Если нужно вставить только значения, используйте метод PasteSpecial.
🔹 После использования Copy, включается режим "марша муравьёв" (подвижная пунктирная рамка). Уберите его командой Application.CutCopyMode = False.

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

#VBA #ExcelVBA #Copy #Range #PasteSpecial
🔥 Вставка интервала дат (1)
Автоматическое заполнение датами двух текстовых полей, задающих начало и конец периода.

1️⃣ Текущий месяц
В первое текстовое поле вставляем дату начала месяца, во второе - текущую дату:
Private Sub CommandButton1_Click()
TextBox1 = "01." & Format(Now, "mm.yyyy")
TextBox2 = Format(Now, "dd.mm.yyyy")
End Sub


Скриншоты сделаны 25.01.2025.

#VBA #ExcelVBA #Format #ИнтервалДат #Период
2️⃣ Прошлый месяц
В первое текстовое поле вставляем дату начала прошлого месяца, во второе - дату окончания прошлого месяца:
Private Sub CommandButton2_Click()
TextBox1 = "01." & Format(DateAdd("m", -1, Now), "mm.yyyy")
TextBox2 = Format(Now - Day(Now), "dd.mm.yyyy")
End Sub


#VBA #ExcelVBA #Now #Day #DateAdd
💡Примечания
🔹 Период с TextBox1 по TextBox2
🔹 Кнопка Текущий месяцCommandButton1
🔹 Кнопка Прошлый месяцCommandButton2
🔥 Вставка интервала дат (2)
В этом примере для преобразования дат будем использовать функцию DateSerial. А явное указание свойства Text у текстовых полей позволит не использовать функцию Format — Excel автоматически будет преобразовывать значение даты в текстовый формат системы. И добавим в пример еще три кнопки для вставки периодов.

#VBA #ExcelVBA #Date #DateSerial #ИнтервалДат #Период
💡Примечания
🔹 Период с TextBox1 по TextBox2
🔹 Кнопка СегодняCommandButton1
🔹 Кнопка ВчераCommandButton2
🔹 Кнопка Текущий месяцCommandButton3
🔹 Кнопка Прошлый месяцCommandButton4
🔹 Кнопка Прошлый годCommandButton5
1️⃣ Кнопка «Сегодня»
Поля начальной и конечной дат заполняются значениями текущей даты.
Private Sub CommandButton1_Click()
TextBox1.Text = Date
TextBox2.Text = Date
End Sub


2️⃣ Кнопка «Вчера»
Поля начальной и конечной дат заполняются значениями прошедшей (вчерашней) даты.
Private Sub CommandButton2_Click()
TextBox1.Text = Date - 1
TextBox2.Text = Date - 1
End Sub


3️⃣ Кнопка «Текущий месяц»
Поле начальной даты заполняется значением первого дня текущего месяца, а поле конечной — значением текущей даты.
Private Sub CommandButton3_Click()
TextBox1.Text = DateSerial(Year(Date), Month(Date), 1)
TextBox2.Text = Date
End Sub


4️⃣ Кнопка «Прошлый месяц»
Поле начальной даты заполняется значением первого дня предыдущего месяца, а поле конечной — значением последнего дня предыдущего месяца.
Private Sub CommandButton4_Click()
TextBox1.Text = DateSerial(Year(Date), Month(Date) - 1, 1)
TextBox2.Text = DateSerial(Year(Date), Month(Date), 0)
End Sub


5️⃣ Кнопка «Прошлый год»
Поле начальной даты заполняется значением первого дня предыдущего года, а поле конечной — значением последнего дня предыдущего года.
Private Sub CommandButton5_Click()
TextBox1.Text = DateSerial(Year(Date) - 1, 1, 1)
TextBox2.Text = DateSerial(Year(Date) - 1, 12, 31)
End Sub


#VBA #ExcelVBA #Date #DateSerial #ИнтервалДат #Период
Функции для сортировки массива

🛠 Функция для сортировки массива по возрастанию с числовым сравнением числовых элементов массива
Function SortArray(myArray As Variant) As Variant
Dim l As Long, u As Long, i1 As Long, i2 As Long, im As Long, tmp As Variant
'Определение наименьшего индекса массива
l = LBound(myArray)
'Определение наибольшего индекса массива
u = UBound(myArray)
    For i1 = l To u
        im = i1
        For i2 = i1 To u
            'Поиск наименьшего элемента массива, начиная с элемента myArray(i1)
            If myArray(i2) < myArray(im) Then im = i2
        Next
        'Если наименьший элемент не является текущим (im <> i1),
        'тогда наименьший элемент и текущий меняются местами
        If im <> i1 Then
            tmp = myArray(i1)
            myArray(i1) = myArray(im)
            myArray(im) = tmp
        End If
    Next
SortArray = myArray
End Function

Внешний цикл сравнивает по очереди каждый элемент массива с наименьшем элементом, найденным вложенным циклом среди оставшихся элементов (с бóльшими индексами), и, если наименьший элемент myArray(im) не является текущим элементом myArray(i1), они меняются местами.

🛠 Функция для сортировки массива с выбором вида сортировки
Function SortArrayNew(myArray As Variant, mySort As Long) As Variant
Dim l As Long, u As Long, i1 As Long, i2 As Long, im As Long, tmp As Variant
l = LBound(myArray)
u = UBound(myArray)
    For i1 = l To u
        im = i1
            For i2 = i1 To u
                Select Case mySort
                    Case Is = 0
                        If myArray(i2) < myArray(im) Then im = i2
                    Case Is = 1
                        If CStr(myArray(i2)) < CStr(myArray(im)) Then im = i2
                    Case Is = 2
                        If myArray(i2) > myArray(im) Then im = i2
                    Case Is = 3
                        If CStr(myArray(i2)) > CStr(myArray(im)) Then im = i2
                End Select
            Next
        If im <> i1 Then
            tmp = myArray(i1)
            myArray(i1) = myArray(im)
            myArray(im) = tmp
        End If
    Next
SortArrayNew = myArray
End Function

Дополнительный параметр mySort позволяет выбрать сортировку по возрастанию или убыванию и с числовым или текстовым сравнением числовых элементов массива. Значения, которые может принимать параметр mySort в таблице ниже.

#Function #Функция #SortArray #СортировкаМассива
Значения, которые может принимать параметр mySort.
📌 Пример сортировки массива
Пример использования разных видов сортировки одномерного массива в VBA Excel с выводом результатов на рабочий лист:
Sub Primer()
Dim myArr As Variant, x As Variant, i As Long, n As Long
    For i = 1 To 4
        myArr = Array(46, 25, "Лето", 508, 35, "лес", 11, 5, "25ф", "Лес", 45, 58, "лето", 350)
                myArr = SortArrayNew(myArr, i - 1)
        n = 1
            For Each x In myArr
                Cells(n, i) = myArr(n - 1)
                n = n + 1
            Next
    Next
End Sub

Результаты разных видов сортировки массива myArr на изображении ниже.
Результаты разных видов сортировки массива myArr.
Удаление пустых строк 1
Поиск пустых строк должен осуществляться снизу вверх, чтобы при их удалении не возник бесконечный цикл.

1️⃣ Удаление пустых строк со всего листа
Sub Primer1()
Dim n As Long, i As Long
'Определяем номер строки последней ячейки
'используемого диапазона на рабочем листе
n = Cells.SpecialCells(xlLastCell).Row
'Ищем и удаляем пустые строки
For i = n To 1 Step -1
If Rows(i).Text = "" Then Rows(i).Delete
Next
End Sub


2️⃣ Удаление пустых строк из заданного диапазона
Sub Primer2()
Dim n As Long, i As Long, myRange As Range
Set myRange = Range("A1:G200")
With myRange
n = .Rows.Count
For i = n To 1 Step -1
If .Rows(i).Text = "" Then .Rows(i).Delete
Next
End With
End Sub


#VBA #ExcelVBA #xlLastCell #RowsDelete #УдалениеПустыхСтрок
🔥 Метод Cut объекта Range
Метод Cut вырезает содержимое указанного диапазона ячеек и помещает его в буфер обмена. После этого вы можете вставить эти данные в другое место с помощью метода Paste.

📝 Пример
Sub CutExample1()
' Вырезаем данные из диапазона A1:A5
Range("A1:A5").Cut

' Вставляем данные в диапазон B1:B5
Range("B1:B5").Select
ActiveSheet.Paste
End Sub


🔍 Важные моменты
🔹 Метод Cut работает только в пределах активного листа.
🔹 Если вы хотите вырезать данные и вставить их на другой лист, активируйте другой лист перед вставкой.
Sub CutExample2()
' Вырезаем данные из диапазона A1:A5 на активном листе (Лист1)
Range("A1:A5").Cut

Лист2.Select
' Вставляем данные в диапазон B1:B5 на Лист2
Range("B1:B5").Select
ActiveSheet.Paste
End Sub


💡 Совет
Используйте метод Cut для быстрого перемещения данных без потери форматирования.

#VBA #ExcelVBA #Cut #Paste #ВырезаниеЯчеек
🔥 Метод Delete объекта Range
Метод Delete удаляет указанный диапазон ячеек, строк или столбцов, а также позволяет управлять тем, как оставшиеся данные будут смещаться после удаления.

📝 Пример
Sub DeleteExample()
' Удаляем строку 3
Rows(3).Delete

' Удаляем столбец B
Columns("B").Delete

' Удаляем диапазон A1:C3 и сдвигаем оставшиеся ячейки вверх
Range("A1:C3").Delete Shift:=xlUp
End Sub


🔍 Параметры метода Delete
1️⃣ Shift:=xlUp — сдвигает оставшиеся ячейки вверх (по умолчанию для строк).
2️⃣ Shift:=xlToLeft — сдвигает оставшиеся ячейки влево (по умолчанию для столбцов).

💡 Советы
🔹 Если вы удаляете строки или столбцы, параметр Shift можно не указывать — Excel автоматически сдвинет данные.
🔹 Будьте осторожны при удалении данных — восстановить их можно только через отмену (Ctrl + Z) или резервную копию.

#VBA #Delete #Paste #УдалениеЯчеек #xlUp #xlToLeft
🔍 Метод Find объекта Range
Метод Find позволяет найти первую ячейку в диапазоне, содержащую заданное значение. Это быстрый и удобный способ искать данные на листе, аналогичный Ctrl + F в Excel.

📌 Основные параметры Find
🔹 What – что ищем (обязательный параметр).
🔹 LookIn – где искать (значения, формулы или комментарии).
🔹 LookAt – точное или частичное совпадение.
🔹 SearchOrder – искать по строкам или по столбцам.
🔹 MatchCase – учитывать регистр букв.
🔹 SearchDirection – направление поиска (xlNext – вперёд, xlPrevious – назад).

📌 Примеры

1️⃣ Поиска значения в диапазоне
Sub FindExample()  
Dim cell As Range
Set cell = Range("A1:A100").Find(What:="Иван", LookIn:=xlValues, LookAt:=xlWhole)

If Not cell Is Nothing Then
MsgBox "Найдено в ячейке: " & cell.Address
Else
MsgBox "Значение не найдено!"
End If
End Sub



2️⃣ Поиск с учётом регистра и точного совпадения
Sub FindExactMatch()  
Dim cell As Range
Set cell = Range("A1:A100").Find(What:="ABC", LookAt:=xlWhole, MatchCase:=True)

If Not cell Is Nothing Then
MsgBox "Точное совпадение найдено в " & cell.Address
Else
MsgBox "Совпадений нет!"
End If
End Sub



3️⃣ Поиск в формулах (а не в значениях)
Sub FindInFormulas()  
Dim cell As Range
Set cell = Range("A1:A100").Find(What:="*SUM*", LookIn:=xlFormulas)

If Not cell Is Nothing Then
MsgBox "Формула найдена в " & cell.Address
Else
MsgBox "Формул с таким текстом нет!"
End If
End Sub


Метод Find с What:="*SUM*" нашел формулу =СУММ(A1:A3)

4️⃣ Цикл поиска всех совпадений
Метод Find ищет только первое совпадение. Чтобы найти все вхождения, используем FindNext:
Sub FindAllMatches()  
Dim firstCell As String, cell As Range
Set cell = Range("A1:A100").Find(What:="Иван", LookIn:=xlValues)

If Not cell Is Nothing Then
firstCell = cell.Address
Do
MsgBox "Найдено в: " & cell.Address
Set cell = Range("A1:A100").FindNext(cell)
Loop While Not cell Is Nothing And cell.Address <> firstCell
Else
MsgBox "Значение не найдено!"
End If
End Sub



⚠️ Важно
🔹 Find возвращает только первую найденную ячейку, для остальных используйте FindNext.
🔹 Если поиск не нашёл совпадений, метод вернёт Nothing, поэтому всегда проверяйте If Not cell Is Nothing.
🔹 Если LookAt:=xlWhole, то Find ищет только полные совпадения. Если xlPart, то подстроку в тексте.

💡 Когда использовать?
Для быстрого поиска данных в больших таблицах.
В макросах, где нужно найти конкретную запись и изменить её.
Для анализа данных с повторяющимися значениями.

#VBA #ExcelVBA #Find #FindNext #Range #Поиск
👍1