Как добавить свой пункт меню в excel

После того, как вы создали раскрывающийся список, вам может понадобиться добавлять в него дополнительные элементы или удалять имеющиеся. В этой статье мы покажем, как изменять списки, созданные разными способами.

Изменение раскрывающегося списка, основанного на таблице Excel

Если источником вашего списка является таблица Excel, достаточно просто добавить элементы в список или удалить их из него, а Excel автоматически обновит все связанные раскрывающиеся списки.

Выбор источника в окне "Проверка вводимых значений"

  • Чтобы добавить элемент, перейдите в конец списка и введите новый элемент.

  • Чтобы удалить элемент, нажмите кнопку Удалить.

    Совет: Если удаляемый элемент находится в середине списка, щелкните его правой кнопкой мыши, выберите пункт Удалить, а затем нажмите кнопку ОК, чтобы сдвинуть ячейки вверх.

  1. Откройте лист, содержащий именованный диапазон для раскрывающегося списка.

  2. Выполните одно из указанных ниже действий.

    • Чтобы добавить элемент, перейдите в конец списка и введите новый элемент.

    • Чтобы удалить элемент, нажмите кнопку Удалить.

      Совет: Если удаляемый элемент находится в середине списка, щелкните его правой кнопкой мыши, выберите пункт Удалить, а затем нажмите кнопку ОК, чтобы сдвинуть ячейки вверх.

  3. На вкладке Формулы нажмите кнопку Диспетчер имен.

  4. В поле Диспетчер имен выберите именованный диапазон, который требуется обновить.

    Диспетчер имен

  5. Щелкните поле Диапазон, а затем на листе выберите все ячейки, содержащие записи для раскрывающегося списка.

  6. Нажмите кнопку Закрыть и в появившемся диалоговом окне нажмите кнопку Да, чтобы сохранить изменения.

Совет: Чтобы определить именованный диапазон, выделите его и найдите его имя в поле Имя. Сведения о поиске именованных диапазонов см. в статье Поиск именованных диапазонов.

Название именованного диапазона в поле имени

  1. Откройте лист, содержащий данные для раскрывающегося списка.

  2. Выполните одно из указанных ниже действий.

    • Чтобы добавить элемент, перейдите в конец списка и введите новый элемент.

    • Чтобы удалить элемент, нажмите кнопку Удалить.

      Совет: Если удаляемый элемент находится в середине списка, щелкните его правой кнопкой мыши, выберите пункт Удалить, а затем нажмите кнопку ОК, чтобы сдвинуть ячейки вверх.

  3. На листе с раскрывающимся списком выделите содержащую список ячейку.

  4. На вкладке Данные нажмите кнопку Проверка данных.

  5. В диалоговом окне на вкладке Параметры щелкните поле Источник, а затем на листе с записями для раскрывающегося списка выберите все ячейки, содержащие эти записи. После выделения ячеек вы увидите, как изменится диапазон списка в поле «Источник».

    Диапазон в качестве источника раскрывающегося списка

  6. Чтобы обновить все ячейки, к которым применен один и тот же раскрывающийся список, установите флажок Распространить изменения на другие ячейки с тем же условием.

  1. На листе с раскрывающимся списком выделите содержащую список ячейку.

  2. На вкладке Данные нажмите кнопку Проверка данных.

  3. На вкладке Параметры щелкните поле Источник и измените нужные элементы списка. Элементы должны быть разделены точкой с запятой, без пробелов между ними следующим образом: Да;Нет;Возможно

    Ввод источника раскрывающегося списка вручную

  4. Чтобы обновить все ячейки, к которым применен один и тот же раскрывающийся список, установите флажок Распространить изменения на другие ячейки с тем же условием.

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

Если список записей для раскрывающегося списка находится на другом листе и вы хотите запретить пользователям его просмотр и изменение, скройте и защитите этот лист. Подробнее о защите листов читайте в статье Блокировка ячеек.

Если вам нужно удалить раскрывающийся список, см. статью Удаление раскрывающегося списка.

Чтобы просмотреть видео о том, как работать с раскрывающимися списками, см. статью Создание раскрывающихся списков и управление ими.

Изменение раскрывающегося списка, основанного на таблице Excel

Если источником вашего списка является таблица Excel, достаточно просто добавить элементы в список или удалить их из него, а Excel автоматически обновит все связанные раскрывающиеся списки.

Выбор источника в окне "Проверка вводимых значений"

  • Чтобы добавить элемент, перейдите в конец списка и введите новый элемент.

  • Чтобы удалить элемент, нажмите кнопку Удалить.

    Совет: Если удаляемый элемент находится в середине списка, щелкните его правой кнопкой мыши, выберите пункт Удалить, а затем нажмите кнопку ОК, чтобы сдвинуть ячейки вверх.

  1. Откройте лист, содержащий именованный диапазон для раскрывающегося списка.

  2. Выполните одно из указанных ниже действий.

    • Чтобы добавить элемент, перейдите в конец списка и введите новый элемент.

    • Чтобы удалить элемент, нажмите кнопку Удалить.

      Совет: Если удаляемый элемент находится в середине списка, щелкните его правой кнопкой мыши, выберите пункт Удалить, а затем нажмите кнопку ОК, чтобы сдвинуть ячейки вверх.

  3. На вкладке Формулы нажмите кнопку Диспетчер имен.

  4. В поле Диспетчер имен выберите именованный диапазон, который требуется обновить.

    Диспетчер имен

  5. Щелкните поле Диапазон, а затем на листе выберите все ячейки, содержащие записи для раскрывающегося списка.

  6. Нажмите кнопку Закрыть и в появившемся диалоговом окне нажмите кнопку Да, чтобы сохранить изменения.

Совет: Чтобы определить именованный диапазон, выделите его и найдите его имя в поле Имя. Сведения о поиске именованных диапазонов см. в статье Поиск именованных диапазонов.

Название именованного диапазона в поле имени

  1. Откройте лист, содержащий данные для раскрывающегося списка.

  2. Выполните одно из указанных ниже действий.

    • Чтобы добавить элемент, перейдите в конец списка и введите новый элемент.

    • Чтобы удалить элемент, нажмите кнопку Удалить.

      Совет: Если удаляемый элемент находится в середине списка, щелкните его правой кнопкой мыши, выберите пункт Удалить, а затем нажмите кнопку ОК, чтобы сдвинуть ячейки вверх.

  3. На листе с раскрывающимся списком выделите содержащую список ячейку.

  4. На вкладке Данные нажмите кнопку Проверка данных.

  5. В диалоговом окне на вкладке Параметры щелкните поле Источник, а затем на листе с записями для раскрывающегося списка выделите содержимое ячеек в Excel, в которых находятся эти записи. После выделения ячеек вы увидите, как изменится диапазон списка в поле «Источник».

    Диапазон в качестве источника раскрывающегося списка

  6. Чтобы обновить все ячейки, к которым применен один и тот же раскрывающийся список, установите флажок Распространить изменения на другие ячейки с тем же условием.

  1. На листе с раскрывающимся списком выделите содержащую список ячейку.

  2. На вкладке Данные нажмите кнопку Проверка данных.

  3. На вкладке Параметры щелкните поле Источник и измените нужные элементы списка. Элементы должны быть разделены точкой с запятой, без пробелов между ними следующим образом: Да;Нет;Возможно

    Ввод источника раскрывающегося списка вручную

  4. Чтобы обновить все ячейки, к которым применен один и тот же раскрывающийся список, установите флажок Распространить изменения на другие ячейки с тем же условием.

