意外と使える List_Change イベント

[今日のみちしるべ 第4回 みちしるべの由来]

好評(?)のうちに第4回を迎えました「今日のみちしるべ」です。

今日はこのブログのタイトルの「みちしるべ」の由来について、ご紹介したいと思います。

出所はアニメの歌です。少年ジャンプに連載している リボーンという漫画がアニメになっているのですが、子供がこのアニメに相当ハマっています。

このアニメの曲を収録した CD を買ってくれということで買ってあげたのですが、その中に WINDS のヴォーカルの橘慶太のソロデビュー曲で「道標」という歌がありました。

このブログを立ち上げた時に子供がよく聞いていたこともあり、この「みちしるべ」がキーワードとして、引っ掛っておりました。

それで、VSTO の情報提供を通して、自分と Office 開発者の「道標」になればというところで、引用させていただきました。

まあ、つまりはパクリです。(すみません。(笑))

[本題]

さて、List_Change イベントについてですが、

これを使うと、List の範囲内のセルで変更があったセルの位置を取得してくれるものです。

用途的にはデータソースとバインドしているようなシートがある場合、セルやセル範囲の変更について、明示的におこなうことができます。

この List_Change イベントを使うことで、セルやセル範囲だけではなく、応用的にその値も取得できますし、

また、データベースとの連携したアプリケーションで、 Excel 側で排他制御の仕組みを実装することやアップデート時のユーザーへの意識付けをおこなうことも可能になります。

例えば、以下のようなシートがあります。

image

ID 4 の A 列の値を 104 から 105 に変更します。

List_Change イベントを使うことで、変更したセルのスタイルを変えることも可能です。

image 

また、ボタンをクリックすることで、変更したセルの ID と値を取得することもできます。

image

このロジックを外部データソースと連携した Excel アプリケーションで応用することも可能です。

例えば、排他制御とか、変更処理に関するユーザーへの通知です。

以下がサンプルです。サンプルソリューションもあげておくので、ご確認ください。(このサンプルは完全に2007 のみです。すみません。)

Dim countString As String
Dim countString2 As String
Dim cellString As String
Dim cellString2 As String
Dim cellvalue As String
Dim cellvalue2 As String
Private Sub ListObject_Change()
    'List_Change イベントのためのリストの範囲名と範囲を宣言します。
    テーブル1 = Me.Controls.AddListObject( _
                Me.Range("A1", "C14"), "テーブル1")
End Sub

Sub List1_Change(ByVal targetRange As  _
    Microsoft.Office.Interop.Excel.Range, _
    ByVal changedRanges As Microsoft.Office.Tools.Excel.ListRanges) _
    Handles テーブル1.Change

    '取得するセルの表示形式を選択します。"xlA1" か "xlR1C1" が選べます。
    Dim cellAddress As String = targetRange.Address( _
        ReferenceStyle:=Excel.XlReferenceStyle.xlA1)

    '取得したセルの文字列を加工します。"$" を検索して削除します。
    countString = cellAddress.Length
    If countString < 7 Then
        cellString = cellAddress.Replace("$", "")
    End If

    '取得したセルの位置の色を変えます。
    Globals.Sheet1.Range(cellString).Cells.Style = 'メモ'
    '取得したセルの位置から、セルの値を取得します。
    cellvalue = Globals.Sheet1.Range(cellString).Cells.Value
    '取得したセルと同じ行のID 列の値を取得します。
    cellvalue2 = Globals.Sheet1.Range("A" & cellString.Remove(0, 1)).Cells.Value
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

    MessageBox.Show("セルのIDは" & cellvalue2 & "セルの変更後の値は" & cellvalue)

End Sub

また、参考の情報は以下です。

ListObject.Change イベント (2007 System)

https://msdn.microsoft.com/ja-jp/library/microsoft.office.tools.excel.listobject.change.aspx

List_Change.zip