category name  »  page title date

ワークシート間で同期

titleText という名前のセルのどれかを修正すると、同名の
セルがすべて変更される

複数のワークシートに、同じ内容の値が入力・表示されていて、どのワークシート上で変更しても他のワークシート上でちゃんと変更されているようにしたい、ということがよくあります。
たとえばどんなものがあるでしょうか? 手入力したプロジェクトのタイトルや、多くの計算式で用いる料率の類、グラフの軸線の呼称、その他もろもろ・・・・。これらは、計算上はどこかにあればよいのですが、できれば関係するワークシート上でいつも表示されていて、どこででも変更できるようにしたい。
それをやってみました。
ワークシートの Worksheet_Change イベントで、同期すべきセルであれば、すべてのワークシート上の同名のセルの内容を更新する、というものです。同期すべきセルには、範囲がそのワークシートである(ローカルな)名前をつけておきます。
ここであげた例では、titleText, xAxis, yAxis という名前のセルを同期すべきセルであると定義しています。
標準モジュールには、各ワークシートのイベントから呼び出す SyncroValue() が記載されています。

標準モジュール        SyncroValue()

'----- 同期すべきセル名のリスト
Private Const syncroCellNamesStr = "titleText,xAxis,yAxis"
Private Property Get syncroCellNames()
    syncroCellNames = Split(syncroCellNamesStr, ",")
End Property

'----- 各ワークシートの Worksheet_Change イベントから呼ぶ
Public Sub SyncroValue(ByVal Target As Range)
Dim cellName, syncroCellName
    On Error GoTo trap
    cellName = Target.Name.Name
    cellName = Mid(cellName, InStr(cellName, "!") + 1)
    For Each syncroCellName In syncroCellNames
        If syncroCellName = cellName Then _
            changeMutualValue cellName, Target.value
    Next
trap:
End Sub

'----- titleName, xAxisName, yAxisName を全シートで同期させる
Private Sub changeMutualValue(cellName, newValue)
Dim Worksheet
    On Error Resume Next
    For Each Worksheet In ThisWorkbook.Worksheets
        Worksheet.Range(cellName).value = newValue
    Next
End Sub

これを、各ワークシートのイベントから呼び出すのは、次のようにします。同期したいセルが含まれているすべてのワークシートにこのイベント処理ルーチンをいれておきます。

各ワークシート        Worksheet_Change()

Private Sub Worksheet_Change(ByVal Target As Range)
    Application.EnableEvents = False
    SyncroValue Target
    Application.EnableEvents = True
End Sub

こうやっておけば、たとえば titleText をどこで直しても、ほかにちゃんと反映されます。気持ちがいいですよ。