Что лучше для использования памяти: определить константы в подпрограммах или в модуле - PullRequest
0 голосов
/ 25 марта 2019

Я понимаю, что это некоторые из основ VB, но не могу понять, как спросить Google:

Как VBA управляет константами? В некоторых языках компилятор заменяет их значениями. Но как это работает в VBA? Будет ли иметь значение, если я объявлю их в sub / function, а не в глобальном пространстве. Особенно, если sub / function вызывается много раз во время выполнения.

Я часто объявляю имя функции и некоторые другие строки как константы в под / функциональном пространстве - мне легче читать мой код. Например: SUB_NAME в Get_AppExcel_Ref () в коде ниже, чтобы использовать его для регистрации событий ошибок. Если Get_AppExcel_Ref () будет вызываться пару раз во время работы программы - SUB_NAME будет выделяться в памяти один раз, при первом запуске или при каждом вызове? Или, может быть, есть какая-то проблема с производительностью и лучше объявить SUB_NAME глобальным.

Private Sub Get_AppExcel_Ref(ByRef appObject As Object)
  Const SUB_NAME As String = "Get_AppExcel_Ref"    

  On Error GoTo ERR_NOT_OPENNED
  Set appObject = GetObject(, "Excel.Application")
  Exit Sub 

ERR_NOT_OPENNED:    
  If Err.Number = 429 Then
    Err.Clear
    Set appObject = CreateObject("Excel.Application")
  Else    
    Call LOG.printLog("open Excel", Err, SUB_NAME)
  End If    
End Sub 

'LOG - user class type variable, printLog params: Description, Error, Source Name

Ответы [ 2 ]

0 голосов
/ 25 марта 2019

Ель всего, добро пожаловать в SO.

Я думаю, что компилятор VBA также заменяет константы их значениями, как и в других языках. То есть они не совпадают с переменными .

Я не думаю, что здесь нужна константа. Я склонен использовать их только для параметров , а не просто для замены какой-либо строки.

Ваш код будет в порядке, как это:

LOG.printLog "open Excel", Err, "GetAppExcelRef"
0 голосов
/ 25 марта 2019

Объявление вашего Const глобальным не имеет смысла, так как оно будет отображать одну и ту же строку, где бы вы ее не использовали.

Вы можете объявить ее как глобальную переменную (например, чтобы сохранить дополнительный параметр для вашей подпрограммы ведения журнала) и назначить имя подпрограммы, но имя вашей подпрограммы будет в виде (постоянной) строки в вашем коде. также (так же объем используемой памяти). И, в конце концов, это полностью испортит вашу логику, потому что при вызове подпрограммы содержимое будет перезаписано, и когда после этого вызова произойдет ошибка, ваш журнал покажет неверное имя подпрограммы. Так что не иди по этому пути.

Как Пол Огиливи пишет в своих комментариях, думайте о константе как о переменной только для чтения - и не тратьте впустую любые мысли о реализации exaxt (но я думаю, что стоит предположить, что строка помещается только один раз в объем памяти). У вас более чем достаточно памяти для вашего кода VBA, и обработка строк настолько быстра, что у вас никогда не возникнет проблем во время выполнения.

Мое кредо: используйте все, что соответствует вашим потребностям как программиста, и удобочитаемость является важным аспектом. Не обращайте особого внимания на потребление памяти или скорость выполнения - кроме случаев, когда вы действительно сталкиваетесь с проблемами. И если вы делаете, это, скорее всего, вызвано другими вещами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...