Меню в EXCEL-е - проблемы не кончаются

Программирование на Visual Basic for Applications
David
Обычный пользователь
Обычный пользователь
 
Сообщения: 81
Зарегистрирован: 10.03.2004 (Ср) 20:41
Откуда: FRANCE

Меню в EXCEL-е - проблемы не кончаются

Сообщение David » 07.12.2006 (Чт) 11:42

При открытие файла в EXCEL-е создаёся динамическое меню (в примере для краткости меню статическое) с вызывом макро.
Результат: меню создаётся, макро вызыается, но почему-то MsgBox выполняется два раза, да и Workbooks.Add не срабатывает, как-будто его вообще не существует.
Ещё, файл я записывал и как .xls и .xla, но на резуьтат это ни как не влияет (.xla - предпологал, может меню надо создавать при загрузке EXCEL-а)

Большое спасибо. Пример прилагаю.

Код: Выделить всё

Private Sub Workbook_Open()

    For Each MenuName In MenuBars(xlWorksheet).Menus
        If MenuName.Caption = "&Outils" Then
            For Each SubMenuName In MenuBars(xlWorksheet).Menus("&Outils").MenuItems
                If SubMenuName.Caption = "Tab" Then SubMenuName.Delete: Exit For
            Next
            Exit For
        End If
    Next

    MenuBars(xlWorksheet).Menus("&Outils").MenuItems.AddMenu Caption:="Tab"

    MenuBars(xlWorksheet).Menus("&Outils").MenuItems("Tab").MenuItems.AddMenu Caption:="EXE 1"
    MenuBars(xlWorksheet).Menus("&Outils").MenuItems("Tab").MenuItems.AddMenu Caption:="EXE 2"

    MenuBars(xlWorksheet).Menus("&Outils").MenuItems("Tab").MenuItems("EXE 1").MenuItems.AddMenu Caption:="PROJET 1"
    MenuBars(xlWorksheet).Menus("&Outils").MenuItems("Tab").MenuItems("EXE 1").MenuItems.AddMenu Caption:="PROJET 2"
    MenuBars(xlWorksheet).Menus("&Outils").MenuItems("Tab").MenuItems("EXE 1").MenuItems.AddMenu Caption:="PROJET 3"

    MenuBars(xlWorksheet).Menus("&Outils").MenuItems("Tab").MenuItems("EXE 2").MenuItems.AddMenu Caption:="PROJET 1"
    MenuBars(xlWorksheet).Menus("&Outils").MenuItems("Tab").MenuItems("EXE 2").MenuItems.AddMenu Caption:="PROJET 2"

    MenuBars(xlWorksheet).Menus("&Outils").MenuItems("Tab").MenuItems("EXE 1").MenuItems("PROJET 1").MenuItems.Add Caption:="KIKI", OnAction:="Mac(" & """EXE 1 - PROJET1 - KIKI""" & ")"
    MenuBars(xlWorksheet).Menus("&Outils").MenuItems("Tab").MenuItems("EXE 1").MenuItems("PROJET 1").MenuItems.Add Caption:="MIMI", OnAction:="Mac(" & """EXE 1 - PROJET1 - MIMI""" & ")"
    MenuBars(xlWorksheet).Menus("&Outils").MenuItems("Tab").MenuItems("EXE 1").MenuItems("PROJET 2").MenuItems.Add Caption:="FIFI", OnAction:="Mac(" & """EXE 1 - PROJET2 - FIFI""" & ")"

End Sub

Private Function Mac(Variable)
    MsgBox Variable
    If Variable = "KIKI" Then Workbooks.Add
End Function

inq
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 185
Зарегистрирован: 12.04.2006 (Ср) 7:50
Откуда: 78

Сообщение inq » 08.12.2006 (Пт) 8:49

а и Workbooks.Add не срабатывает, как-будто его вообще не существует.


очевидно, потому что variable не равна KIKI
подписи нет и не будет

David
Обычный пользователь
Обычный пользователь
 
Сообщения: 81
Зарегистрирован: 10.03.2004 (Ср) 20:41
Откуда: FRANCE

Сообщение David » 08.12.2006 (Пт) 11:09

очевидно, потому что variable не равна KIKI


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

inq
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 185
Зарегистрирован: 12.04.2006 (Ср) 7:50
Откуда: 78

Сообщение inq » 08.12.2006 (Пт) 11:40

Тогда объясни, каким чудесным образом строка
"Mac(" & """EXE 1 - PROJET1 - KIKI""" & ")"

превращается в Mac("KIKI")
подписи нет и не будет

David
Обычный пользователь
Обычный пользователь
 
Сообщения: 81
Зарегистрирован: 10.03.2004 (Ср) 20:41
Откуда: FRANCE

Сообщение David » 08.12.2006 (Пт) 18:23

Никаких чудес нет, а есть ошибка: :oops:

вместо
Код: Выделить всё
MenuBars(xlWorksheet).Menus("&Outils").MenuItems("Tab").MenuItems("EXE 1").MenuItems("PROJET 1").MenuItems.Add Caption:="KIKI", OnAction:="Mac(" & """EXE 1 - PROJET1 - KIKI""" & ")"


надо было написать
Код: Выделить всё
MenuBars(xlWorksheet).Menus("&Outils").MenuItems("Tab").MenuItems("EXE 1").MenuItems("PROJET 1").MenuItems.Add Caption:="EXE 1 - PROJET1 - KIKI", OnAction:="Mac(" & """KIKI""" & ")"


