あなたのデータは、VBAコードではなく、スプレッドシート(Rangeオブジェクト)から来ると仮定しています。
この場合Excelは、セルの内容が何であっても、SafeArray of Double(Double()
)ではなく、SafeArray of Variants(VBA用語ではVariant()
)を渡します。そして、配列が常に2次元であるということは間違いありません(または、範囲のサイズが正確に1x1であれば、単一のVariantを返します)。
私はJACOBに精通していません。はい、ドキュメントはむしろ欠けています。 getDoubles()
は、SafeArrayがSafeArray of Doublesである場合にのみ機能しますか? getVariants()
を使用しようとしましたか?あなたが何かを戻すなら、我々は正しい道にいると知っているでしょう。
パフォーマンス面では、あなたは固執しています。誰か(あなたまたはライブラリ)がそのループを書く必要があります。バリアントは魔法のように倍になることはありません。誰かが配列をループするか、Win32 VariantChangeType()
またはそれに相当するメソッドを呼び出し、Variant(明らかにJACOBでchangeType()
と呼んで、次にgetDouble()
と呼ぶ)からdoubleフィールドを抽出し、最後に結果をJavaのdouble配列に置きます。 JACOBがあなたのためにこれをするかどうか、あるいはあなた自身でそれをする必要があるかどうかはわかりません。
JACOBに精通していません私は理解できませんが、これが役立つことを願っています。がんばろう。
[PS:]
私はVariantChangeType()
を呼んでそのコメントを明確にする必要があります感じています。これは技術的にはオプションですが、バリアントをVariantChangeType()
またはこれに準ずる方法で関心のあるデータ型に明示的に変換するのが一般的には健全です。数字が文字列などに格納されるのは簡単すぎます。特に、ソースがExcelのようなフリーフォームである場合は特にそうです。このAPIコールは、CDbl()
のような関数を使用するときにVB/VBAが呼び出すものです。間違った書式設定は、Doubleの代わりにDATEを指定するだけです。
すべてのセルに数値(倍精度値)が含まれていることを確認していない場合、Excelは何も返すことはありません。その場合は必ずJACOBのgetDouble()
を呼び出し、変換ステップをスキップしてください。
こんにちは、 はい、データはRangeオブジェクトから取得され、そこから2次元SafeArrayが取得されます。そして、はい、それは変種で作られていますが、ダブルスだけを扱っているので、私はそれを倍にしています。 JACOB SafeArrayには、toDoubleArray()というメソッドがあり、それは正確に行い、double []に変換し、ネイティブです。これは変換に使用したかったものですが、(ループなしで)必要な値を含む2次元SafeArrayにVariantを直接抽出することはできません(VariantはSafeArrayに簡単に変換できます)。 –
私はgetVariants()も試しましたが、getDoubles()と同じように、私は何も取得していません。私はそれらの方法の使い方についてここで何かを見逃しているに違いありません。とにかくあなたの入力のためにありがとう! –
@Milo、まだ何も追加していないと申し訳ありません。私はまだ頭を掻いている。 –