2

私の問題は、ワークブックで複数のシートを選択したときにコマンド ボタンが反応しないことです。ここでテストしているワークブックは、この問題の調査とトラブルシューティングのみを目的としています。この問題は、もともとはるかに複雑なワークブックで発見されました。

ワークブックには合計 5 つのワークシートがあります。sheet1 には 4 つの ActiveX コマンド ボタンがあります。これらの 4 つのボタンは、複数のワークシートをまとめて選択するか、シート 1 のみを選択するコードを起動します。

複数のシートを一緒に選択した後、実際にクリックした最後のボタンのみを再度クリックできます。シート 1 の残りのボタンは、無効になっているなどのように応答しなくなります。シートを手動で選択解除して、シート 1 だけを選択すると、コントロールが正常に動作し始めます。

奇妙な.. Excelの何らかのバグに違いないと思います。コードに任せるのではなく、手動で複数のワークシートを選択すると、問題を再現することもできます。

これまでの私の発見のいくつか...

  1. 2 つ以上のシートを選択する限り、何枚のシートを選択してもかまわないようです。
  2. VBA コードの選択または手動の SHIFT-CLICK は問題ではありません。
  3. 最後のボタンのアクティブ化は、他のボタンがロックされても実行されます。
  4. これは Excel 2010 でのみ発生します。Excel 2007 ではこの問題は発生しませんでした。
  5. 分離されたワークブックで問題を再現したので、これは破損の問題ではないと思います。

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. シート 1 に 4 つのコマンド ボタンを配置します。
  2. 以下のコードを sheet1 にコピーします。
  3. 「End Sub」ステートメントのそれぞれにブレークポイントを配置します。
  4. sheet1 だけを選択してボタンをクリックしてみてください。すべてのボタンがルーチンを起動します。
  5. Shift キーを押しながらクリックして、シートのグループを選択します。
  6. シート グループを選択して、ボタンを再試行します。最後に使用したボタンのみが機能します。

    Private Sub CommandButton1_Click() End Sub

    Private Sub CommandButton2_Click() End Sub

    Private Sub CommandButton3_Click() End Sub

    Private Sub CommandButton4_Click() End Sub

4

1 に答える 1

1

ActiveXボタンの「スコープ」に関係していると思います(つまり、スコープはシート1であり、シート1 +シート2 +ではありません...)。複数のシートを選択すると、シート 1 が「アクティブな」シートのままであっても、シート 1 のコマンド ボタンが無効になるようです。ActiveX コンポーネントは sheet1 に対してプライベートであるためです。

Sub CommandButtonX_Click回避策として、モジュール 1に移動し、Privateキーワードを削除し、選択可能な要素として 4 つのサブを含むカスタム リボン MyTools を作成しました。このようにして、サブの可視性をシート レベルからアプリケーション レベルとすべての作品に移動しました。

もちろん、私も変更する必要がありMe.SelectましたSheets("Sheet1").Select(ただし、このようなハードコーディングは嫌いです....)

それが役立つことを願っています...

于 2012-10-08T11:03:59.410 に答える