В Excel в Интернете можно изменять только тот раскрывающийся список, в котором исходные данные введены вручную.

  1. Выделите ячейки, в которых расположен раскрывающийся список.

  2. Выберите пункт Данные > Проверка данных.

  3. На вкладке Параметры щелкните в поле Источник. Затем выполните одно из указанных ниже действий.

    • Если поле «Источник» содержит записи раскрывающегося списка, разделенные запятыми, введите новые записи или удалите ненужные. После завершения записи должны быть разделены запятыми без пробелов. Например: Фрукты,Овощи,Мясо,Закуски.

    • Если поле «Источник» содержит ссылку на диапазон ячеек (например, =$A$2:$A$5), нажмите кнопку Отмена, а затем добавьте или удалите записи из этих ячеек. В этом примере можно добавить или удалить записи в ячейках А2–А5. Если окончательный список записей оказался больше или меньше исходного диапазона, вернитесь на вкладку Параметры и удалите содержимое поля Источник. Затем щелкните и перетащите указатель, чтобы выделить новый диапазон, содержащий записи.

    • Если поле «Источник» содержит именованный диапазон, например, «Отделы», необходимо изменить сам диапазон с помощью классической версии Excel.

После обновления раскрывающегося списка убедитесь, что он работает так, как нужно. Например, проверьте, достаточно ли ширины ячеек для отображения ваших обновленных записей. Если вам нужно удалить раскрывающийся список, см. статью Удаление раскрывающегося списка.

Дополнительные сведения

Вы всегда можете задать вопрос специалисту Excel Tech Community или попросить помощи в сообществе Answers community.

См. также

Создание раскрывающегося списка

Применение проверки данных к ячейкам

Видео: создание раскрывающихся списков и управление ими

0 / 0 / 0

Регистрация: 01.12.2011

Сообщений: 25

1

11.09.2006, 20:36. Показов 20399. Ответов 7


Студворк — интернет-сервис помощи студентам

Здравствуйте всем.

Подскажите, пожалуйста, каким образом можно добавить собственный пункт в контекстное меню Excel.

Спасибо.

Вопрос администратору, у меня не работает поиск по форуму при вводе образца для поиска русскими буквами (англ — ОК!). При задании «Контекстное меню» получаю следующее: Sorry the application encountered an unexpected error. Information about this error has been logged. If you continue to receive this message please contact the board administrator. Можно ли это исправить?



0



VladConn

5 / 5 / 3

Регистрация: 17.10.2007

Сообщений: 1,119

12.09.2006, 02:30

2

Nevsky, наверно так:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Sub AddPopUpSubMenu()
  Dim objCmdBrBtn As CommandBarButton
  
  Set objCmdBrBtn = CommandBars("Cell").Controls.Add(msoControlButton, , , , True)
  
  With objCmdBrBtn
    .Caption = "Мой Личный Новенький Пункт! "
    .DescriptionText = "Да, да - мой личный"
    .Enabled = True
    .OnAction = "MyNewPopUpSubMenu"
    .TooltipText = "Мой тул тип для моего пункта"
    .Visible = True
    .FaceId = 2
  End With
End Sub
Sub MyNewPopUpSubMenu()
  MsgBox "Вуа Ля!"
End Sub



2



Nevsky

0 / 0 / 0

Регистрация: 01.12.2011

Сообщений: 25

13.09.2006, 16:00

 [ТС]

3

Спасибо большое, Влад, за пример.

В коде, что я использовал, пункт меню остается постоянно, а также есть варианты по использованию в зависимости от поставленной задачи.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, _
        Cancel As Boolean)
    Dim icbc As Object
    For Each icbc In Application.CommandBars("cell").Controls
        If icbc.Tag = "brccm" Then icbc.Delete
    Next icbc
 
    If Not Application.Intersect(Target, Range("b1:b10")) _
         Is Nothing Then
                    With Application.CommandBars("cell").Controls _
                .Add(Type:=msoControlButton, before:=1, _
                temporary:=False)
           .Caption = "Подпись"
           .OnAction = "Макрос"
           .Tag = "brccm"
        End With
   End If
End Sub



0



0 / 0 / 0

Регистрация: 24.04.2010

Сообщений: 29

10.10.2006, 22:57

4

А как потом этот пункт удалить?
Я вижу, что он удаляется, если кликнуть вне диапазона, а как его удалить, если следующий клик будет уже на другом листе? В общем как удалить пункт меню, после запуска выполняемого им макроса?



0



Avtopic

2 / 2 / 0

Регистрация: 23.04.2011

Сообщений: 159

11.10.2006, 18:18

5

Чтобы вообще не беспокоится об удалении, если требуется в контекстное меню что-то поменять, я делаю так:

В самом начале (напр. в Open) копирую все меню “cell” в новое, собственное “My_cell”.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Public Sub New_Commandbar() 
Dim Cbr As CommandBar, Ctr As CommandBarControl 
On Error Resume Next 
Application.CommandBars("My_cell").Delete 
Application.CommandBars.Add Name:="My_cell", Position:=msoBarPopup, Temporary:=True 
For Each Ctr In Application.CommandBars("cell").Controls 
    With Application.CommandBars("My_cell").Controls.Add(Ctr.Type, Ctr.ID, Ctr.Parameter, , 1) 
        .Caption = Ctr.Caption 
'       .OnAction = Ctr.OnAction 
        .BeginGroup = Ctr.BeginGroup
‘ Копировать также используя CopyButton или CopyControl не помню как называется метод.
    End With 
Next 
End Sub

В Workbook_SheetBeforeRightClick ставлю:

Visual Basic
1
2
3
4
Private Sub Workbook_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean) 
  Cancel = True
  New_Commandbar
  Application.CommandBars("My_cell").Show



0



rediffusion

5 / 5 / 0

Регистрация: 13.11.2016

Сообщений: 90

24.04.2019, 22:01

6

Всем ку!

Нашёл скрипт «VBA» который немного подправил под свои нужды:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Sub Спец_Примечание()
Dim myComm As Comment
  If Not ActiveCell.Comment Is Nothing Then
    If MsgBox("Ячейка уже содержит примечание, удалить?", 4) - 7 Then
      ActiveCell.Comment.Delete
    Else: Exit Sub
    End If
  End If
 
  Set myComm = ActiveCell.AddComment
  With myComm.Shape 'выставляем требуемый формат
    .Height = 110
    .Width = 200
    .AutoShapeType = 1             'форма
    .Fill.ForeColor.SchemeColor = 13 'заливка
    .Line.ForeColor.RGB = RGB(255, 0, 0) 'цвет линии
    .DrawingObject.Font.Name = "Consolas" 'шрифт
    .DrawingObject.Font.FontStyle = "обычный"
    .DrawingObject.Font.Size = 9    'размер шрифта
  End With
  'эмулируем выбор пункта "Изменить примечание"
  SendKeys "%": SendKeys "а": SendKeys "и": SendKeys "и": SendKeys "~": SendKeys "{BS}": SendKeys "{BS}"
End Sub

Он работает отлично!
Но я захотел добавить пункт в «Контекстное Меню». Файл «PERSONAL.XLSB» в папке XLSTART создан скрипты сохраняются и работают во всех «Excel» документах. Но ничего не добавляется в «Контекстное Меню». Для этого дела использовал такой скрипт:

Visual Basic
1
2
3
4
5
6
7
Sub SHD_CommAdd()
Dim MyPoint As CommandBarControl
  Set MyPoint = Application.CommandBars("Cell").Controls.Add
  MyPoint.Caption = "Спец примечание"
  MyPoint.OnAction = "PERSONAL.XLSB!AddComm"
  MyPoint.Move , 10
