ワークシートのイベント †
ワークブックのイベントの処理(プロシージャ)はそのワークブックの中に記述します。
以下はワークシートの主なイベントです。
イベント | 説明 |
Activate | シートがアクティブになった時。 |
Deactivate | シートが非アクティブになった時。 |
Change | セルが変更された時。 |
SelectionChange | 選択範囲が変わった時。 |
BeforeDoubleClick | セルがダブルクリックされた時。 |
BeforeRightClick | セルが右クリックされた時。 |
Calculate | シートが再計算された時。 |
FollowHyperlink | ハイパーリンクがクリックされた時。 |
PivotTableUpdate | ピボットテーブルが更新された時。 |
ワークシートに対しての処理 †
- 名前(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
- 行列番号の表示/非表示
行列番号を表示したり非表示するにはDisplayHeadingsプロパティをTrue←→Falseに変更します。
次のサンプルは現在ActiveになっているWorksheetの行と列の番号を表示←→非表示に切替えます。このプロシージャは標準モジュールに記述します。
Sub Heading_Change()
ActiveWindow.DisplayHeadings = Not ActiveWindow.DisplayHeadings
End Sub
- 変更されたセルの処理
変更されたセルに対して処理を行う場合、Changeイベントにより処理を実行しますが、2つの問題があります。一つ目は一度に複数セルが変更される場合があるということ、2つ目は処理により内容を変更するとそのことによりChangeイベントが発生してループが発生することです。
ポイントは以下です。
- Target(=Range)からChangeイベントの情報を取得します。
値 | 説明 |
Target.Cells(1, 1) | 変更された範囲(Range)の左上のセル |
Target.Row | 最上行 |
Target.Rows.Count | 変更された行数 |
Target.Column | 最左列 |
Target.Columns.Count | 変更された列数 |
余談ですが、変更されたセルが1つの場合でもTarget.Cells(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