0

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の内容を含むセルにドロップダウン検証を割り当て、の内容がこれらのセルのいずれかと一致するかどうかをチェックする必要があります。しかし、このエラーのある行で失敗します:A1A2B1Set ResultRange

Method 'Range' of object '_Global' failed.

問題は、 を呼び出したときに、 andRange(rangeName)を適用するセルを Excel が認識できないため、このセル (この場合は ) に解決されるアドレスを何らかの方法で計算する必要があるため、それを割り当てることができることだと思います。への値。ROW()COLUMN()formula$A$1:$A$2RangeName

では、動的パラメーターを渡すこの式を考えるOFFSET()と、この式が で指定された範囲に対して返す範囲を取得するにはどうすればよいrngでしょうか?

編集:状況によって式が変わる可能性があるためOFFSET()、特定の範囲で始まる式が与えられた場合、その式で指定された範囲を返すソリューションを探しています。OFFSET()シートにはこのようないくつかの異なる数式があり、数式の 1 つが変更されるたびに検証テストのコードを変更するのは現実的ではないため、ハードコードされたソリューションは受け入れられません。

4

1 に答える 1

0

これはきれいではありませんが、あなたが好きなことをrngrngます.

rangeName = .Range(.Cells(rng.Row, rng.Column - 1), .Cells(rng.Row + 1, rng.Column - 1)).Address

別の注意として、検証はデフォルトで空白を無視するため、空白をチェックするために if を更新することをお勧めします。

If ResultRange Is Nothing And rng.Value <> "" then
    Debug.Print "violates validation"
Else
    Debug.Print "validated"
End If

要求に応じて編集します。渡された範囲に解析が必要な式があると想定するため、OffsetFormula をオプションにしました。

Function ReturnRange(initialRange As Range, Optional OffsetFormula As String) As Range
    Dim parameters
    Dim upBound As Long
    Dim topLeftCell As Range
    Dim bottomRightCell As Range
    On Error Resume Next
    'If an error occurs result will be Nothing
    If OffsetFormula = "" Then OffsetFormula = initialRange.Formula
    If UCase(Left(OffsetFormula, 7)) = "=OFFSET" Then
        parameters = Split(Left(OffsetFormula, Len(OffsetFormula) - 1), ",")
        'Using upbound variable to avoid constant calls to Ubound(parameters)
        upBound = UBound(parameters)
        Set topLeftCell = initialRange.Offset(parameters(upBound - 3), parameters(upBound - 2))
        Set bottomRightCell = topLeftCell.Offset(parameters(upBound - 1) - 1, parameters(upBound) - 1)
        Set ReturnRange = Range(topLeftCell, bottomRightCell)
    End If
End Function
于 2012-11-10T03:00:45.060 に答える