0

私はVbaを初めて使用します。シート1から5までの5つの異なるシートがあり、最初のシートにはボタンとラベルがあるため、シート3のすべてを選択し、ボタンを押したときにセルの数を表示したいラベルで選択しました

Sub Button2_Click()

Dim rngCell As Range, arrArray() As Variant, i As Integer

ReDim arrArray(1 To Selection.Cells.Count)

i = 1
For Each rngCell In Selection

    arrArray(i) = rngCell.Value
    i = i + 1

Next

ActiveSheet.Shapes("Label 1").Select
Selection.Characters.Text = i


End Sub
4

2 に答える 2

1

これはあなたが思っているよりもはるかに簡単だと思います...

Option Explicit

Sub CaptureSelectionCount()

' Keyboard Shortcut: Ctrl+Shift+E '-> adjust to make sure this doesn't overwrite an existing function in your workbook
Dim lngCnt as Long

lngCnt = ActiveSheet.Selection.Cells.Count

Sheets("Sheet1").Shapes("Label 1").TextFrame.Characters.Text = lngCnt

End Sub
于 2012-10-09T17:58:06.337 に答える
0

これでうまくいきますが、非常にエレガントな方法ではありません。以前に選択したワークシートをキャプチャするには、イベントを利用する必要があります。ワークシートの選択範囲を決定する唯一の方法はそのワークシートをアクティブにすることであるため、ワークシートへの画面更新ジャンプをオフにしてから、元のワークシートに戻って画面更新をオンに戻す必要があります。

次のコードを新しいモジュールに入れます: Option Explicit

'Global variables (avoid using globals if you can)
Public wsLast As Worksheet
Public iSelectedCells As Integer

'Link this sub to your button
Public Sub CountCells()
    If Not wsLast Is Nothing Then
        Sheets("Sheet1").Shapes("Label 1").TextFrame.Characters.Text = "There " & IIf(iSelectedCells = 1, " is " & iSelectedCells & " cell selected ", " are " & iSelectedCells & " cells selected ") & "in " & wsLast.Name
    End If
End Sub

次のコードは、スプレッドシートの「ThisWorkbook」モジュールに入れる必要があります:

Option Explicit

Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)
    Dim wsThisWorksheet As Worksheet

    'Turn off events to avoid triggering a loop
    Application.EnableEvents = False

    'Set this worksheet so we can come back to it
    Set wsThisWorksheet = ActiveSheet

    'Record the deactivated sheet as a global variable
    Set wsLast = Sh

    'Turn off screen updating, go back to the last sheet, count the selection
    Application.ScreenUpdating = False
    wsLast.Activate
    iSelectedCells = Selection.Cells.Count

    'Then come back to the original and turn screen updating back on
    wsThisWorksheet.Activate
    Application.ScreenUpdating = True

    'Restore events
    Application.EnableEvents = True

    'Set the local variable to nothing
    Set wsThisWorksheet = Nothing
End Sub

ボタンでワークシートを非アクティブ化しているかどうかを確認し、非アクティブ化されている場合は無視することで、コードをさらに強化できます。

于 2012-10-11T11:13:24.173 に答える