End Sub

Получаю окно с такой формулировкой:
Не удается выполнить макрос «PERSONAL.XLSB’AddComm». Возможно, этот макрос отсутствует в текущей книге либо все макросы отключены.
Вообщем погуглил и нашёл такое «Для добавления макроса в контекстное меню нужно сохранять в ЭТА КНИГА».
Есть какое лекарство? Мне не удобно если только в одном документе будет добавлен пункт, удобно когда во всех документах.

P.S.
Для отмены есть такой скрипт (кстати он робит):

Visual Basic
1
2
3
Sub KMRangeClear()
  Application.CommandBars("Cell").Reset
End Sub

UPD:

:=::=::=::=::=::=::=::=::=::=::=::=::=::=::=::
1. Если создали примечание то функция для возврата «CTRL+Z» не робит (с обычным примечанием робит). Как вернуть работоспособность?
2. Если в контекстное меню добавили несколько пунктов (вызываемых через ПКМ). Как удалить выборочно (ещё раз повторю что эта штука не работает во всех доках, только в одном)? Например:
Спец примечание_1
Спец примечание_2
Спец примечание_3
Хочу удалить только «Спец примечание_1» как реализовать в макросе?
:=::=::=::=::=::=::=::=::=::=::=::=::=::=::=::



0



11482 / 3773 / 677

Регистрация: 13.02.2009

Сообщений: 11,145

24.04.2019, 22:48

7



0



5 / 5 / 0

Регистрация: 13.11.2016

Сообщений: 90

12.06.2019, 20:14

8

Alex77755,

Привет! Вот решение данного вопроса. Работает сам пользуюсь доволен как слон!



0



Программное добавление кнопки в контекстное меню ячейки (строки, столбца) из кода VBA Excel. Свойство CommandBars объекта Application.

Свойство Application.CommandBars

Свойство CommandBars объекта Application возвращает коллекцию командных панелей Microsoft Excel.

Примеры командных панелей, вызываемых кликом правой кнопки мыши (контекстных меню):

  • CommandBars(«Cell») – контекстное меню ячейки;
  • CommandBars(«Row») – контекстное меню строки;
  • CommandBars(«Column») – контекстное меню столбца.

Добавление кнопки из кода VBA Excel в контекстное меню ячейки. Кнопки в контекстные меню строк и столбцов добавляются аналогично.

‘Объявляем объектную переменную cmdBarBut

Dim cmdBarBut As CommandBarButton

‘Создаем временную (Temporary:=True) кнопку для контекстного

‘меню ячейки и присваиваем ссылку на нее переменной cmdBarBut

Set cmdBarBut = Application.CommandBars(«Cell»).Controls.Add(Temporary:=True)

With cmdBarBut

   ‘Присваиваем кнопке название

   .Caption = «Новая кнопка»

   ‘Задаем отображение в контекстном меню только названия кнопки

   .Style = msoButtonCaption

   ‘Назначаем кнопке процедуру (макрос)

   .OnAction = «MySub»

End With

Если хотите создать постоянную кнопку для контекстного меню, используйте параметр Temporary метода Controls.Add в значении False, которое применяется по умолчанию:

Set cmdBarBut = Application.CommandBars(«Cell»).Controls.Add

Созданная предыдущим кодом VBA временная кнопка контекстного меню ячейки будет утилизирована только при закрытии приложения Microsoft Excel. Это означает, что если в приложении открыты несколько книг, тогда после закрытия книги с кодом, создавшим кнопку, она продолжит существование и будет доступна из других открытых книг. Если это не желательно, можно удалить кнопку следующей строкой:

Application.CommandBars(«Cell»).Controls(«Новая кнопка»).Delete

Эта же строка удалит и постоянную кнопку.

Примеры добавления и удаления кнопок

Пример 1

Добавление кнопки в контекстное меню ячейки из кода VBA Excel при открытии книги и удаление кнопки при закрытии книги.

Добавление кнопки (код размещается в модуле книги):

Private Sub Workbook_Activate()

Dim cmdBarBut As CommandBarButton

    On Error Resume Next

        Set cmdBarBut = Application.CommandBars(«Cell»).Controls.Add(Temporary:=True)

            With cmdBarBut

               .Caption = «Новая кнопка»

               .Style = msoButtonCaption

               .OnAction = «MySub»

            End With

    On Error GoTo 0

End Sub

Удаление кнопки (код размещается в модуле книги):

Private Sub Workbook_Deactivate()

    On Error Resume Next

        Application.CommandBars(«Cell»).Controls(«Новая кнопка»).Delete

    On Error GoTo 0

End Sub

Вызываемая процедура (код размещается в стандартном модуле):

Sub MySub()

    MsgBox «Кнопка работает!»

End Sub

Пример 2

Добавление кнопки в контекстное меню ячейки из кода VBA Excel при открытии контекстного меню и удаление кнопки при завершении вызываемой процедуры.

Добавление кнопки (код размещается в модуле книги):

Private Sub Workbook_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)

Dim cmdBarBut As CommandBarButton

    On Error Resume Next

        With Application

            ‘Удаляем ранее созданную кнопку, если она не была

            ‘нажата и не была удалена назначенным ей макросом

            .CommandBars(«Cell»).Controls(«Новая кнопка»).Delete

            Set cmdBarBut = .CommandBars(«Cell»).Controls.Add(Temporary:=True)

        End With

        With cmdBarBut

           .Caption = «Новая кнопка»

           .Style = msoButtonCaption

           .OnAction = «MySub»

        End With

    On Error GoTo 0

End Sub

Удаление кнопки при закрытии книги, если она при вызове контекстного меню не была нажата и не была удалена назначенным ей макросом (код размещается в модуле книги):

Private Sub Workbook_Deactivate()

    On Error Resume Next

        Application.CommandBars(«Cell»).Controls(«Новая кнопка»).Delete

    On Error GoTo 0

End Sub

Вызываемая процедура с кодом удаления вызвавшей ее кнопки из контекстного меню (код размещается в стандартном модуле):

Sub MySub()

MsgBox «Кнопка работает!»

    On Error Resume Next

        Application.CommandBars(«Cell»).Controls(«Новая кнопка»).Delete

    On Error GoTo 0

End Sub

 

Всем привет и приятного ожидания Нового года, имени БЕЛОГО ТИГРА111  
УважаемыйЮрий М ! Очень и сильно вас прошу помочь мне сделать так, чтобы эта форма запускалася и кнопкой, и с контекстного меню. И. если вам не трудно, напишите пошагово: «как добавить собственный пункт в контекстное меню?». Сам попробовал это сделать, на вашем же примере, но ничего не получилось. Кое какую информацию по этому поводу нашел, но так ничего и не понял. Файл со своей неудачной попыткой, прилагаю.  
С уважением, Gleоd!

 

Пардон! Забыл прикрепить файл

 

The_Prist СПАСИБО!!!  
Вечером попробую еще раз.

 

С веселым приветом и хорошими новогодними пожеланиями Gleod!!!  
Сапсем не понимаю, почему без конца множатся пункты меню? Вродибы усе сделал правильно …)  
С уважением, Gleod!

 

