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) に正しく評価されますが、この結果は # に評価されます価値!