VBA
Соглашения об именах
Поиск…
Переменные имена
Переменные содержат данные. Назовите их после того, для чего они используются, а не после их типа или области данных, используя существительное . Если вы вынуждены пронумеровать переменные (например , thing1, thing2, thing3 ), а затем рассмотреть вопрос об использовании соответствующей структуры данных вместо (например , массива, в Collection , или Dictionary ).
Имена переменных, которые представляют собой итеративный набор значений - например, массив, Collection , Dictionary или Range ячеек, должны быть множественными.
Некоторые общие соглашения об именах VBA:
Для переменных уровня процедуры :
camelCase
Public Sub ExampleNaming(ByVal inputValue As Long, ByRef inputVariable As Long)
Dim procedureVariable As Long
Dim someOtherVariable As String
End Sub
Для переменных уровня модуля:
PascalCase
Public GlobalVariable As Long
Private ModuleVariable As String
Для констант:
SHOUTY_SNAKE_CASE обычно используется для дифференциации констант от переменных:
Public Const GLOBAL_CONSTANT As String = "Project Version #1.000.000.001"
Private Const MODULE_CONSTANT As String = "Something relevant to this Module"
Public Sub SomeProcedure()
Const PROCEDURE_CONSTANT As Long = 10
End Sub
Однако имена PascalCase делают более чистый код и так же хороши, поскольку IntelliSense использует разные значки для переменных и констант:

Венгерская нотация
Назовите их после того, для чего они используются, а не после их типа или области данных.
«Венгерская нотация облегчает просмотр типа переменной»
Если вы пишете свой код, например, процедуры придерживаетесь принципа единой ответственности (как и должно быть), вы никогда не должны смотреть на экранные объявления переменных в верхней части любой процедуры; объявлять переменные как можно ближе к их первому использованию, и их тип данных всегда будет на виду, если вы объявите их с явным типом. Ярлык Ctrl + i VBE можно использовать для отображения типа переменной в всплывающей подсказке.
Для какой переменной используется гораздо более полезная информация, чем ее тип данных, особенно на языке, таком как VBA, который счастливо и неявно преобразует тип в другой по мере необходимости.
Рассмотрим iFile и strFile в этом примере:
Function bReadFile(ByVal strFile As String, ByRef strData As String) As Boolean
Dim bRetVal As Boolean
Dim iFile As Integer
On Error GoTo CleanFail
iFile = FreeFile
Open strFile For Input As #iFile
Input #iFile, strData
bRetVal = True
CleanExit:
Close #iFile
bReadFile = bRetVal
Exit Function
CleanFail:
bRetVal = False
Resume CleanExit
End Function
Сравнить с:
Function CanReadFile(ByVal path As String, ByRef outContent As String) As Boolean
On Error GoTo CleanFail
Dim handle As Integer
handle = FreeFile
Open path For Input As #handle
Input #handle, outContent
Dim result As Boolean
result = True
CleanExit:
Close #handle
CanReadFile = result
Exit Function
CleanFail:
result = False
Resume CleanExit
End Function
strData передается ByRef в верхнем примере, но помимо того факта, что нам посчастливилось увидеть, что он явно передан как таковой, нет никаких указаний на то, что strData фактически возвращается функцией.
В нижнем примере называет его outContent ; это out префикса , что венгерская нотация была изобретена для: чтобы помочь прояснить , что переменная используется для, в данном случае четко определить его как «вне» параметра.
Это полезно, поскольку IntelliSense сам по себе не отображает ByRef , даже если параметр явно передан по ссылке:

Что приводит к...
Венгерский сделал правильно
Первоначально венгерская нотация не имела ничего общего с переменными типами . Фактически, венгерская нотация, сделанная правильно , действительно полезна. Рассмотрим этот небольшой пример ( ByVal и As Integer удалены для краткости):
Public Sub Copy(iX1, iY1, iX2, iY2)
End Sub
Сравнить с:
Public Sub Copy(srcColumn, srcRow, dstColumn, dstRow)
End Sub
src и dst являются префиксами венгерского нотации здесь, и они передают полезную информацию, которая в противном случае уже не может быть выведена из имен параметров или IntelliSense, показывая нам объявленный тип.
Конечно, есть лучший способ передать все это, используя правильную абстракцию и реальные слова, которые могут быть произнесены вслух и понятны - как надуманный пример:
Type Coordinate
RowIndex As Long
ColumnIndex As Long
End Type
Sub Copy(source As Coordinate, destination As Coordinate)
End Sub
Имена процедур
Процедуры что-то делают . Назовите их после того, что они делают, используя глагол . Если точное написание процедуры невозможно, вероятно, процедура выполняет слишком много вещей и ее необходимо разбить на более мелкие, более специализированные процедуры.
Некоторые общие соглашения об именах VBA:
Для всех процедур:
PascalCase
Public Sub DoThing()
End Sub
Private Function ReturnSomeValue() As [DataType]
End Function
Для процедур обработчика событий:
ObjectName_EventName
Public Sub Workbook_Open()
End Sub
Public Sub Button1_Click()
End Sub
Обработчики событий обычно автоматически именуются VBE; переименование их без переименования объекта и / или обработанного события приведет к поломке кода - код будет запущен и скомпилирован, но процедура обработчика будет потеряна и никогда не будет выполнена.
Boolean Members
Рассмотрим функцию с булевым возвратом:
Function bReadFile(ByVal strFile As String, ByRef strData As String) As Boolean
End Function
Сравнить с:
Function CanReadFile(ByVal path As String, ByRef outContent As String) As Boolean
End Function
Can префикс не служат той же цели, что и b приставкой: он определяет возвращаемое значение функции как Boolean . Но Can читать лучше, чем b :
If CanReadFile(path, content) Then
По сравнению с:
If bReadFile(strFile, strData) Then
Рассмотрите возможность использования префиксов , например, Can , Is или Has перед Логическое возвращающих членов (функции и свойства), но только тогда , когда он добавляет ценность. Это соответствует действующим правилам именования Microsoft .