Быстрое переключение между режимами «PROD» и «DEV» - PullRequest
0 голосов
/ 03 июля 2019

Я разрабатываю код VBA с использованием некоторых расширенных автоматизированных макросов, которые выполняют «прокладку» и дополнительную отладку на этапе DEV.Однако когда я отправляю файлы пользователям (фаза PROD), я хочу, чтобы все это было отключено.

Эти переключения между DEV и PROD происходят довольно часто (методология git + devops).

Какой самый лучший / самый элегантный способ реализовать быстрое «переключение» между DEV и PROD?Да, я мог бы просто использовать глобальный Const isDebug (и я делал это для некоторых проектов), но он обременителен, неэлегатичен и подвержен ошибкам (не раз я забыл «щелкнуть» переключателем - как я говорил ранее, быстро и гибко"почти" CI / CD конвейер).

EDIT

Сейчас я использую быстрый грязный хак (я не люблю грязные хаки), который проверяет,файл Excel запускается из папки с моим логином в пути.Если да - значит, я работаю над файлом.Если нет - кто-то другой использует его, и нам не нужны никакие режимы отладки.Но это уродливо, и я могу предвидеть множество проблем (во-первых, завтра кто-то может разрабатывать эти VBA ... поэтому код отладки придется переписать).

Ответы [ 3 ]

1 голос
/ 09 июля 2019

Вы можете использовать текстовый файл в пути к рабочей книге как условие.

Если файл отсутствует (например, «DebugMode.txt») или параметр отладки («DebugMode: On» в текстовом файле) не задан, отключите режим отладки, иначе включите его.

Если вы развертываете книгу без текстового файла, режим отладки отключается.

Если кому-то еще нужен режим отладки, отправьте / создайте файл.

Пример кода:

Function IsDebugMode() As Boolean

Const DebugOptionFileName As String = "DebugMode.txt" 
Const DebugIsOnString As String = "DebugMode:On"
Const ForReading as Long = 1

Dim txtStream As Object
Dim DebugOptionFilePath As String

IsDebugMode = False
DebugOptionFilePath = ThisWorkbook.Path & "\" & DebugOptionFileName

With CreateObject("Scripting.Filesystemobject")
    If .FileExists(DebugOptionFilePath) Then
        Set txtStream = .OpenTextFile(DebugOptionFilePath, ForReading, False)
        Do Until txtStream.AtEndOfStream
            If txtStream.ReadLine = DebugIsOnString Then
                IsDebugMode = True
                Exit Do
            End If
        Loop
    End If
End With

End Function
1 голос
/ 03 июля 2019

В VBE перейдите Доп. Функции -> Свойства VBAProject и введите аргумент для компиляции, например:

DEV_MODE = -1

enter image description here
Извините за скриншот на немецком языке.

Затем используйте следующий код

Option Explicit

Sub test()
    'the following #If is a compile condition
    #If DEV_MODE Then
        'this is only compiled in dev mode
        Debug.Print "debug mode is on"
    #Else
        'this is only compiled in production mode
        Debug.Print "debug mode is off"
    #End If
End Sub

Обратите внимание, что в VBA -1 равно True, а 0 равно False. Переключение аргумента компиляции DEV_MODE = -1 переключит режим разработки во всем проекте VBA.

0 голосов
/ 03 июля 2019

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

Я считаю, что ваша попытка проверить имя пользователя, имя устройства, путь к файлу или тому подобное не так уж и плоха. Просто поместите логику в небольшую функцию isTestMode() (даже если это однострочная строка), которая возвращает boolean. В рамках этой функции легко перейти к логике, если другой человек возьмет на себя работу. Используйте эту функцию (и ничего больше!), Чтобы проверить, выполнять или нет ваши отладочные операторы .

Public Function isTestMode() as boolean
    ' Checking current user
    isTestMode = (environ("Username") = "FunThomas")
    ' Checking device name
    isTestMode = (environ("ComputerName") = "MySuperPC")
    ' Checking if a specific file is present
    isTestMode = Dir(thisworkbook.Path & "\IsTestMode") <> "")
End Function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...