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 .