Как определить, отключён ли Application.StatusBar (штатное состояние) или в нём написано "FALSE", How to distinguish between «Application.StatusBar = False» and «Application.StatusBar = "False"»
Приветствую! При получении Application.StatusBar в вариативную переменную, это всегда строка. Отсюда возникает неопределённость — как отделить штатное состояние False от присвоенного значения "False"? Проверка Application.StatusBar = False тоже срабатывает и на строку.
Пока что сделал проверку с гарантированным присвоением
Код
Function PRDX_StatusBar_IsBusy() As Boolean
If Application.StatusBar = False Then Application.StatusBar = False Else PRDX_StatusBar_IsBusy = True
End Function
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Jack Famous написал: штатное состояние False от присвоенного значения "False"
Глобально встроенными средствами VBA - никак. Но можно учитывать тот факт, что если Application.StatusBar = False, то в переменную будет записано значение FALSE в верхнем регистре. Что, конечно, опять же может быть и тем вариантом, что в StatusBar кто-то сам записал значение "FALSE" Хотя лично я ни разу за все время программирования не сталкивался с ситуацией, когда мне необходимо было бы определять подобное состояние StatusBar
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
я неправильно восстанавливал работу статус-бара. Запоминал в вариант, и восстанавливал из него (кто ж знал, что в варианте всё равно находится строка). Этот момент поправил, но стало интересно, как же отделить одно от другого …
Демонстрация
Код
Sub UnCorrect()
Dim x
x = Application.StatusBar ' запоминаем состояние
Application.StatusBar = x ' восстанавливаем неправильно
End Sub
'==================================================================================================
Sub Correct()
Dim s$
s = Application.StatusBar
If s = "FALSE" Then Application.StatusBar = False Else Application.StatusBar = s
End Sub
'==================================================================================================
'==================================================================================================
'==================================================================================================
Sub PRDX_StatusBar_Set(ASB$)
If ASB = "FALSE" Then Application.StatusBar = False Else Application.StatusBar = ASB
End Sub
'==================================================================================================
Sub Correct_ByProc()
Dim s$
s = Application.StatusBar
PRDX_StatusBar_Set s
End Sub
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Dim b As Boolean
Dim old As Variant
Debug.Print VarType(A)
A = Application.StatusBar
Debug.Print VarType(A)
Debug.Print VarType(Application.StatusBar)
old = Application.StatusBar
Application.StatusBar = old
Debug.Print VarType(Application.StatusBar)
Если при открытии приложения тип Application.StatusBar - 11 (Boolen) то после любых действий - 8 (string)
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Я для расчетов в VBA использую следующую схему. Указанные выше фокусы свойства StatusBar учитываются (см. обработку переменной StatusBarFalse).
Код
Option Explicit
Dim StatusBarFalse ' текстовое значение свойства StatusBar, соответствующее false
' Схема вызова расчета
Sub MyCalc()
Dim app_prop
app_prop = AppPropFreeze()
' Здесь операторы самого расчета
' -------------------------------
AppPropRestore app_prop
End Sub
' Замораживает изменения экрана, переводит вычисления в ручной режим и возвращает исходные значения измененных свойств
Function AppPropFreeze() As Variant
Dim arr(1 To 4)
On Error Resume Next
arr(1) = Application.ScreenUpdating
arr(2) = Application.Calculation
arr(3) = Application.StatusBar
arr(4) = Application.ReferenceStyle
If arr(2) = Empty Then
arr(2) = xlCalculationAutomatic
End If
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
AppPropFreeze = arr
End Function
' Устанавливает свойства Application на значения, возвращенные функцией AppPropFreeze
Sub AppPropRestore(ByVal arr)
If Not IsArray(arr) Then
Exit Sub
End If
Application.ScreenUpdating = arr(1)
On Error Resume Next
Application.Calculation = arr(2)
If Err.Number <> 0 Then
DoEvents
Application.Calculate
DoEvents
Application.Calculation = arr(2)
DoEvents
End If
If IsEmpty(StatusBarFalse) Then
Application.StatusBar = False
StatusBarFalse = Application.StatusBar
End If
Application.StatusBar = IIf(arr(3) = StatusBarFalse, False, arr(3))
Application.ReferenceStyle = arr(4)
End Sub
'==================================================================================================
Sub PRDX_StatusBar_Set(ASB$)
If ASB = "FALSE" Then Application.StatusBar = False Else Application.StatusBar = ASB
End Sub
'==================================================================================================
Sub PRDX_Param_App_Keep(AC&, ASU As Boolean, Optional ADA, Optional AEE, Optional ARS, Optional ASB)
ASU = Application.ScreenUpdating: Application.ScreenUpdating = False
AC = Application.Calculation: Application.Calculation = xlCalculationManual
If Not IsMissing(ADA) Then ADA = Application.DisplayAlerts: Application.DisplayAlerts = False
If Not IsMissing(AEE) Then AEE = Application.EnableEvents: Application.EnableEvents = False
If Not IsMissing(ARS) Then ARS = Application.ReferenceStyle: Application.ReferenceStyle = xlA1
If Not IsMissing(ASB) Then ASB = Application.StatusBar
End Sub
'--------------------------------------------------------------------------------------------------
Sub PRDX_Param_App_Return(AC&, ASU As Boolean, Optional ADA, Optional AEE, Optional ARS, Optional ASB)
Application.Calculation = AC
Application.ScreenUpdating = ASU
If Not IsMissing(ADA) Then Application.DisplayAlerts = ADA
If Not IsMissing(AEE) Then Application.EnableEvents = AEE
If Not IsMissing(ARS) Then Application.ReferenceStyle = ARS
If Not IsMissing(ASB) Then PRDX_StatusBar_Set CStr(ASB)
End Sub
'==================================================================================================
Function ExampleCall() As Boolean
Dim ASB$, AC&, ASU As Boolean
PRDX_Param_App_Keep AC, ASU, , , , ASB
Application.StatusBar = "I'm Working"
' Code
' If ERROR Then GoTo ex
' Code
ExampleCall = True
ex: PRDX_Param_App_Return AC, ASU, , , , ASB
End Function
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Выяснилось, что иногда StatusBar может возвращать булево значение (в строке) по локали. Теперь так делаю.
Код
Function PRDX_StatusBar_IsBusy_ByStrVal(ByVal ASB$) As Boolean
ASB = LCase$(ASB)
If ((ASB = "false") Or (ASB = "ложь")) Then Exit Function
PRDX_StatusBar_IsBusy_ByStrVal = True
End Function
'--------------------------------------------------------------------------------------------------
Function PRDX_StatusBar_IsBusy() As Boolean
PRDX_StatusBar_IsBusy = PRDX_StatusBar_IsBusy_ByStrVal(Application.StatusBar)
End Function
'--------------------------------------------------------------------------------------------------
Sub PRDX_StatusBar_Set(ASB$)
If PRDX_StatusBar_IsBusy_ByStrVal(ASB) Then Application.StatusBar = ASB Else Application.StatusBar = False
End Sub
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