Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

.OnAction = функция с параметром

35K
04 февраля 2008 года
NovaC
4 / / 04.02.2008
Доброе время суток !

Помогите пожалуйста разобраться :

в VBA создаётся кнопка меню : (пример во вложении)
http://slil.ru/25435147
Код:
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 = "sample" - то всё ОК

проблема в том, что если задавать
.OnAction = "sample(1)", т.е. передавать параметр
(на деле необходимо создать двенадцать кнопок (на каждый месяц) и в функцию
передавать номер месяца)
то функция
sample(1)
- выполняется два раза
- в ней не отрабатывает очистка листа :
Workbooks("sample.xls").Worksheets("Лист1").Cells.Clear
- В строке
WS.Cells(i, j) = CDbl(rec(f.Name))
начинает ругаться на : CDbl()

Заранее спасибо за ответ . . .
275
04 февраля 2008 года
pashulka
985 / / 19.09.2004
Передать параметр конечно же можно, но в данном конкретном случае, в этом нет необходимости, ибо для определения номера месяца можно воспользоваться любым из двух нижеопубликованных вариантов.

Код:
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
35K
05 февраля 2008 года
NovaC
4 / / 04.02.2008
Цитата:
Передать параметр конечно же можно, но в данном конкретном случае, в этом нет необходимости, ибо для определения номера месяца можно воспользоваться любым из двух нижеопубликованных вариантов.


pashulka, большое спасибо за советы.
Подскажи, пожалуйста, как программно в VBA реализовать нажатие на конкретную кнопку меню ?
(в моём случае нужно в Auto_Open обновляться текущим месяцем - т.е. программно нажать кнопку "Февраль")

275
05 февраля 2008 года
pashulka
985 / / 19.09.2004
Код:
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


При желании можно обойтись и без использования метода 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


P.S. При ответе цитировать предыдущее сообщение (часть сообщения) вовсе не обязательно.
35K
06 февраля 2008 года
NovaC
4 / / 04.02.2008
pashulka, ещё раз спасибо за подробный ответ.
Есть ещё один вопрос по этой задаче :
- при построении графика (в моём случае OX это дни месяца [1..31]) необходимо чтобы пустые ячейки входящие в ряд для построения графика не отображались на нём (в моём случае график строится от 1 до 31, но там где ячейки пустые график = 0). Это работает только в том случае если она действительно пустая, но не срабатывает если :
1. Ячейка содержит формулу : =ЕСЛИ(C10<>"";C10/Лист1!D$7;"") т.е если результат вычислить невозможно, то проставляется "" (пробовал " ", "0", "---")
2. В эту ячейку копируется или приравнивается заведомо пустая ячейка

Вышел из ситуации следующим образом :
- добавил лист
- все формулы перенёс на него
- на лист с которого строятся графики копирую только значения
(причём если копировать всё значения - от 1 до 31 где например от 20 до 31 - это пустые ячейки, то они опять же отобразятся на графике нулями, поэтому определяю только непустые ячейки и копирую только их)
Может есть способ проще (например настроики самого графика) ?
Насколько рационально организовать работу с графиками (создание, добавление рядов, полная настройка) полностью на run-time ?
275
06 февраля 2008 года
pashulka
985 / / 19.09.2004
NovaC, Не могли бы Вы предоставить данные, на основании которых строится график, и конечный результат, т.е. ту диаграмму, которая удовлетворяет Вашим требованиям.
35K
07 февраля 2008 года
NovaC
4 / / 04.02.2008
пожалуйста - пример
В VBA можно объявить массив как константу ?
напрмер вот так не получается :
 
Код:
Public Const ColGb = Array("C", "E", "G", "I", "K", "M", "O", "Q", "S", "U", "W", "Y", "AA", "AC")
251
07 февраля 2008 года
SkyMаn
1.7K / / 31.07.2007
Нет, так как массив - это не константа.
275
07 февраля 2008 года
pashulka
985 / / 19.09.2004
[quote=NovaC]В VBA можно объявить массив как константу ?[/quote]

Нет, но если Вы используете 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


Примечание : Обратите внимание на то, что в некоторых случаях, можно работать с диапазоном несмежных ячеек, без использования цикла :

 
Код:
Range("C1,E1,G1,I1,K1,M1,O1,Q1,S1,U1,W1,Y1,AA1,AC1").Clear


Что касается диаграммы, то в Вашем случае вполне можно обойтись без использования макросов (см. пример)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог