OFFSET
私のコードは、そのセルのアドレスに依存する数式によって指定された範囲を使用して、セルにリストの検証を設定します。
この検証は、既にコンテンツがあるセルに対してプログラムによって設定されるため、セルの既存のコンテンツが検証に違反しているかどうかを判断する関数が必要です。
次のコードを使用して、これをテストする際に問題が発生しました。
Sub test()
Dim sht As Worksheet
Dim rng As Range
Dim formula As String
Dim rangeName As String
Set sht = ThisWorkbook.Sheets("Sheet1")
With sht
.Range("a1").Value = "a"
.Range("a2").Value = "aa"
Set rng = .Range("b1")
formula = "=OFFSET(INDIRECT(ADDRESS(ROW(),COLUMN())),0,-1,2,1)"
rng.Validation.Add Type:=xlValidateList, Formula1:=formula
rangeName = Replace(formula, "=", "")
Set ResultRange = .Range(rangeName).Find(rng.Value, lookat:=xlWhole)
If ResultRange Is Nothing Then
Debug.Print "violates validation"
Else
Debug.Print "validated"
End If
End With
End Sub
このテストでは、セルとB1
の内容を含むセルにドロップダウン検証を割り当て、の内容がこれらのセルのいずれかと一致するかどうかをチェックする必要があります。しかし、このエラーのある行で失敗します:A1
A2
B1
Set ResultRange
Method 'Range' of object '_Global' failed.
問題は、 を呼び出したときに、 andRange(rangeName)
を適用するセルを Excel が認識できないため、このセル (この場合は ) に解決されるアドレスを何らかの方法で計算する必要があるため、それを割り当てることができることだと思います。への値。ROW()
COLUMN()
formula
$A$1:$A$2
RangeName
では、動的パラメーターを渡すこの式を考えるOFFSET()
と、この式が で指定された範囲に対して返す範囲を取得するにはどうすればよいrng
でしょうか?
編集:状況によって式が変わる可能性があるためOFFSET()
、特定の範囲で始まる式が与えられた場合、その式で指定された範囲を返すソリューションを探しています。OFFSET()
シートにはこのようないくつかの異なる数式があり、数式の 1 つが変更されるたびに検証テストのコードを変更するのは現実的ではないため、ハードコードされたソリューションは受け入れられません。