Worksheet_SelectionChangeはワークシートのセルの選択に変化(change)があった事でプログラムが起動します。
VBA経費管理1 (Workbookの構成)に基づいて作成しています。
VBA経費管理2 ではWorksheet_Changeについて解説しました。
VBA経費管理3ではWorksheet_SelectionChangeについて解説していきます。
画面下のWorksheet「経費申請」タブを右クリックして「コードの表示」選択してVBE画面に移動します。
画面右上のリストボックスは「Worksheet」と「SelectionChange」を選択。
Private Sub Worksheet_SelectionChange(ByVal Target As Range)が作成されます。
SelectionChangeの全体像
On Error GoTo jump1
Application.EnableEvents = False
cr1 = Target.Row
cc1 = Target.Column
If cr1 = 2 And cc1 = 5 Then ‘モード切替
If Cells(2, 5).Value = “新規” Then
Cells(2, 5).Value = “修正”
Else
Cells(2, 5).Value = “新規”
Clr_01
End If
Cells(cr1, cc1 + 1).Select
End If
入力支援リスト作成
If cr1 = 6 Then ‘入力行
If cc1 = 6 Then ‘伝票日付
If Cells(9, 5).Value <> “作成” Then
MsgBox (“清算完了処理を行ってください。”)
GoTo jump1
End If
If Cells(6, 5).Value = “” Then
Cells(2, 5).Value = “新規”
End If
Cells(6, 6).Value = “”
CalenderA
End If
If cc1 > 6 Then ‘入力列
If Cells(6, 6).Value = “” Then ‘伝票日付入力確認
MsgBox (“伝票日付を先に設定してください。”)
GoTo jump1
End If
End If
If cc1 = 7 Then ‘科目取得
Cells(cr1, 7).Value = “”
kamokuA
End If
If cc1 = 8 Then ‘訪問先/支払先
Cells(6, 8).Value = “”
If Cells(6, 7).Value <> “” Then
str = Cells(6, 7).Value
TextA (str)
End If
End If
If cc1 = 9 Then ‘区間/時間
Cells(6, 9).Value = “”
If Cells(6, 8).Value <> “” Then
str = Cells(6, 8).Value
TextB (str)
End If
End If
If cc1 = 11 Then ‘摘要
str = Cells(6, 8).Value
TekiyouA (str)
End If
Cells(cr1, cc1).Select
End If
‘入力リストからの入力欄へ転記
If cc1 < 3 And cr1 > 6 Then
Select Case Cells(5, 1).Value
Case “日付”
Cells(6, 6).Value = Cells(cr1, 1).Value
Case “勘定科目”
Cells(6, 7).Value = Cells(cr1, 1).Value
Cells(6, 11).Value = Cells(cr1, 2).Value ‘支出、収入
Cells(6, 12).Value = Cells(cr1, 3).Value ‘支出、収入
str = Cells(cr1, 1).Value
str2 = Cells(cr1, 2).Value
Call TextName(str, str2)
Case “Text1”, “訪問先”, “支払先”
Cells(6, 8).Value = Cells(cr1, 1).Value
Case “Text2”, “区間”
Cells(6, 9).Value = Cells(cr1, 1).Value
Case “摘要”
Cells(6, 11).Value = Cells(cr1, 1).Value
End Select
End If
jump1:
Application.EnableEvents = True
End Sub
上から解説していきます。
準備
On Error GoTo jump1
Application.EnableEvents = False
終わりにApplication.EnableEvents = Trueで戻します。
cr1 = Target.Row
cc1 = Target.Column
入力モード切替
If cr1 = 2 And cc1 = 5 Then ‘モード切替
If Cells(2, 5).Value = “新規” Then
Cells(2, 5).Value = “修正”
Else
Cells(2, 5).Value = “新規”
Clr_01
End If
Cells(cr1, cc1 + 1).Select
End If
Cells(cr1, cc1 + 1).Selectで、選択セルを横に移動します。これは連続してモード変更をしたい時に、SelectionChangeを発生させるためです。
If cr1 = 6 And cc1 = 6 Then ‘モード
If Cells(6, 5).Value = “” Then
Cells(2, 5).Value = “新規”
End If
End If
これは経費入力をするときに、E6セルの値を確認して空であれば、”新規”入力であると判断しています。
入力支援(リスト作成)
If cr1 = 6 Then ‘入力行
(中略)
End If
If Cells(9, 5).Value <> “作成” Then
MsgBox (“清算完了処理を行ってください。”)
GoTo jump1
End If
セルE9には”作成”,”発行済”,”清算済”の状態があり、”作成”であることを、処理をすすめる条件としています。
If cc1 = 6 Then ‘日付
Cells(6, 6).Value = “”
CalenderA
End If
If cc1 = 7 Then ‘科目取得
Cells(6, 7).Value = “”
kamokuA
End If
If cc1 = 8 Then ‘訪問先/支払先
Cells(6, 8).Value = “”
If Cells(6, 7).Value <> “” Then
str = Cells(6, 7).Value
TextA (str)
End If
End If
7列目の科目区分を参照して変数strに代入、TextA (str)を呼び出しします。
If cc1 = 11 Then ‘摘要
Cells(6, 11).Value = “”
str = Cells(6, 8).Value
TekiyouA (str)
End If
8列目の科目区分を参照して変数strに代入、TekiyouA (str)を呼び出しします。
Cells(cr1, cc1).Select
次行のEnd Ifは冒頭のIf cr1 = 6 Thenの対になります。
入力支援(入力欄に転記)
If cc1 < 3 And cr1 > 6 Then ‘入力リストからの転記
(中略)
End If
cc1 < 3は1列と2列、cr1 > 6は7行目以降のセルが選択されたことを確認します。
Select Case Cells(5, 1).Value
Case “日付”
Case “勘定科目”
Case “Text1”, “訪問先”, “支払先”
Case “Text2”, “区間”
Case “摘要”
End Select
入力支援(リスト作成)でCalenderA 、kamokuA、 TextA (str)、 TekiyouA (str)が処理され、入力候補欄A、B列6行目以降に日付、科目区分、テキスト、摘要がリストアップされます。
その中から選択(クリック)したものを入力欄に代入します。
CalenderA 、kamokuA、 TextA (str)、 TekiyouA (str)、Call TextName(str, str2)についてはVBA経費管理4 (Worksheet_SelectionChange2)で解説します。(作成中)
jump1:
Application.EnableEvents = True
End Sub
Application.EnableEvents = Trueに戻します。
経費管理3 (Worksheet_SelectionChange1)はこれで終了です。