Dim pop As Office.CommandBarPopup
Dim btn As Office.CommandBarButton
Set pop = Application.CommandBars.Item("Worksheet Menu
bar").Controls.Add(msoControlPopup)
With pop
.Caption = "SAMPLE"
.Tag = "sample"
.BeginGroup = True
End With
Set btn = pop.Controls.Add(msoControlButton)
With btn
.Caption = "Function sample"
.Tag = "sample"
.OnAction = "sample"
' .OnAction = "sample(1)"
End With
.OnAction = функция с параметром
Помогите пожалуйста разобраться :
в VBA создаётся кнопка меню : (пример во вложении)
http://slil.ru/25435147
Код:
если .OnAction = "sample" - то всё ОК
проблема в том, что если задавать
.OnAction = "sample(1)", т.е. передавать параметр
(на деле необходимо создать двенадцать кнопок (на каждый месяц) и в функцию
передавать номер месяца)
то функция
sample(1)
- выполняется два раза
- в ней не отрабатывает очистка листа :
Workbooks("sample.xls").Worksheets("Лист1").Cells.Clear
- В строке
WS.Cells(i, j) = CDbl(rec(f.Name))
начинает ругаться на : CDbl()
Заранее спасибо за ответ . . .
Код:
Private Sub Auto_Open()
With Application.CommandBars(1)
.Protection = msoBarNoProtection
With .Controls.Add(Type:=msoControlPopup)
.BeginGroup = True
.Caption = "Месяц"
For iCount& = 1 To 12
With .Controls.Add(Type:=msoControlButton)
.Caption = Application.GetCustomListContents(4)(iCount&)
'.Caption = MonthName(iCount&) 'MS Excel 2000
.OnAction = "MyMacro"
End With
Next
End With
End With
End Sub
Private Sub MyMacro()
iMonth& = Application.Caller(1)
MsgBox iMonth&, , "Вариант I"
iMonth& = Application.CommandBars.ActionControl.Index
MsgBox iMonth&, , "Вариант II"
End Sub
With Application.CommandBars(1)
.Protection = msoBarNoProtection
With .Controls.Add(Type:=msoControlPopup)
.BeginGroup = True
.Caption = "Месяц"
For iCount& = 1 To 12
With .Controls.Add(Type:=msoControlButton)
.Caption = Application.GetCustomListContents(4)(iCount&)
'.Caption = MonthName(iCount&) 'MS Excel 2000
.OnAction = "MyMacro"
End With
Next
End With
End With
End Sub
Private Sub MyMacro()
iMonth& = Application.Caller(1)
MsgBox iMonth&, , "Вариант I"
iMonth& = Application.CommandBars.ActionControl.Index
MsgBox iMonth&, , "Вариант II"
End Sub
Цитата:
Передать параметр конечно же можно, но в данном конкретном случае, в этом нет необходимости, ибо для определения номера месяца можно воспользоваться любым из двух нижеопубликованных вариантов.
pashulka, большое спасибо за советы.
Подскажи, пожалуйста, как программно в VBA реализовать нажатие на конкретную кнопку меню ?
(в моём случае нужно в Auto_Open обновляться текущим месяцем - т.е. программно нажать кнопку "Февраль")
Код:
Private Sub Auto_Open()
With Application.CommandBars(1)
.Protection = msoBarNoProtection
With .Controls.Add(Type:=msoControlPopup)
.BeginGroup = True
.Caption = "Месяц"
For iCount& = 1 To 12
With .Controls.Add(Type:=msoControlButton)
.Caption = Application.GetCustomListContents(4)(iCount&)
'.Caption = MonthName(iCount&) 'MS Excel 2000
.OnAction = "MyMacro"
End With
Next
.Controls(Month(Now)).Execute '
End With
End With
End Sub
Private Sub MyMacro()
iMonth& = Application.Caller(1)
MsgBox iMonth&, , "Вариант I"
iMonth& = Application.CommandBars.ActionControl.Index
MsgBox iMonth&, , "Вариант II"
'Здесь наличествует основной код
End Sub
With Application.CommandBars(1)
.Protection = msoBarNoProtection
With .Controls.Add(Type:=msoControlPopup)
.BeginGroup = True
.Caption = "Месяц"
For iCount& = 1 To 12
With .Controls.Add(Type:=msoControlButton)
.Caption = Application.GetCustomListContents(4)(iCount&)
'.Caption = MonthName(iCount&) 'MS Excel 2000
.OnAction = "MyMacro"
End With
Next
.Controls(Month(Now)).Execute '
End With
End With
End Sub
Private Sub MyMacro()
iMonth& = Application.Caller(1)
MsgBox iMonth&, , "Вариант I"
iMonth& = Application.CommandBars.ActionControl.Index
MsgBox iMonth&, , "Вариант II"
'Здесь наличествует основной код
End Sub
При желании можно обойтись и без использования метода Execute, например :
Код:
Private Sub Auto_Open()
With Application.CommandBars(1)
.Protection = msoBarNoProtection
With .Controls.Add(Type:=msoControlPopup)
.BeginGroup = True
.Caption = "Месяц"
For iCount& = 1 To 12
With .Controls.Add(Type:=msoControlButton)
.Caption = Application.GetCustomListContents(4)(iCount&)
'.Caption = MonthName(iCount&) 'MS Excel 2000
.OnAction = "MyMacro"
End With
Next
MyMacro Month(Now)
'Call MyMacro(Month(Now))
'Application.Run _
Macro:="MyMacro", Arg1:=Month(Now) 'Run "MyMacro", Month(Now)
End With
End With
End Sub
Private Sub MyMacro(Optional iMonth)
If IsMissing(iMonth) = True Then
iMonth = Application.Caller(1)
MsgBox iMonth, , "Вариант I"
iMonth = Application.CommandBars.ActionControl.Index
MsgBox iMonth, , "Вариант II"
End If
'Здесь наличествует основной код
End Sub
With Application.CommandBars(1)
.Protection = msoBarNoProtection
With .Controls.Add(Type:=msoControlPopup)
.BeginGroup = True
.Caption = "Месяц"
For iCount& = 1 To 12
With .Controls.Add(Type:=msoControlButton)
.Caption = Application.GetCustomListContents(4)(iCount&)
'.Caption = MonthName(iCount&) 'MS Excel 2000
.OnAction = "MyMacro"
End With
Next
MyMacro Month(Now)
'Call MyMacro(Month(Now))
'Application.Run _
Macro:="MyMacro", Arg1:=Month(Now) 'Run "MyMacro", Month(Now)
End With
End With
End Sub
Private Sub MyMacro(Optional iMonth)
If IsMissing(iMonth) = True Then
iMonth = Application.Caller(1)
MsgBox iMonth, , "Вариант I"
iMonth = Application.CommandBars.ActionControl.Index
MsgBox iMonth, , "Вариант II"
End If
'Здесь наличествует основной код
End Sub
P.S. При ответе цитировать предыдущее сообщение (часть сообщения) вовсе не обязательно.
Есть ещё один вопрос по этой задаче :
- при построении графика (в моём случае OX это дни месяца [1..31]) необходимо чтобы пустые ячейки входящие в ряд для построения графика не отображались на нём (в моём случае график строится от 1 до 31, но там где ячейки пустые график = 0). Это работает только в том случае если она действительно пустая, но не срабатывает если :
1. Ячейка содержит формулу : =ЕСЛИ(C10<>"";C10/Лист1!D$7;"") т.е если результат вычислить невозможно, то проставляется "" (пробовал " ", "0", "---")
2. В эту ячейку копируется или приравнивается заведомо пустая ячейка
Вышел из ситуации следующим образом :
- добавил лист
- все формулы перенёс на него
- на лист с которого строятся графики копирую только значения
(причём если копировать всё значения - от 1 до 31 где например от 20 до 31 - это пустые ячейки, то они опять же отобразятся на графике нулями, поэтому определяю только непустые ячейки и копирую только их)
Может есть способ проще (например настроики самого графика) ?
Насколько рационально организовать работу с графиками (создание, добавление рядов, полная настройка) полностью на run-time ?
NovaC, Не могли бы Вы предоставить данные, на основании которых строится график, и конечный результат, т.е. ту диаграмму, которая удовлетворяет Вашим требованиям.
пример
В VBA можно объявить массив как константу ?
напрмер вот так не получается :
пожалуйста -
В VBA можно объявить массив как константу ?
напрмер вот так не получается :
Код:
Public Const ColGb = Array("C", "E", "G", "I", "K", "M", "O", "Q", "S", "U", "W", "Y", "AA", "AC")
Нет, так как массив - это не константа.
Нет, но если Вы используете MS Office 2000 (или старше), то можно использовать следующий вариант :
Код:
Public Const iColumns = "C;E;G;I;K;M;O;Q;S;U;W;Y;AA;AC"
Private Sub Auto_Open()
iMassivColumns = Split(iColumns, ";")
'И дальше работаете с этим массивом
For Each iColumn In Split(iColumns, ";")
MsgBox "Столбец : " & iColumn, , ""
Next
'Или так, например, если в переменной нет необходимости
End Sub
Private Sub Auto_Open()
iMassivColumns = Split(iColumns, ";")
'И дальше работаете с этим массивом
For Each iColumn In Split(iColumns, ";")
MsgBox "Столбец : " & iColumn, , ""
Next
'Или так, например, если в переменной нет необходимости
End Sub
Примечание : Обратите внимание на то, что в некоторых случаях, можно работать с диапазоном несмежных ячеек, без использования цикла :
Код:
Range("C1,E1,G1,I1,K1,M1,O1,Q1,S1,U1,W1,Y1,AA1,AC1").Clear
Что касается диаграммы, то в Вашем случае вполне можно обойтись без использования макросов (см. пример)