2016-05-05 6 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

関連する問題