web-dev-qa-db-ja.com

Excel:名前付き範囲の値を更新します

名前付き範囲(data/validation/list source = MyNamedRange)から入力されたExcelドキュメントのセルがいくつかあります。

Sample

ここでは、A1:A3の範囲の名前はFoobarです。

B5:B6は、ソースが「Foobar」に設定された状態でデータ検証中です

セルのA2コンテンツをBarからQuuxに更新し、ソースが変更されたため、B5セルのコンテンツがQuuxに自動的に更新されるようにしたいと思います。

マクロを介して実行される可能性がありますが、これをコーディングする方法がわかりません。

ヒントはありますか?

6
Vinzz

これは危険なようですが、問題はありません。基本的に、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

これは、標準モジュールではなく、ワークシートのモジュールに含まれることに注意してください。いつものように、ワークブックのコピーでコードをテストします。

4
dkusleika

これを実現するにはVBAを使用するか、B5:B6ごとに追加の計算セルを用意して、セル値が指定された範囲内に含まれなくなったことを検出し、これにフラグを立てる必要があります。

私は以前、そのような依存関係が何千もある巨大なワークブックを維持する必要がありました。デバッグするのは本当に悪夢でした。

このリンク 検証ソース範囲とターゲットセルの間のリンクの一方向の性質を回避する方法について詳しく説明しています。

1
Lunatik

あなたが今していることは、A2の値をB6に保存することです。ただし、A2への参照を保存する必要があります。その後、B6は自動的に更新されます。フィールド値がこれを行う必要があるため、「= A2」(引用符なし)だと思います。

0
Martin