Как проверить, есть ли кнопка на панели инструментов?

Программирование на Visual Basic for Applications
lesnik
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 19.07.2006 (Ср) 15:56

Как проверить, есть ли кнопка на панели инструментов?

Сообщение lesnik » 19.07.2006 (Ср) 16:35

В программе создаю Excel'евский файл и макрос в нём. Делаю кнопку на панели инструментов для выполнения макроса. Если программу запускаю несколько раз, этих кнопок становится тоже несколько.
Вопрос: как проверить есть ли эта кнопка на панели (если есть - удалить)? Пока единственное решение, которое нашел - метод .Reset для панели инструментов (но если он сбрасывает всё, что делал пользователь с этой панелью - это не хорошо).

Димитрий
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 194
Зарегистрирован: 26.01.2005 (Ср) 22:47
Откуда: Волгоград

Сообщение Димитрий » 19.07.2006 (Ср) 18:33

Например
'=ess("Сохранить";"Standard")

Public Function Ess(imya As String, bar As String) As Boolean
Dim cb As CommandBarButton
Set cb = CommandBars(bar).Controls(imya)
If Not cb Is Nothing Then Ess = True
End Function

или через FindControl
Sub qqq()
Dim i As Long
' i=CommandBars("Standard").Controls.Add(Type:=msoControlButton, Temporary:=True).ID

Dim cb As CommandBarButton
Set cb = CommandBars("Standard").FindControl(ID:=i)
If Not cb Is Nothing Then MsgBox "Есть ID:=" & i
End Sub

lesnik
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 19.07.2006 (Ср) 15:56

Сообщение lesnik » 20.07.2006 (Чт) 10:20

Типа CommandBarButton среда у меня не находит почему-то.
В программе текст такой (ex-это Excel.application):
Dim cbs As Object 'CommandBars
Dim cb As Object 'CommandBar
Set cbs = ex.CommandBars("Standard")
Dim cbc As Object 'CommandBarControl
Set cbc = cbs.Controls("Восстановить цвета ячеек")
If cbc Is Nothing Then
MsgBox "нет такой!"
Else
MsgBox "есть такая"
End If

Если кнопки на панели нет, то на строке
Set cbc = cbs.Controls("Восстановить цвета ячеек")
вылазит ошибка "Неправильный вызов процедуры или аргумент"
Если есть, то все нормально, без ошибок, срабатывает второй msgbox.

Насчет второго варианта: я закрываю приложение excel после завершения программы, кроме того, возможно, этой кнопкой придется пользоваться несколько раз: открыл файл, поредактировал, закрыл, снова открыл. Поэтому временная кнопка не совсем подходит.

P.S. Стоит VB 6.0 (SP5)
P.P.S. Может, я не понял идеи или что-то не то делаю?

lesnik
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 19.07.2006 (Ср) 15:56

Сообщение lesnik » 20.07.2006 (Чт) 11:46

С типом CommandBarButton разобрался - была подключена только библиотека Excel 11, Office 11 - не было.
Но всё равно ругается, что не верный вызов процедуры или аргумент

Igor_123
Осторожный Баянист
Осторожный Баянист
Аватара пользователя
 
Сообщения: 1325
Зарегистрирован: 21.07.2004 (Ср) 13:00
Откуда: Днепропетровск

Сообщение Igor_123 » 20.07.2006 (Чт) 17:25

Вот код для формы, на ней две кнопки и лейбл. Делал специально для такого случая, добавляет и удаляет две кнопки на панель инструментов и назначает им по макросу. При удалении свои кнопки определяет по имени, при добавлении - поиск определяет свойство тег.
Код: Выделить всё
Option Explicit
Dim AppEx As Object
Dim msButt As Object
Dim bFlag As Boolean

Private Sub cmdDelConfig_Click()
If InitExcel Then
    Call DelButtons
    If bFlag Then
        AppEx.Quit
        Set AppEx = Nothing
    End If
End If
End Sub

Private Sub cmdSetConfig_Click()
If InitExcel Then
    Call AddButtons
    If bFlag Then
        AppEx.Quit
        Set AppEx = Nothing
    End If
End If
End Sub

