2016-05-05 3 views
0

Почему Excel меняет активный лист с моим кодом ниже и как я могу (элегантно/правильно) остановить его?«Worksheet.Visible = xlSheetVisible» Изменяет вкладку «Актив»

У меня есть книга с множеством вкладок, и я использую VBA для фильтрации видимых листингов на основе моих выборок в списке. При приостановке программы после того, как она отображает скрытый лист, используя либо точку останова, либо Application.Wait (Now), все работает правильно, но это наводит меня на плохую практику и предпочтут альтернативу. Я не могу воспроизвести ошибку в новой книге со множеством пустых вкладок, и удаление вызова Application.ScreenUpdating в начале и в конце тоже не меняет моих результатов, поэтому я предполагаю, что слишком долго обрабатывает Excel для обработки каждого из моих листов, и это вызывает странная ошибка.

Эта ошибка раздражает, потому что, если я случайно выбираю неправильный элемент в списке, Excel переключается на другой лист, и мне нужно вручную щелкнуть обратно на листе, который содержит этот список, чтобы исправить мой выбор.

Application.ScreenUpdating = False 
For Each mySheet In Worksheets 
    Select Case mySheet.Name 
     Case "Cost Overview", "Project Eng.", "Mfg Development", "Labor Summary", "S.O.P.", "MFGD Time", "MFGD Group", "HowTo", ChrW(&H21BB) 
      'These sheets are always visible, so do nothing 
     Case Else 
      mySheet.Visible = xlSheetVisible 'or xlSheetHidden or xlSheetVeryHidden or xlSheetVisible 
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' 
      Application.Wait (Now) 'WITHOUT THIS SLIGHT DELAY, ACTIVE TAB CHANGES 
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' 
    End Select 

Next 
For i = 1 To Worksheets("Labor Summary").ListBoxes("ListBoxForSlicers").ListCount 

    'The category names are "Div 1" and "Div 2", referenced here and in the ListBox from ColorIndexTable' 
    CategoryName = Application.WorksheetFunction.index(Range("ColorIndexTable[Category]"), i) 
    CategorySelected = Worksheets("Labor Summary").ListBoxes("ListBoxForSlicers").Selected(i) 

    If CategorySelected Then 
     Select Case CategoryName 
      Case "Div 1" 
       For Each mySheet In Worksheets 
        Select Case mySheet.Name 
         Case "Cost Overview", "Project Eng.", "Mfg Development", "Labor Summary", "S.O.P.", "MFGD Time", "MFGD Group", "HowTo", ChrW(&H21BB) 
          'These sheets are always visible, so do nothing 
         Case "MFGC", "CUT", "ASSM", "HOT MELT", "POT", "MOLD", "POST-OP", "MARK", "PACK", "PPRNT", "TEST" 
          'These sheets ought to be visible, so do nothing 
         Case Else 
          mySheet.Visible = xlSheetHidden 
        End Select 
       Next 

      Case "Div 2" 
       For Each mySheet In Worksheets 
        Select Case mySheet.Name 
         Case "Cost Overview", "Project Eng.", "Mfg Development", "Labor Summary", "S.O.P.", "MFGD Time", "MFGD Group", "HowTo", ChrW(&H21BB) 
          'These sheets are always visible, so do nothing 
         Case "CUT", "ASSM", "TEST", "POST-OP", "PACK" 
          'These sheets ought to be visible, so do nothing 
         Case Else 
          mySheet.Visible = xlSheetHidden 
        End Select 
       Next 
     End Select 
    End If 

Next 
Application.ScreenUpdating = True 

ответ

1

Я также не могу дублировать ошибку ... но вы можете попробовать это в книге, которая делает генерировать ошибку ...

Set oldActive = ActiveSheet 
mySheet.Visible = xlSheetVisible 
oldActive.Activate 
+0

Теперь вопрос только в том, сколько вкладок мне нужно обрабатывать до того, как это станет быстрее, чем добавление 'Application.Wait (Now)' в каждый цикл? Я не знаю ответа, но мне нравится ваше решение, потому что гораздо понятнее, что проблема в его решении, и должна работать независимо от того, насколько медленным (или быстрым) является компьютер. –

0

Я считаю, что это известный случай необходимости очень не рекомендуется DoEvents.

В основном это позволяет Windows обрабатывать все сообщения в очереди, ожидающие выполнения.

Поэтому он обычно не рекомендуется в больших приложениях, но делает чудеса в простых макросах VBA.

Попробуйте это:

Case Else 
     mySheet.Visible = xlSheetVisible 
     DoEvents 
End Select 

Надеется, что это помогает.

+1

Это просто 'DoEvents' не' Application.DoEvents'! – Rory

+0

К сожалению, добавление 'DoEvents' не устраняет проблему, поэтому я думаю, что я не буду использовать эту очень не рекомендуемую функцию в любом случае: \ –

+0

@Rory Мой плохой, исправленный. Благодарю. – ib11

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