и так же для остальных

я просто в примере препутал Caption и OnAction, ну бывает :roll:

но всё равно проблема остается, т.к. ошибка только в здесь а макро всё правильно написанно (только что проверил)

вообщем, если не посылать параметры всё работает без проблем, но мне именно нужно с параметром или же как нибудь распознать с какой позиции в меню был вызван макро

KL
Microsoft MVP
 
Сообщения: 483
Зарегистрирован: 30.10.2005 (Вс) 0:31
Откуда: Madrid

Сообщение KL » 09.12.2006 (Сб) 2:44

OnAction:="Mac ""KIKI"""
Привет,
KL

David
Обычный пользователь
Обычный пользователь
 
Сообщения: 81
Зарегистрирован: 10.03.2004 (Ср) 20:41
Откуда: FRANCE

Сообщение David » 09.12.2006 (Сб) 5:43

KL писал
OnAction:="Mac ""KIKI"""

ну и что это означает. После замены строки на это, выдается ошибку МАСРО НЕ НАЙДЕНО
может я чего-то не понял, разъясни.

KL
Microsoft MVP
 
Сообщения: 483
Зарегистрирован: 30.10.2005 (Вс) 0:31
Откуда: Madrid

Сообщение KL » 09.12.2006 (Сб) 16:06

Это означает, что Вас не укачает :-)

Ну а если серьезно, то:

1) функция Mac(Variable) должна вызываться с указанием модуля или быть перенесена в стандартный модуль с удалением слова Private

2) при присвоении свойству OnAction макроса с параметрами...
- не используются скобки
- используются пробелы, запятые (если параметров более одного) и апострофы (одиночные кавычки)

3) в моем первом сообщении при копировании странным образом испарились апострофы, т.ч. пишу еще раз:

OnAction = "'MyModule.Mac ""KIKI""'"

или

OnAction = "'Mac ""KIKI""'"

4) твоя функция жрет память почем зря.

5) если хочешь получать ответы, прекрати "нукать" и отпускать комментарии типа "...очень умно...", пока что не рубишь фишку ты ;-)
Привет,
KL

David
Обычный пользователь
Обычный пользователь
 
Сообщения: 81
Зарегистрирован: 10.03.2004 (Ср) 20:41
Откуда: FRANCE

Сообщение David » 09.12.2006 (Сб) 19:48

KL:
- не используются скобки
- используются пробелы, запятые (если параметров более одного) и апострофы (одиночные кавычки)


Спасибо всё работает, не мог бы ты мне пояснить:

KL:
твоя функция жрет память почем зря

почему? и как этого избежать?[/quote]

KL
Microsoft MVP
 
Сообщения: 483
Зарегистрирован: 30.10.2005 (Вс) 0:31
Откуда: Madrid

Сообщение KL » 09.12.2006 (Сб) 23:10

David писал(а):KL:
твоя функция жрет память почем зря

почему?...
Потому что если явно не декларировать тип функции и переменных, то по умолчанию им будет присвоен тип Variant, т.е. будет заблокировано наибольшее кол-во памяти на все случаи жизни.

David писал(а):...и как этого избежать?
1. Изменить процедуру с Function на Sub, т.к. никакого значения ты функции не присваиваешь

2. Задекларировать тип переменной как String

в результате получим что-то вроде:

Код: Выделить всё
Private Sub Mac(ByVal Variable As String)
    If Variable = "KIKI" Then Workbooks.Add
End Sub
Привет,
KL

David
Обычный пользователь
Обычный пользователь
 
Сообщения: 81
Зарегистрирован: 10.03.2004 (Ср) 20:41
Откуда: FRANCE

Сообщение David » 09.12.2006 (Сб) 23:46

Всё правильно, но для пример я как-то не очень размышлял.

Вообщем я думаю тему можно закрыть

Благодарю всех и особенное спасибо KL

David
Обычный пользователь
Обычный пользователь
 
Сообщения: 81
Зарегистрирован: 10.03.2004 (Ср) 20:41
Откуда: FRANCE

Сообщение David » 11.12.2006 (Пн) 12:27

сообщение для KL, ты писал:

2) при присвоении свойству OnAction макроса с параметрами...
- не используются скобки
- используются пробелы, запятые (если параметров более одного) и апострофы (одиночные кавычки)


в случае с текстом, более чем ясно (спасибо ещё раз), но вот переменную ни как не изловчусь передать, не мог бы ты написать форат переачи переменной?

KL
Microsoft MVP
 
Сообщения: 483
Зарегистрирован: 30.10.2005 (Вс) 0:31
Откуда: Madrid

Сообщение KL » 11.12.2006 (Пн) 12:48

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


что-то в этом духе:

OnAction = "'Mac """ & myVar & """'"

если переменная не текст, то:

OnAction = "'Mac " & myVar & "'"
Привет,
KL

David
Обычный пользователь
Обычный пользователь
 
Сообщения: 81
Зарегистрирован: 10.03.2004 (Ср) 20:41
Откуда: FRANCE

Сообщение David » 11.12.2006 (Пн) 13:36

Не "что-то в этом духе" а именно так. :D :D

Спасибо, БОЛЬШОЕ


Вернуться в VBA

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

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

    TopList