Private Sub Form_Load()
Label1.Caption = "Программа устанавливает/удаляет конфигурацию Excel'я" _
& " для использования заполнения электронного справочника"
End Sub

Sub AddButtons()
On Error GoTo LabErr
Dim iPos As Long
iPos = AppEx.CommandBars("Formatting").Controls.Count + 1
Set msButt = AppEx.CommandBars("Formatting").FindControl(Type:=1, ID:=2950, Tag:=1005)
If msButt Is Nothing Then
    Set msButt = AppEx.CommandBars("Formatting").Controls.Add(Type:=1, _
        ID:=2950, Before:=iPos)
    With msButt
        .Style = 2
        .Caption = "Внести данные"
        .OnAction = "D:\~RR~\Tools\Справочник\PERS.XLS!PrepareLenght"
        .Tag = 1005
    End With
    iPos = iPos + 1
Else
    If msButt.Caption <> "Внести данные" Then
        Set msButt = AppEx.CommandBars("Formatting").Controls.Add(Type:=1, _
            ID:=2950, Before:=iPos)
        With msButt
            .Style = 2
            .Caption = "Внести данные"
            .OnAction = "D:\~RR~\Tools\Справочник\PERS.XLS!PrepareLenght"
            .Tag = 1005
        End With
        iPos = iPos + 1
    End If
End If
Set msButt = AppEx.CommandBars("Formatting").FindControl(Type:=1, ID:=2950, Tag:=1006)
If msButt Is Nothing Then
    Set msButt = AppEx.CommandBars("Formatting").Controls.Add(Type:=1, _
        ID:=2950, Before:=iPos)
    With msButt
        .Style = 2
        .Caption = "Очистить базу"
        .OnAction = "D:\~RR~\Tools\Справочник\PERS.XLS!ClearDataInBD"
        .Tag = 1006
    End With
Else
    If msButt.Caption <> "Очистить базу" Then
        Set msButt = AppEx.CommandBars("Formatting").Controls.Add(Type:=1, _
            ID:=2950, Before:=iPos)
        With msButt
            .Style = 2
            .Caption = "Очистить базу"
            .OnAction = "D:\~RR~\Tools\Справочник\PERS.XLS!ClearDataInBD"
            .Tag = 1006
        End With
    End If
End If
MsgBox "Excel сконфигурирован для работы."
LabErr:
Set msButt = Nothing
End Sub

Sub DelButtons()
On Error GoTo LabErr
Set msButt = AppEx.CommandBars("Formatting").FindControl(Type:=1, ID:=2950)
If msButt.Caption = "Внести данные" Or msButt.Caption = "Очистить базу" Then
    msButt.Delete
End If
Set msButt = AppEx.CommandBars("Formatting").FindControl(Type:=1, ID:=2950)
If msButt.Caption = "Внести данные" Or msButt.Caption = "Очистить базу" Then
    msButt.Delete
End If
MsgBox "Конфигурация удалена."
LabErr:
Set msButt = Nothing
End Sub

Function InitExcel() As Boolean
    Me.MousePointer = vbHourglass
    InitExcel = False
    On Error Resume Next
    Set AppEx = GetObject(, "Excel.Application")
    If AppEx Is Nothing Then
        Set AppEx = CreateObject("Excel.Application")
        If Not AppEx Is Nothing Then
            InitExcel = True
            bFlag = True
        End If
    Else
        InitExcel = True
        bFlag = False
    End If
    Me.MousePointer = vbDefault
End Function
Водки я вам не обещаю, но погуляем хорошо.
И. Сусанин.

Аватара (с) Тёмыч

lesnik
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 19.07.2006 (Ср) 15:56

Сообщение lesnik » 25.07.2006 (Вт) 11:23

Спасибо за пример, ещё просьба:
скопируй, пожалуйста текст помощи (если у тебя она есть - у меня нет) по методу Findcontrol - что за типы бывают, что такое ID, Tag - это уникальные значения или могут совпадать? Как ты выбирал Id и Tag - с потолка, или ты знаешь, что таких точно нет в Excel'e?

Igor_123
Осторожный Баянист
Осторожный Баянист
Аватара пользователя
 
Сообщения: 1325
Зарегистрирован: 21.07.2004 (Ср) 13:00
Откуда: Днепропетровск

Сообщение Igor_123 » 25.07.2006 (Вт) 12:32

FindControl Method
See AlsoApplies ToExampleSpecificsReturns a CommandBarControl object that fits a specified criteria.

expression.FindControl(Type, Id, Tag, Visible, Recursive)
expression Required. An expression that returns a CommandBars object.

Type Optional MsoControlType. The type of control.

MsoControlType type can be one of these MsoControlType constants.
msoControlActiveX
msoControlAutoCompleteCombo
msoControlButton
msoControlButtonDropdown
msoControlButtonPopup
msoControlComboBox
msoControlCustom
msoControlDropdown
msoControlEdit
msoControlExpandingGrid
msoControlGauge
msoControlGenericDropdown
msoControlGraphicCombo
msoControlGraphicDropdown
msoControlGraphicPopup
msoControlGrid
msoControlLabel
msoControlLabelEx
msoControlOCXDropDown
msoControlPane
msoControlPopup
msoControlSpinner
msoControlSplitButtonMRUPopup
msoControlSplitButtonPopup
msoControlSplitDropdown
msoControlSplitExpandingGrid
msoControlWorkPane

Id Optional Variant. The identifier of the control.

Tag Optional Variant. The tag value of the control.

Visible Optional Variant. True to include only visible command bar controls in the search. The default value is False. Visible command bars include all visible toolbars and any menus that are open at the time the FindControl method is executed.

Recursive Optional Boolean. True to include the command bar and all of its pop-up subtoolbars in the search. This argument only applies to the CommandBar object. The default value is False.

Remarks
If the CommandBars collection contains two or more controls that fit the search criteria, FindControl returns the first control that's found. If no control that fits the criteria is found, FindControl returns Nothing.

Example
This example finds the first control on the command bar named “Custom”. If the control is a button, the example uses the FindControl method to find the Copy button (on the Standard toolbar) and then copies the face from the Copy button and pastes it onto the control.

Set oldCtrl = CommandBars("Custom").Controls(1)
If oldCtrl.Type = 1 Then
Set newCtrl = CommandBars.FindControl(Type:= _
MsoControlButton, ID:= _
CommandBars("Standard").Controls("Copy").ID)
NewCtrl.CopyFace
OldCtrl.PasteFace
End If


ID - это идентификатор настраиваемой кнопки, а тег - от фонаря назначаешь Я взял на всякий случай побольше, что-бы не пересекаться с другим, если есть.
Вставь мой код в редактор ВБА и замени AppEx на Application и по Shift+F2 попадешь на описание функции в ObjectBrowser'е
Водки я вам не обещаю, но погуляем хорошо.
И. Сусанин.

Аватара (с) Тёмыч

Avtopic
Постоялец
Постоялец
 
Сообщения: 442
Зарегистрирован: 30.09.2005 (Пт) 17:15
Откуда: Tbilisi

Сообщение Avtopic » 25.07.2006 (Вт) 12:36

Отвечаю на начальный вопрос автора.
CommandBars.Add и CommandBar.Controls.Add имеют аргумент Temporary
Чувствую, что его вообще не используешь и получается, что кнопка после закрытия остается на панели, а после нового открытия добавляется и добавляется

lesnik
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 19.07.2006 (Ср) 15:56

Сообщение lesnik » 26.07.2006 (Ср) 12:25

to Igor_123: Спасибо за описание и за подсказку: в офисе нашел хелп на VBA - посмотрел на описание функции по Shift+F2. Раз ID и Tag - variant, поставлю какую-нить строку - точно ни с чем не пересечётся.

to Avtopic: Да, параметр Temporary не использую. Дело в том, что мне надо, чтобы кнопка оставалась после повторного открытия документа.
Но за ответ спасибо!

Всем спасибо, помогли!

lesnik
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 19.07.2006 (Ср) 15:56

Сообщение lesnik » 26.07.2006 (Ср) 19:15

Ан, нет, не хочет строку хавать - мол, несовпадение типов... Ну, ладно, будем циферками...


Вернуться в VBA

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

Сейчас этот форум просматривают: Yandex-бот и гости: 62

    TopList