Эта загадочная "FormulaBar" (F1 me).

Программирование на Visual Basic for Applications
Ig
Обычный пользователь
Обычный пользователь
 
Сообщения: 73
Зарегистрирован: 30.04.2005 (Сб) 12:37
Откуда: Far East

Эта загадочная "FormulaBar" (F1 me).

Сообщение Ig » 03.05.2005 (Вт) 5:18

Здравствуйте всем :!:

Хм, однако забавную ситуевину наблюдаю с этой самой "Строкой формул"... .

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

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

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

Вернуться в VBA

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

    TopList