Страницы: 1
RSS
Как определить, отключён ли Application.StatusBar (штатное состояние) или в нём написано "FALSE", How to distinguish between «Application.StatusBar = False» and «Application.StatusBar = "False"»
 
Приветствую!
    При получении Application.StatusBar в вариативную переменную, это всегда строка. Отсюда возникает неопределённость — как отделить штатное состояние False от присвоенного значения "False"?
    Проверка Application.StatusBar = False тоже срабатывает и на строку.
Пока что сделал проверку с гарантированным присвоением
Изменено: Jack Famous - 09.08.2023 15:23:04
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал:
штатное состояние False от присвоенного значения "False"
Глобально встроенными средствами VBA - никак. Но можно учитывать тот факт, что если Application.StatusBar = False, то в переменную будет записано значение FALSE в верхнем регистре. Что, конечно, опять же может быть и тем вариантом, что в StatusBar кто-то сам записал значение "FALSE" :)
Хотя лично я ни разу за все время программирования не сталкивался с ситуацией, когда мне необходимо было бы определять подобное состояние StatusBar :)
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Дмитрий(The_Prist) Щербаков, спасибо  :)
Цитата
Дмитрий(The_Prist) Щербаков: Хотя лично я ни разу за все время программирования не сталкивался с ситуацией
я неправильно восстанавливал работу статус-бара. Запоминал в вариант, и восстанавливал из него (кто ж знал, что в варианте всё равно находится строка). Этот момент поправил, но стало интересно, как же отделить одно от другого …
Демонстрация
Изменено: Jack Famous - 09.08.2023 15:37:21
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Забавно
Код
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)
По вопросам из тем форума, личку не читаю.
 
Цитата
БМВ: Забавно
обхохочешься  :D Спасибо за наблюдение  :idea:
Чуть дополнил проверки и оформил в процедуру
Изменено: Jack Famous - 10.08.2023 10:21:13
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Я для расчетов в 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
Владимир
 
sokol92, спасибо!
Делюсь своими наработками
Изменено: Jack Famous - 10.08.2023 15:07:12
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Выяснилось, что иногда StatusBar может возвращать булево значение (в строке) по локали. Теперь так делаю.
Изменено: Jack Famous - 15.04.2024 18:10:30
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Страницы: 1
Наверх