ファクト取得関数

続いて、ファクト取得関数を実装します。

Function XBRLFact(ByVal instanceFilePath As String, Optional ByVal ContextID As String = “”, Optional ByVal namespaceURI As String = “”, Optional ElementName As String = “”)

On Error GoTo ErrorHandler

Dim inst As TInstance
Dim i As Integer
Dim result() As Variant
Dim selectedFacts() As TFact

‘インスタンスを取得する
inst = ParseInstanceFile(instanceFilePath)
‘インスタンスのファクトから、出力対象のファクトを選択する
selectedFacts = FilterFact(inst.Facts, ContextID, namespaceURI, ElementName)

‘結果を格納する2次元配列の大きさでReDimする。
‘該当のデータが見つからなかったら、UBound(facts)でエラーになるため、ErrorHandlerに
ReDim result(0 To UBound(selectedFacts), 0 To 6)
For i = 0 To UBound(selectedFacts)
result(i, 0) = selectedFacts(i).Value
result(i, 1) = selectedFacts(i).ElementName
result(i, 2) = selectedFacts(i).ElementNamespace
result(i, 3) = selectedFacts(i).ContextID
result(i, 4) = selectedFacts(i).Nil
result(i, 5) = selectedFacts(i).Unit
result(i, 6) = selectedFacts(i).Decimals
Next

XBRLFact = result
Exit Function

ErrorHandler:
Err.Clear
XBRLFact = CVErr(xlErrNA)

End Function

‘ファクトの配列から、対象のファクトを選択する
Private Function FilterFact(Facts() As TFact, ContextID As String, namespaceURI As String, ElementName As String) As TFact()

Dim i As Integer
Dim j As Integer
Dim selectedFacts() As TFact

For i = LBound(Facts) To UBound(Facts)
If (ContextID = “” Or Facts(i).ContextID = ContextID) And _
(namespaceURI = “” Or Facts(i).ElementNamespace = namespaceURI) And _
(ElementName = “” Or Facts(i).ElementName = ElementName) Then

ReDim Preserve selectedFacts(0 To j)
selectedFacts(UBound(selectedFacts)) = Facts(i)
j = j + 1

End If
Next

FilterFact = selectedFacts

End Function

こちらもXBRLの解析が完了しているインスタンスが取得できてしまえば、きわめて簡単です。メンバー変数であるファクトの配列から、条件に合致するファクトを選別し、出力しています。ファクトの配列から条件に合致するファクトだけを選別するため、下請関数FilterFactを作成しました。
なお、この関数をワークシート関数として使う場合、配列数式として入力する必要があります。配列数式として入力するためには、ワークシートの出力範囲のセルを選択して、F2 キーを押し、Ctrl キーと Shift キーを押しながらEnter キーを押します。この数式が配列数式として入力されていない場合、単一の値(1行1列目の値)のみが計算結果として返されます。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>