Зачем нужны переменные в макросах?

Переменная – это именованная область памяти для хранения данных определенного типа. Например, для хранения фамилии менеджера или для хранения ссылки на ячейку в удобном виде

Несколько причин зачем нужны переменные
1. Для удобных ссылок на объекты (e.g. при создании сводной таблицы или графика)
2. Для служебных целей (e.g. флаги,переменные цикла, аргументы UDF)
3. Для информативности кода (e.g. при повторном использовании)
4. Для хранения констант (e.g. чтобы избавиться от «магических чисел»)
5. Для контроля типов данных и значений (e.g. в случае диалога с пользователем и ограничения по диапазону чисел)

Количество переменных зависит от их применения. Можно стараться сразу сформировать схему выполнения макросов и прикинуть количество и тип переменных, а можно идти от обратного — понадобилась переменная — идем в начало процедуры и объявляем ее.

Приведу пример по информативности кода. В первом случае я буду использовать только одну переменную — в цикле, а во втором — их будет 5.

[code language=»vb»]
Option Explicit
Sub Variable_1()

Dim cell As Range

Debug.Print "Диапазон с ФИО", Range("A2", Cells(Rows.Count, 1).End(xlUp)).Address

For Each cell In Range("A2", Cells(Rows.Count, 1).End(xlUp))

If InStr(InStr(1, cell.Value, " ") + 1, cell.Value, " ") = 0 Then
‘Случай — нет отчества
With cell
.Offset(, 1) = Left(.Value, InStr(1, .Value, " ") — 1) ‘ Фамилия
.Offset(, 2) = Right(.Value, Len(.Value) — InStr(1, .Value, " ")) ‘ Имя
End With
Else
With cell

.Offset(, 1) = Left(.Value, InStr(1, .Value, " ") — 1) ‘ Фамилия

.Offset(, 2) = Mid(.Value, InStr(1, .Value, " ") + 1, _
InStr(InStr(1, .Value, " ") + 1, .Value, " ") — InStr(1, cell.Value, " ") — 1) ‘ Имя

.Offset(, 3) = Trim(Right(.Value, Len(.Value) — _
InStr(InStr(1, .Value, " ") + 1, .Value, " ") + 1)) ‘ Отчество

End With
End If

Next cell

End Sub

Sub Variable_2()

Dim pos1 As Integer, pos2 As Integer
Dim cell As Range, myRange As Range
Dim txt As String

Set myRange = Range("A2", Cells(Rows.Count, 1).End(xlUp))
Debug.Print "Диапазон с ФИО", myRange.Address

For Each cell In myRange

txt = cell.Value

pos1 = InStr(1, txt, " ") + 1
pos2 = InStr(pos1, txt, " ")
If pos2 = 0 Then pos2 = Len(txt) + 1 ‘Случай — нет отчества

With cell
.Offset(, 1) = Left(txt, pos1 — 2) ‘ Фамилия
.Offset(, 2) = Mid(txt, pos1, pos2 — pos1) ‘ Имя
.Offset(, 3) = Trim(Right(txt, Len(txt) — pos2 + 1)) ‘ Отчество
End With

Next cell

End Sub
[/code]

Безусловно, переменными также не стоит злоупотреблять. Если вы используете больше 100 переменных в макросе <1’000 строк — вы что-то делаете не так.

Есть еще много приемов в VBA помимо переменных для информативности кода и его упрощения. Например, модульный принцип построения макросов, UDF или (EN) Class Modules VBA. Но переменные — самый простой и самый мощный прием, ИМХО.

 

Оставьте комментарий

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.