
Хм, однако забавную ситуевину наблюдаю с этой самой "Строкой формул"... .
В общем, обо всем по порядку...
Итак, есть некое приложение, базирующееся на Excel, на начальном этапе загрузки которого происходит следующее:
а) узнается: какие панели инструментов навтыкал себе пользователь, а так же, присутствует ли "Строка формул";
б) все это дело сохраняется в реестре, апосля:
в) удаляется нафих;
г) создается новая панель с одной единственной кнопкой.
С этим проблем никаких не возникло... (см. код-лист ниже)
Дале, я наделил его легкой формой нарциссцизма


Чтобы стало ясней привожу обещанный листинг (модуль "ThisBook"):
- Код: Выделить всё
Dim varCmdBrs As Variant
Dim strCmdBrs As String
Dim z As Byte
Dim strMemCB As String
Dim bytBttn As Byte
'
Private Sub Workbook_Open()
Dim objBk As Workbook
Dim objMyCmdBar As CommandBar
Dim objMyCmdButtn As CommandBarButton
' Если это "MyApp"
If ActiveWorkbook.Name = "MyApp.xls" Then
' Защита от загрузки MyApp, если уже загружена
' какая-либо другая "книга" Excel
If Workbooks.Count > 1 Then
bytBttn = MsgBox(Message("Attn1"), vbExclamation _
+ vbOKCancel, "Внимание!")
Select Case bytBttn
Case vbOK
For Each objBk In Application.Workbooks
With objBk
If Not .Name = "MyApp.xls" Then
.Save
.Close
End If
End With
Next
Case vbCancel
Workbooks("MyApp.xls").Close
Exit Sub
End Select
End If
' Удаление лишних панелей инструментов,
' с запоминанием, как усе було
ArrFill
With Application
For z = LBound(varCmdBrs) To UBound(varCmdBrs)
strCmdBrs = varCmdBrs(z)
If .CommandBars(strCmdBrs).Visible = True Then
MemCB
.CommandBars(strCmdBrs).Visible = False
End If
Next z
If .DisplayFormulaBar = True Then
MemCB
.DisplayFormulaBar = False
End If
' Сохранение настроек панели инструментов
If Not strMemCB = Empty Then SaveSetting "MySettings", _
"SaveSettings", "CmdBarsSettings", strMemCB
' Создание пользовательской панели инструментов "MyBar"
Set objMyCmdBar = .CommandBars.Add(Name:="MyBar", _
Position:=msoBarTop, MenuBar:=False, _
Temporary:=True)
End With
If objMyCmdBar.Visible = False Then
With objMyCmdBar
.Visible = True
.Protection = msoBarNoChangeVisible + msoBarNoCustomize _
+ msoBarNoMove
' Создание кнопки "MyButton"
With .Controls
Set objMyCmdButtn = .Add(Type:=msoControlButton, ID:=1, _
Temporary:=True)
End With
End With
' Установка ее свойств
With objMyCmdButtn
.Caption = "MyButton"
.TooltipText = " Это моя кнопка "
.Style = msoButtonCaption
End With
End If
End If
End Sub
'
' При запуске еще одного приложения ("книги")
Private Sub Workbook_Deactivate()
If ThisWorkbook.Name = "MyApp.xls" Then
With ActiveWorkbook
If Not .Name = "MyApp.xls" Then
bytBttn = MsgBox(Message("Attn2"), vbExclamation _
+ vbOKCancel, "Внимание!")
Select Case bytBttn
Case vbOK
Workbooks("MyApp.xls").Close
Case vbCancel
.Close
End Select
End If
End With
End If
End Sub
'
' Выход из приложения
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim varRcvr As Variant
Dim cmdbBar As CommandBar
Dim n As Byte
If ThisWorkbook.Name = "MyApp.xls" Then
With Workbooks("MyApp.xls")
' Удаление кнопки "MyButton"
For Each cmdbBar In Application.CommandBars
If Not cmdbBar.BuiltIn Then cmdbBar.Delete
Next
' Очистка книги
With Columns("A:G")
.ClearContents
.NumberFormat = "General"
End With
' Восстановление настроек панели инструментов
ArrFill
strMemCB = GetSetting("MySettings", "SaveSettings", _
"CmdBarsSettings")
If Not strMemCB = Empty Then
varRcvr = Split(strMemCB, ",")
With Application
For n = LBound(varRcvr) To UBound(varRcvr)
If Not varRcvr(n) = UBound(varCmdBrs) + 1 Then
strCmdBrs = varCmdBrs(varRcvr(n))
.CommandBars(strCmdBrs).Visible = True
Else
.DisplayFormulaBar = True
End If
Next n
End With
End If
.Save
End With
Else
With ActiveWorkbook
.Save
End With
End If
End Sub
'
' Массив с названиями панелей
Private Sub ArrFill()
varCmdBrs = Array("Standard", "Formatting", "Visual Basic", _
"WordArt", "Web", "External Data", "Borders", _
"Chart", "Protection", "Picture", "Watch Window", _
"Stop Recording", "Reviewing", "Drawing", _
"PivotTable", "Text To Speech", "Forms", _
"Control Toolbox", "Chart Menu Bar", "Clipboard", _
"Shadow Settings", "3-D Settings")
End Sub
'
' Запись настроек панели инструментов
Private Sub MemCB()
If strMemCB = Empty Then
strMemCB = z
Else
strMemCB = strMemCB & "," & z
End If
End Sub
'
' "Мессаги"
Private Function Message(strMsg As String) As String
Select Case strMsg
Case "Attn1"
Message = "Перед запуском этого приложения, " & _
"необходимо" & Chr(13) & "закрыть все активные книги !" & _
Chr(13) & Chr(13) & "Сделать это в автоматическом режиме ?" _
& Chr(13) & "(все данные в них будут сохранены)"
Case "Attn2"
Message = "Если Вы хотите работать с " & Chr(34) & _
ActiveWorkbook.Name & Chr(34) & Chr(13) & " необходимо, " _
& "чтобы " & Chr(34) & "MyApp" & Chr(34) & _
" было закрыто!" & Chr(13) & Chr(13) & "Закрыть его ?" & _
Chr(13) & " (все несохраненные данные будут удалены)"
End Select
End Function
Как из него видно, пользователю предоставляется возможность сделать выбор: с чем работать.
Так вот, восстановление пользовательских настроек панели инструментов и пр. выполняется вполне корректно во всех случаях, кроме единственного,

Вот тут и происходит непонятная весчь - "FormulaBar" (если она была ранее, разумеется) отказывается присутствовать снова.
В связи с чем у меня возникают два вопроса:
1) Откуда "растут ноги" у сей непонятности?
2) Возможен ли альтернативный вариант решения этой задачи (сохранение-восстановление настроек, а в частности - "Строки формул")?
(Решение: оставить несчастную в покое и не дергать заздря - таковым не считаю.)


P.S. Сейчас, после некоторого размышления, пришла мысль, что подобная проблема может возникнуть и со "StatusBar"... Проверил - та же "ботва"...