The_Prist!  
Сначала скажу «откуда ноги выросли». Просто я попытался заменить текст «Выбор параметра» в даном макросе на «Ввод даных по зарплате». При этом сам догадался о том, какие операции выполняют упоминаемые вами строки этого макроса. После чего и началась эта чехарда.  
А уже потом, пытаясь удалить появляющиеся лишние строки в меню, стал менять выражение («Ввод даных» на другие в строке «Application.CommandBars(«Cell»).Controls(«Ввод даных»).Delete№. И запуская макрос PopupMenuDelete. Чем «наплодил» кучу лишних пунктов в контекстном меню.А теперь не знаю как их удалить???  
Самое интересное то, что  и тогда, и сейчас понимаю тот факт, что одну свою ошибку, япытался исправить другой, своей же, ошибкой.  «Гениально» — с моей стороны!Не правда ли?  
Отсюда вопрос. Можно, или нет, удалить эти лишние строки в контекстменю вручную?

 

The_Prist!  
Спасибо! Все лишнее удалилось.  
И еще скажите мне пожалуйста! По идее этот пункт после закрытия книги, должен из меню удаляться? Или нет?  
Почему спрашиваю. Только лищь потому, что он появляется и в меню, когда я открываю чистую книгу. А по большому счету, это мне , пока не мешает.

 

{quote}{login=The_Prist}{date=30.12.2009 02:50}{thema=}{post}Да, необходимо, чтоб в модуле ЭтаКнига на события открытия и закрытия книги был прописан запуск этих процедур.{/post}{/quote}  

  Но этого я пока, делать не умею! Если не трудно, покажите как?

 

The_Prist! Для начала позвольте поздравить Вас и, увашем лице всех форумчан Планеты, с наступающим Новым годом. Пожелать всем вам в Новом году, много желанного счатья, сто пудов здоровья, непроходящей и незабвеной любови к противоположному полу , кучу здоровых, красивых, умных и послушных деток, а также всего того материального, чего вы желаете себе иметь!!! Далее. Форма fine works. В последнем варианте, я даже добавил возможность передвигаться по листу посредством специальных стрелок. Гляньте, пожалуйста! Может надо че поправить. И если можно как то задецствоватьImage2 с плюсиком по средине (например, предусмотреть возможность увеличения или уменьшения шага передвижения курсора, через одну, две и так далее ячейки (но это нге обязательно). Затем, я не знаю, как сделать, чтобы в Label2 отображалось не имена ячеек, а, например: при движении по столбцам – имя именованого диапазона (для примера, я присвоил несколько имен, см. в таблице); а при движении курсора по строкам ФИО работника (для примера вставил столбец с ФИО, может здесь и не догичный, но в других таблицах очень нужон столбец). Причем, независимо от того, в какой ячейке даной таблицы, находится курсор. И наконец. Сегодня, пол дня мучился, чтобы прицепить этот калькулятор на форму ВБА, с занесением даных из табло в текстовое поле (см. в таблице вызывается кнопкой «Показать форму») и нифига не получилось. Помогите мне пожалуйста с этим справиться! А конкретного образца, не нашщел. Хотя долго искал. Если можно, не ругайте меня пожалуйста, за много вопросов. И по желанию сделайте, хотя бы то, чего сочтете достойным вашего внимания. А остальном, может помоеут другие форумчане. Заранее спасибо! <BR><STRONG>Файл удален</STRONG> — велик размер. [Модераторы]

 

Извините! Высылаю в архиве

 

Затем, я не знаю, как сделать, чтобы в Label2 отображалось не имена ячеек, а, например: при движении по столбцам – имя именованого диапазона (для примера, я присвоил несколько имен, см. в таблице); а при движении курсора по строкам ФИО работника (для примера вставил столбец с ФИО, может здесь и не догичный, но в других таблицах очень нужон столбец). Причем, независимо от того, в какой ячейке даной таблицы, находится курсор.  

  Движение по столбцам — имется ввиду движение курсора вправо или влево.  
А движение по строкам — движение курсора вверх или вниз.

 

Поздравляю всех, всех, всех с уже пришедшим к нам Новым годом и наступающим Рождеством Христовым!  
И может быть кто поможет сделать так, чтобы в Label2 отображалось не имена ячеек, а, например: при движении по столбцам – имя именованого диапазона (для примера, я присвоил несколько имен, см. в таблице); а при движении курсора по строкам ФИО работника (для примера вставил столбец с ФИО, может здесь и не догичный, но в других таблицах очень нужон столбец). Причем, независимо от того, в какой ячейке даной таблицы, находится курсор.  
При этом, под движением курсора по столбцам – следует понимать движение курсора вправо или влево.  
А движение по строкам — движение курсора вверх или вниз. Пример см. в ранее отправленом post_88053.rar.  
С уважением, Gleod!!!

 

Юрий М

Модератор

Сообщений: 60583
Регистрация: 14.09.2012

Контакты см. в профиле

Вот, подготовил Вам пример. Шаг перемещения регулируется, диапазон (в текстовом виде, а не его вычисленное имя) отображается.  
Вместе с тем хочу заметить, что данный вопрос никакого отношения к заявленной теме не имеет. Обычно такие сообщения удаляются. В Правилах чётко написано про темы и новые вопросы. Но, зная Ваше трепетное отношение к модераторам этого Форума, решил пока не удалять. Иначе опять Вы во всём будете видеть происки сил тьмы. Кстати, все (или почти все), у кого случались такие накладки, на удаление вопроса не обижались, а просто создавали новую тему с этим НОВЫМ вопросом. См. Пример.

 

Юрий М

Модератор

Сообщений: 60583
Регистрация: 14.09.2012

Контакты см. в профиле

Кстати, кто знает, как определить принадлежность активной ячейки к именованному диапазону (если Intersect). Что-то вроде ActiveCell.Range.Name

 

Юрий М!    
Извините меня пожалуйста! Правила нарушил не умышленно. А вообще, то в последнее время я вроди бы уже исправился. И еще раз обещаю вам, что буду сдерживать себя и в будущем.  
А сейчас по теме. Дело в том, что в моем файле что то подобное уже есть, за исключением счетчика, который увеличсивает шаг движения курсора.  
Вот только у вас при активизации ячейки в текстбоксе отображается содержтмое ячейки, а у меня в лейбеле (календарь вызывается через контекстное меню) отображается адресс ячейки.    

  А я бы хотел, чтобы при движении курсора вправо или влево, в моем лейбеле отображались названия именованых дипазонов, которые в имеющейся там таблице уже существуют (см.: Камера, ФИО_работнгика, Марка, Количество, Температура_должна, Температура_есть). А, вот у вашем примере,  не нахожу. А сам не кумекаю сделать.  
Заранее СПАСИБО!

 

Юрий М

Модератор

Сообщений: 60583
Регистрация: 14.09.2012

Контакты см. в профиле

{quote}{login=Gleod}{date=03.01.2010 11:45}{thema=}{post}А я бы хотел, чтобы при движении курсора вправо или влево, в моем лейбеле отображались названия именованых дипазонов{/post}{/quote}  
А разве в моём примере никакая информация не отображается? Загоните ячейку на коричневые или салатовые столбцы. Правда, имя диапазона не вичисляется, а пишется, так сказать, принудительно. Но, думаю, это временно — кто-нибудь подскажет. Чуть выше я написал, что не знаю, как вычислить это имя.

 

Юрий М

Модератор

Сообщений: 60583
Регистрация: 14.09.2012

Контакты см. в профиле

 

Юрий М

Модератор

Сообщений: 60583
Регистрация: 14.09.2012

Контакты см. в профиле

Посмотрите доработанный пример. Prist подсказал, как вычислять имя диапазона, в котором находится активная ячейка. Разберите мой пример, адаптируйте его к Вашей форме. Вы взялись за довольно сложный для начинающего проект, и Вам трудно будет всё сразу понять. Поэтому разбирайте вот на таких небольших примерах. Затем сможете из этих «кубиков» собрать цельную конструкцию.

 

«вычислить можно только пребором»  

  The_Prist! Для меня это еще сложно сделать. А потом, выше я писал, что мне еще нужно, чтобы при движении курсора вверх или вниз,  рядом с Label2  отображалось Ф.И.О. работника. Причем, это Ф.И.О. не должно исчезать,  при движении курсора, в право или в лево по строке, в которой оно находится. И. чтобы появлялось конкретное ФИО , также, независимо от того, в какой ячейке, даной строки, в даный момент  установлен курсор. Справа или слева, от ячейки с этим конкретным ФИО.  
Возможно такое сделать, или нет?  А нужно оно для того, чтобы при внесении информации в невидимую глазу строку, я мог контролировать то, что эта (конкретная) информация, будет проставлена в подобающее ей место. Чтобы стало совсем ясно, прикиньте, что вы заполняете ведомость по зарплате.

 

Юрий М

Модератор

Сообщений: 60583
Регистрация: 14.09.2012

Контакты см. в профиле

Вы выбрали не совсем правильный путь: для заполнения нужных ячеек, совсем необязательно делать их активными. Достаточно выбрать строку с нужной фаимлией, и через несколько TextBox’ов внести за один раз все значения в нужные ячейки. Из каждого TextBox  в свою ячейку на текущей строке.

 

Всем большой и праздничный привет!  
Юрий М! Согласен с вами. А с другой стороны, должна же быть какая то альтернатива стандартному способу занесения даных через форму.  
Может все таки кто-то из знающих отекликнется на мой зов!  
уважением, Gleod!

 

Юрий М

Модератор

Сообщений: 60583
Регистрация: 14.09.2012

Контакты см. в профиле

#21

04.01.2010 16:08:10

{quote}{login=Gleod}{date=04.01.2010 12:10}{thema=}{post} должна же быть какая то альтернатива стандартному способу занесения даных через форму.{/post}{/quote}  
Подсказываю альтернативу нормальному способу: выделяем ячейку на листе, запускаем форму на которой один ТекстБокс и одна кнопка. В ТекстБоксе отображается значение активной ячейки. Меняем его. Нажимаем кнопку, значение в ячейке меняется, форма закрывается. Выделяем другую ячейку, запускаем форму… и т.д. :-) Вам такой способ нужен? Чем не устраивает «стандартный» метод?  

  P.S. Вы мой последний пример с определением имени диапазона смотрели?

Хитрости »

11 Август 2014              95526 просмотров


Как создать свою надстройку?

В этой статье:

  • Что такое надстройка
  • Как создать надстройку
  • Создание собственного меню надстройки для версий Excel 2003
  • Создание собственного меню надстройки для версий 2007 и выше

 
ЧТО ТАКОЕ НАДСТРОЙКА
Для начала разберемся — что такое надстройка и для чего она нужна.

Надстройка

— это файл Excel, имеющий расширение .xla или .xlam(только для 2007 и выше), который по умолчанию открывается как скрытая рабочая книга и может быть подключен к приложению для автоматического запуска вместе с запуском самого приложения. Книга надстройки открывается, но в списке видимых открытых файлов не значится, поэтому нет смысла её там искать. Отобразить такую книгу возможно только кодом.

Есть также и другие виды надстроек — надстройки COM и XLL-надстройки. Но о них я не буду рассказывать, т.к. они разрабатываются не в VBA, а в иных средах программирования

Как правило надстройки используют для распространения программного кода, который будет доступен для любой книги Excel. Т.к. надстройка запускается вместе с приложением — очень удобно хранить в ней коды. Можно создать меню для запуска процедур(об этом ниже) и функции пользователя — созданные в надстройке они доступны в любой открытой книге Excel без ссылок на другую книгу, что несомненно очень удобно. Функции пользователя, прописанные в надстройке для Excel 2007 и выше так же доступны по вводимым начальным символам:
Подбор по имени функции
и после нажатия TAB имя функции будет вставлено в ячейку.
Кроме модулей с кодами надстройки могут содержать и таблицы данных и диаграммы и все, что можно хранить в обычной книге. Но учитывая то, что книга скрыта — особого смысла в этих данных нет, если только не предполагается использовать эти данные в качестве шаблонов для создания определенных отчетов из надстройки. Часто на листах надстроек хранят константы для работы кода, если по каким-либо причинам не хочется использовать константы внутри кода VBA. Данные в ячейках файла надстройки можно изменять во время работы, но я не рекомендую сохранять открытый и исполняемый в данный момент файл надстройки, во избежание конфликтов.

 
КАК СОЗДАТЬ НАДСТРОЙКУ
Создать надстройку просто: из любого файла Excel идете в меню:

  • Excel 2010 и новее: Файл (File)Сохранить как (Save As)-Из выпадающего списка «Тип файла» выбрать Надстройка Excel(.xlam) (Excel Add-In(.xlam)) или Надстройка Excel 97-2003(.xla) (Excel 97-2003 Add-In(.xla)).
  • Excel 2007: Кнопка ОфисСохранить как (Save As)-Из выпадающего списка «Тип файла» выбрать Надстройка Excel(.xlam) (Excel Add-In(.xlam)) или Надстройка Excel 97-2003(.xla) (Excel 97-2003 Add-In(.xla)).
  • Excel 2003: МенюСохранить как-Из выпадающего списка «Тип файла» выбрать «Надстройка Excel(.xla)«.
  • Сохранить как

Однако рекомендую не спешить с сохранением файла как надстройки. Сначала следует весь функционал, закладываемый в надстройку, потестировать, отладить и удостовериться, что все работает как предполагалось. Т.к. после сохранения файла как надстройки и открытия надстройки в Excel — закрыть её можно будет только закрыв Excel полностью(конечно, можно еще воспользоваться кодом вроде Workbooks("MyAddin.xla").Close, но это не очень удобно в разработке).
Если все же сохранили файл как надстройку, но хотите что-то изменить в книге(удалить лишние листы, изменить информацию на листах(часто так делается для хранения настроек) и т.п.) — то надо в редакторе VBA найти проект надстройки, перейти в свойства модуля ЭтаКнига(или ThisWorkbook) и выставить IsAddin = False. Книга отобразиться. Далее надо будет вернуть свойство IsAddin в True и сохранить проект
Так же следует заранее выбрать формат надстройки — для версий Excel 97-2003(.xla) и или только от 2007(.xlam) и выше. Надстройки .xla работают во всех версиях Excel, в том числе и в 2007 и выше. Это, пожалуй, единственное их преимущество перед форматом .xlam. Т.к. при этом все меню, которые будут созданы для вызова кодов, в версиях от 2007 и выше будут располагаться на вкладке «Надстройки» и будут иметь минимум настроек: нет возможности изменить размер значка; разбить на группы; сделать красивые подсказки; расположить в два ряда и т.п.
Для формата .xlam доступен более широкий ассортимент: они могут так же создать меню на вкладке «Надстройки», а могут и создавать собственные вкладки(через XML-схемы), команды на которых можно расположить в соответствии со всеми красивостями и достоинствами оформления, которое можно наблюдать в Ribbon-панелях Excel 2007 и выше.
Дальше я как раз более подробно расскажу про оба метода создания меню.

Я покажу создание надстроек на примере простого кода, который будет записывать в активную ячейку текущего листа число 10, закрасит ячейку красным цветом и установит для ячейки границы.
Код этой процедуры:

'---------------------------------------------------------------------------------------
' Procedure : Test
' DateTime  : 11.08.2014 12:08
' Author    : The_Prist(Щербаков Дмитрий)
'             http://www.excel-vba.ru
' Purpose   : Записываем в активную ячейку число 10
'             красим в красный цвет заливку
'             устанавливаем границы
'---------------------------------------------------------------------------------------
Sub Test()
    With ActiveCell
        .Value = 10
        .Interior.Color = vbRed
        .Borders.Color = vbBlack
    End With
End Sub

Важно: Код помещается в стандартный модуль книги, из которой хотите сделать надстройку.

 
СОЗДАНИЕ СОБСТВЕННОГО МЕНЮ НАДСТРОЙКИ ДЛЯ ВЕРСИЙ EXCEL 2003

Примерный вид данного меню в Excel 2003:
Панель в Excel 2003
Примерный вид меню в Excel 2007 и выше:
Меню в Excel 2007 и выше

Собственно, меню, совместимое со всеми версиями Excel делается исключительно на уровне VBA следующим кодом:

'---------------------------------------------------------------------------------------
' Module    : ЭтаКнига
' DateTime  : 11.08.2014 12:13
' Author    : The_Prist(Щербаков Дмитрий)
'             http://www.excel-vba.ru
' Purpose   : 
'---------------------------------------------------------------------------------------
Option Explicit
'константа уровня модуля - имя меню
'Обязательно задать, чтобы можно было идентифицировать
Const sMenuBarName As String = "Test Addin www.Excel-VBA.ru"
 
'---------------------------------------------------------------------------------------
' Procedure : Workbook_BeforeClose
' Purpose   : Процедура выполняется перед закрытием книги
'             удаляем созданное меню после закрытия надстройки
'---------------------------------------------------------------------------------------
Private Sub Workbook_BeforeClose(Cancel As Boolean)
    On Error Resume Next ' обработчик ошибки нужен, если меню такого нет
    'удаляем меню, для исключения дублирования меню при повторном запуске
    Application.CommandBars(sMenuBarName).Delete
End Sub
 
'---------------------------------------------------------------------------------------
' Procedure : Workbook_Open
' DateTime  : 11.08.2014 12:39
' Author    : The_Prist(Щербаков Дмитрий)
'             http://www.excel-vba.ru
' Purpose   : Процедура создания меню
'             как отдельная панель для 2003
'             на вкладке "Надстройки" для 2007 и выше
'---------------------------------------------------------------------------------------
Private Sub Workbook_Open()
    On Error Resume Next ' обработчик ошибки нужен, если меню такого нет
    'удаляем меню, для исключения дублирования меню при повторном запуске
    Application.CommandBars(sMenuBarName).Delete
    On Error GoTo 0
    'добавляем меню
    With Application.CommandBars.Add(sMenuBarName, temporary:=True)
        'добавляем новую кнопку
        With .Controls.Add(Type:=1) 'добавляем обычную кнопку на панель
            'отображаемый текст кнопки
            .Caption = "ИЗМЕНИТЬ СВОЙСТВА АКТИВНОЙ ЯЧЕЙКИ"
            'стиль кнопки
            'доступные стили:
            '1 - только значок(16x16)
            '2 - только текст
            '3 - картинка и текст
            .Style = 3
            'назначаем картинку из набора офиса
            'посмотреть доступные можно: http://www.excel-vba.ru/general/moi-nadstrojki/panel-ikonok-faceid/
            .FaceId = 2
            'имя процедуры, которая будет выполнена при нажатии кнопки
            .OnAction = "Test"
        End With
        'делаем меню видимым
        .Visible = True
    End With
End Sub

Основные моменты я постарался расписать в комментариях, но на некоторых все же хочу заострить внимание.

  • Свойство Type
    .Controls.Add(Type:=1)
    Наверное, самое важное свойство. Оно отвечает за тип элемента меню. Доступно всего пять типов:

    • 1Button(обычная кнопка)
    • 2TextBox(текстовое поле с возможностью записи в него значений и считывания значений из него)
    • 3List(выпадающий список с заранее заданным списком значений)
    • 4ComboBox(выпадающий список с возможностью записи в поле произвольного значения)
    • 10PopupMenu(выпадающее меню с возможностью добавления новых элементов)
  • Иногда возникает вопрос: как сделать на такой панели ToggleButton? Т.е. кнопку, которая при нажатии остается в нажатом состоянии, а при повторном нажатии — в отжатом(т.е. в обычном). В данном случае это возможно исключительно через «финты» вызываемой по нажатию кнопки процедуры:

    Sub Add_CmBar()
        With Application.CommandBars.Add("Test ToggleButton", temporary:=True)
            With .Controls.Add(Type:=1)
                .Caption = "ToggleButton"
                .Style = 2
                .OnAction = "Emulate_Toggle"
            End With
            .Visible = True
        End With
    End Sub
    'процедура, которая выполняется при нажатии кнопки "ToggleButton". Меняет видимое состояние кнопки.
    Sub Emulate_Toggle()
        Dim bt As CommandBarButton
        Set bt = Application.CommandBars.ActionControl
        'проверяем текущее состояние кнопки. 
        'если нажата - отжимаем, если отжата - нажимаем
        If bt.State = msoButtonDown Then
            bt.State = msoButtonUp
        Else
            bt.State = msoButtonDown
        End If
    End Sub

    Еще одна проблема при разработке таких панелей: невозможность явно указать кнопку в стиле Caption(т.е. неактивную к нажатию кнопку). Это тоже можно сделать при помощи обычной Button, только в свойствах кнопки надо свойство Enabled установить в False:
    .Enabled = False
    при этом обязательно необходимо указать Style 2 и назначить Caption.

  • Свойство Style
    .Style = 3
    данное свойство управляет видом кнопки. Доступные стили:

    • 1 — только значок(16×16). Необходимо указывать свойство FaceID
    • 2 — только текст. Свойство FaceId может быть указано, но никак не влияет на внешний вид кнопки
    • 3 — картинка и текст. Обязательно указывать хотя бы одно из свойств: Caption или FaceID

    Если хотите отобразить просто значок или значок вместе с текстом — то столкнетесь с проблемой выбора значка. Поэтому я давно создал надстройку, которая позволяет просмотреть все ID всех доступных значков офиса: Панель иконок FaceID.
    Так же можно и свои значки создавать, однако я не буду здесь затрагивать эту тему, т.к. получится запутанно и обширно. Если кратко: необходимо создать свой значок размером 16×16, с расширением .gif. Затем создать копию иконки и предполагаемые непрозрачные области закрасить черным, а прозрачные — белым. Эту копию необходимо задать для свойства .Mask

  • Свойство OnAction:
    .OnAction = «Test»
    Данная строка отвечает за назначение процедуры, которая будет выполнена после нажатия на кнопку(в случае с ComboBox и TextBox — изменение значения. Вызван код будет после выхода из режима редактирования элемента). Test — это имя процедуры. Её я привел выше и именно она будет выполнена при нажатии на эту кнопку.

Положение CommandBar на панели
Так же у объекта CommandBar есть такие свойства как .Left(положение относительно левого края окна Excel) и .Top(положение относительно верхнего края окна Excel), которые задают положение строки меню на панели. Но они мало актуальны для версий 2007 и выше, т.к. там для таких панелей отведена отдельная вкладка и все они помещаются на ней в том порядке, в котором были на неё добавлены. По умолчанию, если данные свойства не заданы — в 2003 Excel панель создается плавающая и пользователь может переместить её в любое удобное для него место. Если же они указаны, то панель будет расположена в заданных координатах относительно окна Excel.

Во вложении ниже пример надстройки с открытым кодом. Но в примере код расширен — там я привел коды с использованием всех типов элементов: и кнопки, и эмуляция ToggleButton, и списки, и текстбокс и выпадающее меню с доп.кнопками. В кодах есть комментарии, поэтому при желании разобраться не составит труда.


Так же можно при запуске надстройки добавлять в контекстное меню(меню, появляющееся по правому клику мыши на ячейке) свои команды. По сути мало что меняется, кроме пары вещей:

  1. надо указывать конкретное имя меню, в которое добавляем некую кнопку. Для контекстного меню ячеек это «Cell»:
    Application.CommandBars(«Cell»)
  2. лучше указывать положение элемента относительно уже существующих в меню. Делает это при помощи указания параметров before или after:
    Application.CommandBars(«Cell»).Controls.Add(Type:=1, before:=4)

При этом добавить можно как собственные кнопки, так и уже существующие. Для примера добавим одной кнопкой дубль нашей команды с лены «ИЗМЕНИТЬ СВОЙСТВА АТИВНОЙ ЯЧЕЙКИ», а второй — вставку в ячейку только значений(встроенная команда — подробнее в статье: Как удалить в ячейке формулу, оставив значения?):

    '=========================================================
    '
    '  ДОБАВЛЯЕМ СВОЙ ПУНКТ В МЕНЮ ПРАВОЙ КНОПКИ МЫШИ
    '
    With Application.CommandBars("Cell")
        'дублируем кнопку "ИЗМЕНИТЬ СВОЙСТВА АТИВНОЙ ЯЧЕЙКИ" с панели
        'добавляем перед 4-м элементом
        With .Controls.Add(Type:=1, before:=4)
            .Caption = "ИЗМЕНИТЬ СВОЙСТВА АТИВНОЙ ЯЧЕЙКИ"
            .Style = 3
            .FaceId = 2
            .OnAction = "Test"
        End With
        'добавляем кнопку встроенной в Excel команды "Вставить значения"
        'ищем команду "Вставить значения" по её ID в контекстном меню
        Set cbb = .FindControl(ID:=370)
        'удаляем команду из меню, если она была уже добавлена ранее
        If Not cbb Is Nothing Then
            cbb.Delete
        End If
        'добавляем перед 5-м элементом(после наше собственной команды)
        .Controls.Add ID:=370, before:=5
    End With

Скачать пример:

  Надстройка для Excel 97-2003 и выше.zip (22,6 KiB, 3 080 скачиваний)


 
СОЗДАНИЕ СОБСТВЕННОГО МЕНЮ НАДСТРОЙКИ ДЛЯ ВЕРСИЙ EXCEL 2007
Как я уже писал — для Excel 2007 и выше подходит описанный выше метод создания собственного меню для ранних версий. Однако меню в данном случае помещается исключительно на вкладку «Надстройки» и имеет довольно убогий вид (как можно лицезреть выше) в сравнении с общим Ribbon-интерфейсом других панелей. Чтобы посмотреть как это выглядит можете просто скачать файл выше и запустить его. Появится вкладка «Надстройки» с одной кнопкой.

Однако учитывая появившуюся в 2007 версии офиса возможность кастомизировать ленту Ribbon через язык XML, гораздо практичнее(особенно для разработчиков) создавать собственную панель с отдельным именем, на которой можно разместить красиво команды, добавить свои собственные значки для команд без особых усилий.

Примерно так можно все это оформить:
Меню в Excel 2007 через XML

Чтобы добавить свою панель необходимо изменить XML-схему для надстройки, которая присутствует в любом файле формата 2007. Есть несколько методов(я опишу лишь два).

Первый метод

, он же совсем неудобный и требует навыков работы с XML

  1. Изменить расширение файла с .xlam на .rar или .zip и открыть любым архиватором.
    Если не отображается расширение:
    Панель управленияСвойства папки(для Win 7 — Параметры папок)- вкладка Вид— Снять галочку с «Скрывать расширение для зарегистрированных типов файлов»
  2. Добавить в архив папку «customUI», папку «_rels» и папку «images»
  3. Создать файл «customUI.xml», который лично я бы назвал основным — в нем необходимо впоследствии прописать все панели и команды по законам языка XML. После чего данный файл необходимо поместить в папку «customUI»
  4. В папке «images» будут храниться все значки, которые будут расположены на панели
  5. Папка «_rels» должна внутри содержать файл «customUI.xml.rels», в котором перечисляются связи картинок с командами и панелями. Проще говоря — схема взаимосвязей ресурсов

Но все это очень муторно и необходимо знать язык XML. Уверен, большая часть читающих статью уже 100500 раз нахмурили брови и пару раз перечитали, надеясь понять о чем речь. Поэтому не будем дальше разбирать этот метод и перейдем к следующему.

 
Второй метод куда практичнее — использовать специальные программы для работы с Ribbon итерфейсом. Такие как Office Ribbon Editor, RibbonXMLEditor, OpenXML package editor и им подобные. Я сам использую для этих целей надстройку Максима Новикова — RibbonXMLEditor, последнюю версию которой можно скачать по адресу: http://novikovmaxim.narod.ru/index.htm?http://novikovmaxim.narod.ru/products/ribbon/ribbon.htm. На том же сайте можно найти примеры работы с Ribbon-панелью офиса и более подробно почитать про создание своих панелей. Я бы даже рекомендовал это сделать, если планируете создавать подобные файлы. Сама же программа RibbonXMLEditor бесплатна и не требует установки. Но функционал весьма достойный, а использование достаточно простое. Я не буду заострять внимание на всех нюансах работы с ней — все это можно найти на сайте её создателя(что я лично категорично рекомендую). Опишу лишь основное, что может потребоваться.
Для начала работы и создания своего меню необходимо открыть программу RibbonXMLEditor и выбрать в ней файл, в который хотите внедрить меню. Это должен быть файл формата .xlsm,.xlam или .xlsb. Т.к. мы создаем надстройку — наш формат .xlam.
На рисунке отмечены цифрами шаги, расписанные ниже:
RXE
1. Добавляете ribbon (нажатием кнопки на элементе)
2. Далее tabs и tab(так же автоматом добавится элемент groupe) — выделяете строку и внутрь кавычек для id вписываете groupe_1, а для label вписываете имя вкладки — Свойства ячейки.
3. Уже после этого внутрь groupe добавляете button и задаете ей id — change_cell. Должен получится такой код:

<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
	<ribbon startFromScratch="false">
		<tabs>
			<tab id="excel-vba" label="Test excel-vba.ru">
				<group id="groupe_1" label="Свойства ячейки">
					<button id="change_cell" />
				</group>
			</tab>
		</tabs>
	</ribbon>
</customUI>

Id каждого элемента должно быть уникальным и предпочтительнее указывать его исключительно на латинице(англ.алфавит), т.к. кириллица распознается с трудом и есть шанс получить ошибку.
Теперь продолжаем добавлять свойства для button:
4. для начала подгружаем картинку через соответствующую кнопку.
5. После этого она будет в выпадающем списке правее.
6. Ставим курсор после «change_cell» и нажимаем кнопку вставки тега изображения. Вставляется тег и название. Теперь у нашей кнопки есть картинка.
7. При помощи выпадающего меню параметров выбираем label и вставляем данный тег кнопкой, расположенной правее выпадающего списка. Курсор автоматически будет помещен внутрь кавычек. Вписываем текст — Изменить свойства ячейки.
8. При помощи выпадающего списка функций обратного вызова выбираем onAction и так же вставляем. Вписываем туда имя вызываемой процедуры — CallTest.
В результате должно получиться:

<?xml version="1.0" standalone="yes"?>
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
	<ribbon startFromScratch="false">
		<tabs>
			<tab id="excel-vba" label="Test excel-vba.ru">
				<group id="groupe_1" label="Свойства ячейки">
					<button id="change_cell" image="table_edit" label="Изменить свойства ячейки" onAction="CallTest" />
				</group>
			</tab>
		</tabs>
	</ribbon>
</customUI>

Для отладки схемы через RibbonXMLEditor можно использовать кнопку отладки(зеленый треугольник) или сочетание клавиш F9. Для проверки корректности схемы — зеленая галочка. Жмем на неё и если в схеме будут ошибки — они сразу будут найдены и показаны в сообщении, с указанием номера строки и столбца, в которых ошибка.

На этом, казалось бы, все. Но нет. Просто так, сама по себе XML-схема не вызовет процедуру — необходимо создать функции обратного вызова. Вот здесь у RibbonXMLEditor есть еще одна отличная функция — генерация модуля обратных вызовов — 9. Нажимаем на кнопку — получаем готовые функции. Как правило верхние две строки не нужны — нам нужны лишь сами функции:

Sub CallTest(control As IRibbonControl)
 
End Sub

Копируем. Сохраняем схему нажатием дискеты в RibbonXMLEditor и закрываем программу.
Теперь открываем наш файл и вставляем скопированный текст функции. В эту функцию прописываем вызов нашей, уже созданной ранее процедуры: Test

Sub CallTest(control As IRibbonControl)
    Call Test
End Sub

В принципе, можно и прямо в эту процедуру прописать все действия из процедуры Test.
Сохраняем.
Открываем наш файл — видим, что новая вкладка «Test excel-vba.ru» появилась, кнопка на ней есть. По нажатии на кнопку выделенная ячейка окрашивается в красный цвет, в ней прописывается значение 10 и создаются границы.

 
Так же можно вставлять на свою вкладку встроенные команды. Для этого в button используется не id, а idMso. Эти команды не нуждаются в обработке обратных вызовов, т.к. при их использовании происходит вызов встроенных функций — кнопки как бы просто дублируются на нашу вкладку со всеми их возможностями. Например, чтобы добавить на свою вкладку стандартную кнопку перехода в VisualBasic надо добавить кнопку с idMso VisualBasic:

<button idMso="VisualBasic" />

Сам код при этом будет выглядеть так:

<?xml version="1.0" standalone="yes"?>
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
	<ribbon startFromScratch="false">
		<tabs>
			<tab id="excel-vba" label="Test excel-vba.ru">
				<group id="groupe_1" label="Свойства ячейки">
					<button id="change_cell" image="table_edit" label="Изменить свойства ячейки" onAction="CallTest" />
                                        <button idMso="VisualBasic" />
				</group>
			</tab>
		</tabs>
	</ribbon>
</customUI>

Естественно, на создании одних кнопок функционал лент Ribbon не ограничивается. Доступны почти все элементы(вып.меню, галереи, большие иконки(32х32) и т.д.), которые есть в стандартных вкладках. Если чуть потренироваться и поэкспериментировать с приложением RibbonXMLEditor — то вскоре вы сможете быстро и легко создавать красивые и функциональные приложения. Как пример таких приложений можете посмотреть описание к моей надстройке MulTEx.


Так же как и в случае с надстройками для 2003 Excel, здесь можно создавать кнопки в контекстном меню(правая кнопка мыши), но и тут не обошлось без нюансов:

  1. изменение данного меню доступно только начиная с версии Excel 2010. Для 2007 версии придется использовать старые методы — те же, что и для 2003(т.е. внедрение отдельного кода на Workbook_Open надстройки, как в примере выше для надстройки 2003)
  2. в надстройке Ribbon XML Editor я не нашел встроенного инструмента для вставки кодов обработки меню правой кнопкой мыши. Похожий по «звучанию» contextualTabs не совсем то, что нужно(а если быть точнее — совсем не то). contextualTabs — это динамические вкладки, которые появляются после основных вкладок при работе с определенными объектами. Например, с умными таблицами. Когда выделяем умную таблицу или любую ячейку в ней, то появляется группа динамических вкладок «Работа с таблицами». Вот в неё и вносятся изменения при помощи contextualTabs

Поэтому прописывать «добавки» в меню по правой кнопке мыши придется самостоятельно. Код вставки уже имеющегося у нас кода приведен ниже:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
	<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui">
	<ribbon startFromScratch="false">
		<tabs>
			<tab id="excel-vba" label="Test excel-vba.ru">
				<group id="groupe_1" label="Свойства ячейки">
					<button id="change_cell" image="table_edit" label="Изменить свойства ячейки" onAction="CallTest" />
                                        <button idMso="VisualBasic" />
				</group>
			</tab>
		</tabs>
	</ribbon>
 
	<contextMenus>
		<contextMenu idMso="ContextMenuCell">
			<button id="change_cell_context" 
					image="table_edit" 
					label="Изменить свойства ячейки" 
					onAction="CallTest" 
					insertBeforeMso="Cut" />
		</contextMenu>
	</contextMenus>
</customUI>

добавлять его надо исключительно на вкладке 2010, 2013(customUI14.xml) внизу редактора Ribbon XML Editor. Обращаю внимание, что код создания собственной вкладки на панели дублируется: он должен присутствовать и в 2007(customUI.xml) и в 2010, 2013(customUI14.xml). Это необходимо сделать, чтобы в 2007 Excel была только вкладка, а начиная с 2010 — еще и контекстное меню(схемы customUI.xml и customUI14.xml обрабатываются отдельно друг от друга в зависимости от того, в какой версии открыт файл). При этом в 2007 это никаких ошибок не вызовет.
Остальные правила для создания элементов меню точно такие же, как и для вкладок: можно добавлять как собственные команды, так и встроенные(при помощи idMso).
Я сам предпочитаю контекстное меню дополнять исключительно кодом VBA, т.к. для 2007 его в любом случае придется писать.

Скачать пример надстройки для 2007 Excel

  Надстройка для Excel 2007 и выше.zip (14,6 KiB, 3 402 скачиваний)

В примере я не стал делать много кнопок и их обработку — слишком уж много различных элементов там доступны и для раскрытия всего функционала этой статьи не хватит. Да и в интернете уже полно статей с разбором работы с XML-интерфейсом новых версий Excel. Основной упор сделан на создание основной вкладки и контекстного меню, т.к. техника создания контекстного меню уж очень не очевидна из надстройка Ribbon XML Editor.

Осталось дело за малым — научиться эти надстройки подключать. Но об этом я уже писал в статье Подключение/отключение надстроек


Статья помогла? Поделись ссылкой с друзьями!

  Плейлист   Видеоуроки


Поиск по меткам



Access
apple watch
Multex
Power Query и Power BI
VBA управление кодами
Бесплатные надстройки
Дата и время
Записки
ИП
Надстройки
Печать
Политика Конфиденциальности
Почта
Программы
Работа с приложениями
Разработка приложений
Росстат
Тренинги и вебинары
Финансовые
Форматирование
Функции Excel
акции MulTEx
ссылки
статистика

Понравилась статья? Поделить с друзьями:
  • Как добавить свой шрифт в word на андроид
  • Как добавить сквозные строки в excel
  • Как добавить свой почерк в шрифт в word
  • Как добавить свой шрифт в word на mac
  • Как добавить символы во все ячейки excel