名前付き範囲(data/validation/list source = MyNamedRange)から入力されたExcelドキュメントのセルがいくつかあります。
ここでは、A1:A3の範囲の名前はFoobarです。
B5:B6は、ソースが「Foobar」に設定された状態でデータ検証中です
セルのA2コンテンツをBarからQuuxに更新し、ソースが変更されたため、B5セルのコンテンツがQuuxに自動的に更新されるようにしたいと思います。
マクロを介して実行される可能性がありますが、これをコーディングする方法がわかりません。
ヒントはありますか?
これは危険なようですが、問題はありません。基本的に、Foobarで何かを変更すると、データ検証があるシート上のすべてのセルが検索されます。 DVがFoobarを指していて、値がリストにない場合は、変更された値である必要があります。それは私の限られたテストで動作しました。欠陥があれば教えてください。
Private Sub Worksheet_Change(ByVal Target As Range)
Dim rCell As Range
Dim rFound As Range
'Only run this when a cell in Foobar is changed
If Not Intersect(Target, Me.Range("Foobar")) Is Nothing Then
'Go through every data validation cell in the sheet
For Each rCell In Me.Cells.SpecialCells(xlCellTypeAllValidation).Cells
'if the DV in the cell points to foobar
If rCell.Validation.Formula1 = "=Foobar" Then
'See if the cell's value is in the Foobar list
Set rFound = Me.Range("Foobar").Find(rCell.Value, , xlValues, xlWhole)
'If it's not in the list, it must be the one that
'changed, so changed it
If rFound Is Nothing Then
Application.EnableEvents = False
rCell.Value = Target.Value
Application.EnableEvents = True
End If
End If
Next rCell
End If
End Sub
これは、標準モジュールではなく、ワークシートのモジュールに含まれることに注意してください。いつものように、ワークブックのコピーでコードをテストします。
これを実現するにはVBAを使用するか、B5:B6ごとに追加の計算セルを用意して、セル値が指定された範囲内に含まれなくなったことを検出し、これにフラグを立てる必要があります。
私は以前、そのような依存関係が何千もある巨大なワークブックを維持する必要がありました。デバッグするのは本当に悪夢でした。
このリンク 検証ソース範囲とターゲットセルの間のリンクの一方向の性質を回避する方法について詳しく説明しています。
あなたが今していることは、A2の値をB6に保存することです。ただし、A2への参照を保存する必要があります。その後、B6は自動的に更新されます。フィールド値がこれを行う必要があるため、「= A2」(引用符なし)だと思います。