ワークシートのイベント

ワークブックのイベントの処理(プロシージャ)はそのワークブックの中に記述します。
以下はワークシートの主なイベントです。

イベント説明
Activateシートがアクティブになった時。
Deactivateシートが非アクティブになった時。
Changeセルが変更された時。
SelectionChange選択範囲が変わった時。
BeforeDoubleClickセルがダブルクリックされた時。
BeforeRightClickセルが右クリックされた時。
Calculateシートが再計算された時。
FollowHyperlinkハイパーリンクがクリックされた時。
PivotTableUpdateピボットテーブルが更新された時。

ワークシートに対しての処理

  1. 名前(Name)の範囲の再設定
    次のサンプルは例えばデータ設定用のシートで、そのD列の4行目からKeyWordというNameが設定されていて、その列にデータ行が追加・削除された場合、データ設定用シートが非アクティブになった時(他のシートが選択された場合など)に名前の範囲を再計算して設定します。このプロシージャは該当のワークシートに記述します。
    Private Sub Worksheet_Deactivate()
        Dim TempRange As Range
        Dim bottom As Integer
        Dim RowCount As Integer
        
        Set TempRange = Range("D65536")
        bottom = TempRange.End(xlUp).row
        RowCount = bottom - 3
        If RowCount <> Range("KeyWord").Rows.Count Then
            Range("D4:D" & bottom).Name = "KeyWord"
        End If
    
    End Sub
    
  2. 行列番号の表示/非表示
    行列番号を表示したり非表示するにはDisplayHeadingsプロパティをTrue←→Falseに変更します。 次のサンプルは現在ActiveになっているWorksheetの行と列の番号を表示←→非表示に切替えます。このプロシージャは標準モジュールに記述します。
    Sub Heading_Change()
        ActiveWindow.DisplayHeadings = Not ActiveWindow.DisplayHeadings
    End Sub
    
  3. 変更されたセルの処理
    変更されたセルに対して処理を行う場合、Changeイベントにより処理を実行しますが、2つの問題があります。一つ目は一度に複数セルが変更される場合があるということ、2つ目は処理により内容を変更するとそのことによりChangeイベントが発生してループが発生することです。
    ポイントは以下です。
    1. Target(=Range)からChangeイベントの情報を取得します。
      説明
      Target.Cells(1, 1)変更された範囲(Range)の左上のセル
      Target.Row最上行
      Target.Rows.Count変更された行数
      Target.Column最左列
      Target.Columns.Count変更された列数
      余談ですが、変更されたセルが1つの場合でもTarget.Cells(2, 2)は変更されたセルの右下のセルを与えます。(変更された範囲外のセルにもアクセスできます。)
    2. Application.EnableEvents
      セルを変更する前にイベントの発生を止め、処理後にイベントの発生を再開します。
      説明
      Falseイベントを止める
      Trueイベントを発生させる

次のサンプルは上記の点を考慮した例です。このプロシージャは該当のワークシートに記述します。ここでは変更された範囲に3列目(=TgtClm)が含まれていた場合そのアルファベットの小文字を大文字に変更します(To_Upper)。Targetからの相対座標と、シート(me)上の絶対座標を使った2通りの例を記述しました。

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim firstRow As Long, lastRow As Long
    Dim firstClm As Integer, lastClm As Integer
    Dim TgtClm As Integer
    
    TgtClm = 3
 
    firstRow = Target.Row
    lastRow = Target.Row + Target.Rows.Count - 1
    firstClm = Target.Column
    lastClm = Target.Column + Target.Columns.Count - 1
    
'    MsgBox Target.Cells(1, 1)
    
    If firstClm <= TgtClm And TgtClm <= lastClm Then
        Application.EnableEvents = False
        For i = 1 To Target.Rows.Count
            To_Upper (Target.Cells(i, TgtClm - Target.Column + 1))
          'または
            To_Upper (Me.Cells(firstRow + i - 1, TgtClm))
        Next i
        Application.EnableEvents = True
    End If

End Sub

最終更新のRSS
Last-modified: 2014-03-11 (火) 01:58:42 (1414d)