2015-04-17 5 views
0

Я добавил combocox activebox comboBox1 в мою таблицу Excel «Sheet1», и я хочу иметь возможность вызывать разные макросы на основе выбора в поле со списком. Некоторые из названий макросов, которые у меня есть, - «MC323», «MC616», «MC813».Вызов макроса из выбора combobox

Итак, вы выбираете MC616 из списка combobox. Я хочу, чтобы он запускал макрос MC616.

Я попытался найти ответы, но ничего не сделал со мной. Вот что я до сих пор, что мало, и я уверен, что это не так.

Option Explicit 

Private Sub Workbook_Open() 
With Sheet1.ComboBox1 
ComboBox1.Clear 
    .AddItem "MC323" 
    .AddItem "MC616" 
    .AddItem "MC813" 
End With 
End Sub 

Sub ComoBox1_Change() 
With Sheet1.ComboBox1 
    Select Case ComboBox1.Value 
     Case "MC323": MC323 
     Case "MC616": MC616 
     Case "MC813": MC813 
    End Select 
End With 
End Sub 

Sub MC323() 
    Call MC323 
End Sub 

Sub MC616() 
    Call MC616 
End Sub 

Sub MC813() 
    Call MC813 
End Sub 
+0

Вы на самом деле не указали, что такое _isn't_, но я думаю, что [JNevill] (http://stackoverflow.com/a/29701964/2344413) ударил его. – FreeMan

ответ

0

Вы орфографическую ошибку, что может быть проблемой, так или иначе ... Это должно пойти в модуль Лист1

Sub ComboBox1_Click() 
    Select Case ComboBox1.Value 
    Case Is = "MC323": MC323 
    Case Is = "MC616": MC616 
    Case Is = "MC813": MC813 
    End Select 
End Sub 

Это должно идти в обычный модуль,

Sub MC323() 
    MsgBox "MC323" 
End Sub 

Sub MC616() 
    MsgBox "MC616" 
End Sub 

Sub MC813() 
    MsgBox "MC813" 
End Sub 

Это в модуле Workbook,

Private Sub Workbook_Open() 
    With Sheet1.ComboBox1 
     .Clear 
     .AddItem "MC323" 
     .AddItem "MC616" 
     .AddItem "MC813" 
    End With 
End Sub 
+0

Что делать, если я хочу поставить кнопку «ВВОД» рядом со списком, чтобы вы могли выбрать элемент, а затем нажмите кнопку, чтобы запустить макрос? –

+0

Тогда код будет использоваться в 'Sub Button1_Click()' вместо 'Sub ComboBox1_click()'. – FreeMan

+0

Получил его работу. Спасибо. –

1

Все выглядит хорошо, пока вы не получите здесь:

Sub MC323() 
    Call MC323 
End Sub 

Sub MC616() 
    Call MC616 
End Sub 

Sub MC813() 
    Call MC813 
End Sub 

Подпрограмма MC323 имеет только одна линия и эта линия говорит вызова подпрограммы MC323, которая имеет только одну строку и эту линию, и эта линия говорит вызывать подпрограмму MC323, которая имеет только одну строку, и эта строка говорит, чтобы вызвать подпрограмму MC323, которая имеет только одну строку, и эта строка говорит, чтобы вызвать подпрограмму MC323, которая имеет только одну строку, и эта строка говорит, чтобы вызвать подпрограмму MC323, которая имеет только одну строку a nd, что строка говорит, чтобы вызвать подпрограмму MC323, которая имеет только одну строку и эта строка выполняет вызов подпрограммы MC323.

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

Sub MC323() 
    MsgBox("Endless recursive loops are bad") 
End Sub 
+0

Я на самом деле пытаюсь заставить его вызвать модуль VBA с именем MC323. Как я могу это сделать? –

+0

В этом случае ... У вас, вероятно, есть имена подпрограмм MC323 внутри модулей с именем .. «Module1» или что-то в этом роде. Вы можете вызвать его внутри 'MC323()' с помощью строки 'Call Modules1.MC323()'. Возможно, вам лучше переименовать подпрограммы внутри вашего листа или внутри вашего модуля, чтобы вы случайно не вызвали неправильный 'MC323()' – JNevill

+0

Если вы поместите контрольную точку (нажмите 'F9') в этой строке:' Выберите Case ComboBox1 .Value', затем отлаживайте свой код (нажмите 'F8'), я думаю, вы обнаружите, что @JNevill правильно определил вашу проблему. Ваш код вызывает соответствующий 'Sub', но этот' Sub' фактически не выполняет никакой полезной работы. – FreeMan

0

Мне было интересно, почему я не смог заставить свои примеры работать - MC323, MC616 и MC813 также являются ссылками на ячейки рабочего листа.

Итак ..... убедитесь, что у вас есть лист с кодовым именем Sheet1 и комбинированный блок ActiveX, называемый ComboBox1. В модуле ThisWorkbook:

Private Sub Workbook_Open() 

    With Sheet1 
     .ComboBox1.Clear 
     .ComboBox1.AddItem "MC323" 
     .ComboBox1.AddItem "MyMacro2" 
     .ComboBox1.AddItem "MyMacro3" 
    End With 

End Sub 

Обратите внимание на первый пункт вызовет ошибку - «Не удается запустить макрос„MC323“. Макрос может быть недоступен в этой книге или все макросы могут быть отключены.

В нормальном модуле:

Public Sub MC323() 
    MsgBox "1" 
End Sub 

Public Sub MyMacro2() 
    MsgBox "2" 
End Sub 

Public Sub MyMacro3() 
    MsgBox "3" 
End Sub 

Наконец, в модуле рабочего листа для Лист1:

Private Sub ComboBox1_Change() 
    Application.Run Sheet1.ComboBox1.Value 
End Sub 

Полезные ссылки на файлы справки:

Application.Run Method

Ron de Bruin - How do I use Application.Run in Excel

Смежные вопросы