2

2 つのカスタム関数 / 数式を含む複雑な数式を含むセル "A" があります。

セルの値が変更されると、Excel はそのセルに依存するすべてのセルを自動的に再計算することを理解しています。セル "A" がこのメカニズムから更新されると、#VALUE! が返されます。

他に何もせずに、セル「A」を選択し、F2 キーを押して (編集) > Enter キーを押して (編集を終了)、セル「A」の値が再計算され、正しい値が得られます。

EDIT 1 : これらのキーボード ショートカットのうち、 CTRL+ALT+SHIFT+F9 のみが正しい値を示します。他のすべては #VALUE を与えます! 関数に がない場合Application.Volatile

式:

=HLOOKUPRANGE(arr(CB43,CC43,CE43),Q!$CD$3:$DG$28,CG43)

問題の VBA 関数:

Public Function arr(ParamArray fields() As Variant)
    arr = fields
End Function

Public Function HLOOKUPRANGE(headers() As Variant, lookup_range As Range, row_index As Integer) As Variant
    If lookup_range.Columns.Count = 1 Then
        HLOOKUPRANGE = lookup_range(row_index, 1)
    Else
        ' look at the first row in the range for the header
        For colStart = 1 To lookup_range.Columns.Count Step 1
            col = lookup_range.Cells(1, colStart).Value
            If col = headers(1) Then
                colEnd = colStart + lookup_range.Cells(1, colStart).MergeArea.Columns.Count - 1
                Exit For
            End If
        Next

        ' set the new smaller range
        First = lookup_range.Cells(2, colStart).Address
        Last = lookup_range.Cells(lookup_range.Rows.Count, colEnd).Address
        Dim szRange As String
        szRange = First & ":" & Last

        ' set the new headers array
        Dim header_next() As Variant
        If UBound(headers) > 1 Then
            ReDim header_next(1 To UBound(headers) - 1)
            For i = LBound(headers) + 1 To UBound(headers) Step 1
                header_next(i - 1) = headers(i)
            Next
        End If

        HLOOKUPRANGE = HLOOKUPRANGE(header_next, Range(szRange), row_index)
    End If
End Function 

関数を組み合わせた作業は、ヘッダーからルックアップ テーブルをトップダウン方式でナビゲートし、arr() で定義された文字列ヘッダーに基づいてテーブルに値を返すことです。

編集 1 : 計算ステップを確認すると、arr() は HLOOKRANGE({"hdr1","hdr2","hdr3"},Q!$CD$3:$DG$28,CG43) に正しく評価されますが、この結果は # に評価されます価値!

4

1 に答える 1

1

Range() 関数が呼び出されるApplication.ActiveSheetと、同じ関数のセル数式を含むワークシートのスコープではなく、スコープがあるようです。

したがって、私の問題を解決するには、正しいワークシートから Range() を明示的に呼び出す必要があります。

Dim rangeWorksheet as String
rangeWorksheet = lookup_range.Cells(2, colStart).Parent.Name
Dim curws As Worksheet
Set curws = Worksheets(rangeWorksheet)
curws.Range(...)
于 2012-04-27T02:30:22.060 に答える