2015-11-09 10 views
3

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

Теперь я хочу запустить их на листе, активировать/деактивировать события. Рабочий лист активируется нормально и переходит в режим разработки.

Однако у VBA возникает проблема выхода из режима разработки из кода. Я что-то упускаю. Или есть совершенно другой способ приблизиться к этому.

Благодаря D

Sub testEnter() 
    EnterExitDesignMode True 
End Sub 

Sub testExit() 
    EnterExitDesignMode False 
End Sub 

Sub EnterExitDesignMode(bEnter As Boolean) 
Dim cbrs As CommandBars 
Const sMsoName As String = "DesignMode" 

    Set cbrs = Application.CommandBars 
    If Not cbrs Is Nothing Then 
     If cbrs.GetEnabledMso(sMsoName) Then 
      If bEnter <> cbrs.GetPressedMso(sMsoName) Then 
       cbrs.ExecuteMso sMsoName 
       Stop 
      End If 
     End If 
    End If 
End Sub 
+1

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

+1

В дополнение к тому, что упоминал @ScottHoltzman, вы также можете поместить элемент управления формы в соответствующий лист и присвоить ему макрос 'testExit'. –

+1

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

ответ

-1

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

+0

Ответ: Режим разработки отключил макросы. Вместо этого я сосредоточусь на том, чтобы помогать людям. Вы должны сказать то же самое Скотту, если так. –

+0

OP уже знает, что режим разработки отключит макросы. Он ищет альтернативный подход. :) –

+0

см. Мой ответ (опубликовано как комментарий под вопросом) –

0

Просто играл, и вы могли попробовать это.

При выборе листа введите имя листа в общедоступном var, затем запустите application.ontime, чтобы проверять каждую секунду, отличается ли имя активного листа от этого var, если при этом вызов ontime отключается в режиме разработки , если нет, то сохраняется режим разработки (ваш существующий код). Просто попробовал быструю демонстрацию в дизайне в VB IDE и In Design на ленте и, похоже, это сработает.

Cheers.

Что-то вроде

Sub EnterExitDesignMode(bEnter As Boolean) 
Dim cbrs As CommandBars 
Const sMsoName As String = "DesignMode" 
    Application.OnTime Now + TimeSerial(0, 0, 1), "TIMER_TEST" 
    Set cbrs = Application.CommandBars 
    If Not cbrs Is Nothing Then 
     If cbrs.GetEnabledMso(sMsoName) Then 
      If bEnter <> cbrs.GetPressedMso(sMsoName) Then 
       cbrs.ExecuteMso sMsoName 
       Stop 
      End If 
     End If 
    End If 
End Sub 

Public Sub TIMER_TEST() 
If ActiveSheet.Name = strSheetName Then 
    EnterExitDesignMode True 
Else 
End If 
End Sub 

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

Не полностью протестирован, но должен помочь.

Спасибо.

+0

application.ontime кажется хорошим решением, но для меня будет включен режим разработки. Какой код вы используете (или, может быть, где его разместить), чтобы запустить триггер режима разработки? –

+0

Это хорошо, но не решает проблему выхода из режима разработки. –

+0

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