私の問題は、ワークブックで複数のシートを選択したときにコマンド ボタンが反応しないことです。ここでテストしているワークブックは、この問題の調査とトラブルシューティングのみを目的としています。この問題は、もともとはるかに複雑なワークブックで発見されました。
ワークブックには合計 5 つのワークシートがあります。sheet1 には 4 つの ActiveX コマンド ボタンがあります。これらの 4 つのボタンは、複数のワークシートをまとめて選択するか、シート 1 のみを選択するコードを起動します。
複数のシートを一緒に選択した後、実際にクリックした最後のボタンのみを再度クリックできます。シート 1 の残りのボタンは、無効になっているなどのように応答しなくなります。シートを手動で選択解除して、シート 1 だけを選択すると、コントロールが正常に動作し始めます。
奇妙な.. Excelの何らかのバグに違いないと思います。コードに任せるのではなく、手動で複数のワークシートを選択すると、問題を再現することもできます。
これまでの私の発見のいくつか...
- 2 つ以上のシートを選択する限り、何枚のシートを選択してもかまわないようです。
- VBA コードの選択または手動の SHIFT-CLICK は問題ではありません。
- 最後のボタンのアクティブ化は、他のボタンがロックされても実行されます。
- これは Excel 2010 でのみ発生します。Excel 2007 ではこの問題は発生しませんでした。
- 分離されたワークブックで問題を再現したので、これは破損の問題ではないと思います。
4 つのコマンド ボタンは、以下に示す機能を実行します。コードが実行されると、各ボタンは隣接するセルをマークします。ボタンを 2 回続けてクリックしても機能することを確認するために、1 秒の遅延を設定しました。
- CMD 1: シート 1 のみを選択
- CMD 2: シート 1 のみを選択
- CMD 3: シート 1 とシート 2 を選択
- CMD 4: module1 のサブルーチンを介して sheet1 から sheet4 を選択します。
これがsheet1に添付された私のコードです....
Option Explicit
Private Sub CommandButton1_Click()
Call MarkCmdsAsInactive
Me.Select
Call WaitSeconds(1)
Range("E6").Value = "CMD 1 Works"
End Sub
Private Sub CommandButton2_Click()
Call MarkCmdsAsInactive
Me.Select
Call WaitSeconds(1)
Range("E10").Value = "CMD 2 Works"
End Sub
Private Sub CommandButton3_Click()
Call MarkCmdsAsInactive
Sheets(Array("Sheet1", "Sheet2")).Select
Call WaitSeconds(1)
Range("E14").Value = "CMD 3 Works"
End Sub
Private Sub CommandButton4_Click()
Call MarkCmdsAsInactive
Call SelectSomeSheets
Call WaitSeconds(1)
Range("E18").Value = "CMD 4 Works"
End Sub
Private Sub MarkCmdsAsInactive()
Range("E6").Value = "Inactive"
Range("E10").Value = "Inactive"
Range("E14").Value = "Inactive"
Range("E18").Value = "Inactive"
End Sub
Private Sub WaitSeconds(waitInSeconds As Variant)
Dim newHour As Variant
Dim newMinute As Variant
Dim newSecond As Variant
Dim waitTime As Variant
newHour = Hour(Now())
newMinute = Minute(Now())
newSecond = Second(Now()) + waitInSeconds
waitTime = TimeSerial(newHour, newMinute, newSecond)
Application.Wait waitTime
End Sub
module1 には...
Option Explicit
Sub SelectSomeSheets()
Sheets(Array("Sheet1", "Sheet2", "Sheet3", "Sheet4")).Select
End Sub
2012-10-09 更新
Excel 2010 でこのバグを再現する簡単な方法を次に示します...
- シート 1 に 4 つのコマンド ボタンを配置します。
- 以下のコードを sheet1 にコピーします。
- 「End Sub」ステートメントのそれぞれにブレークポイントを配置します。
- sheet1 だけを選択してボタンをクリックしてみてください。すべてのボタンがルーチンを起動します。
- Shift キーを押しながらクリックして、シートのグループを選択します。
シート グループを選択して、ボタンを再試行します。最後に使用したボタンのみが機能します。
Private Sub CommandButton1_Click() End Sub
Private Sub CommandButton2_Click() End Sub
Private Sub CommandButton3_Click() End Sub
Private Sub CommandButton4_Click() End Sub