Переменная – это именованная область памяти для хранения данных определенного типа. Например, для хранения фамилии менеджера или для хранения ссылки на ячейку в удобном виде
Несколько причин зачем нужны переменные
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. Но переменные — самый простой и самый мощный прием, ИМХО.