VBA Excel
242 subscribers
88 photos
23 links
VBA Excel для начинающих. Справка по VBA Excel. Visual Basic for Applications. Справочник. Самоучитель.
Download Telegram
🔥 Метод 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
Объект Range
Определение и обращение
Свойство Address (адрес диапазона)
Свойство Borders (границы ячеек)
Свойство Cells (ячейки диапазона)
Свойство Column (номер первого столбца)
Свойство Columns (коллекция столбцов в диапазоне)
Свойство CurrentRegion (текущая таблица)
Свойство End (последняя заполненная ячейка)
Свойство EntireColumn (столбцы диапазона)
Свойство EntireRow (строки диапазона)
Свойство Font (шрифт текста в ячейке)
Свойство Formula (формула)
Свойство FormulaLocal (формула на языке пользователя)
Свойство FormulaR1C1 (формула в стиле R1C1)
Свойство FormulaR1C1Local (формула в стиле R1C1 на языке пользователя)
Свойство HasFormula (содержит ли ячейка формулу)
Свойство Height (высота диапазона)
Свойство Hidden (скрывает строки или столбцы)
Свойство Interior (формат заливки)
Свойство Merge (объединение ячеек)
Свойство NumberFormat (форматы чисел, дат, процентов)
Свойство Offset (смещение диапазона)
Свойство Resize (изменение размера диапазона)
Свойства Row (номер первой строки)
Свойства Rows (коллекция строк в диапазоне)
Свойство Text (текстовое представление значения)
Свойство Value (значение)
Свойство Value2 (точные числовые значения)
Свойство Width (ширина диапазона)
Метод Activate (активация ячейки)
Метод AutoFit (автоподбор ширины и высоты)
Метод Clear (очистка ячеек)
Метод Copy (копирование ячеек)
Метод Cut (вырезание ячеек)
Метод Delete (удаление ячеек)
Метод Find (поиск первого совпадения)
Метод FindNext (поиск всех совпадений)
Метод Insert (вставка ячеек)
Метод Merge (объединение ячеек)
Метод PasteSpecial (специальная вставка)
Метод RemoveDuplicates (удаление дубликатов)
Метод Replace (поиск и замена)
Метод Select (выделение ячеек)
Метод Sort (сортировка данных)
Метод UnMerge (отмена объединения ячеек)

#VBA #ExcelVBA #Range #Диапазон