VBAでの多段階配列は可能ですか? – プログラミング – Home

VBAでの多段階配列は可能ですか?
 
通知
すべてクリア

VBAでの多段階配列は可能ですか?


かいね
 かいね
(@かいね)
ゲスト
結合: 19年前
投稿: 2
Topic starter  

開発環境
Visual Basic6.0 (Microsoft Office Excel 2003)
OS WindowsXP SP2

最終的にはExcelのマクロで宣言したDouble型多次元配列を
VC++で作成したDLLに渡したいのですが、多段階配列の宣言の
仕方が分かりません。どなたか教えて頂けませんでしょうか?

VB .NET では、以下のように宣言できますが
Dim D1()() As Double
D1 = New Double(2)(){}
D1(0) = New Double(){ 20, 39 }
D1(1) = New Double(){ 1, 2, 3, 4 }
D1(2) = New Double(2){}

Excelのマクロ(VB6.0)では、
Dim D1()() As Double
これで構文エラーが出てしまいます。
何かやり方があるのでしょうか?


引用解決済
トピックタグ
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

VB6はどうかわかりませんが、VC側でDLLを作成する時に
多段階配列として受け取れないと思われます。
(SAFEARRAYまたはCとしての2次元配列としてデータをもてない、必ずn×mの形になる)


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

> VB6はどうかわかりませんが、VC側でDLLを作成する時に
> 多段階配列として受け取れないと思われます。
誤爆っぽい。。。
SafeArrayCreate関数にVT_ARRAY設定できるかもしれんし。。。

結局のところ一番重要なのはVCとのインタフェースをどうするかになると思います。

多段階配列にすると、必ずCの知識が必要です。(結構ムズめ)
固定の2次元配列ならば、案外楽ちんにできます。


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

> SafeArrayCreate関数にVT_ARRAY設定できるかもしれんし。。。
Neither the VT_ARRAY nor the VT_BYREF flag can be set. とMSDNにありました。
http://msdn.microsoft.com/library/default.asp?url=/library/en-
us/automat/htm/chap7_1rvp.asp

ここまでは、VBに関係ない話なので、無視しといてください。

多段階配列でなく、2次元配列ならば
Dim a( 10, 10 ) As Double
で10×10

動的にとるならば
Dim a() As Double
ReDim a( 10, 10 )
みたいに出来ます。


返信引用
かいね
 かいね
(@かいね)
ゲスト
結合: 19年前
投稿: 2
Topic starter  

Blue様

何回もご丁寧に回答頂き、ありがとうございます。
やっぱり、互換を取るのは本当に難しいですね。

VC側では、動的に配列を確保したくてmallocを
使用しています。これは多段階配列という認識で
合っていますよね…。(多段階配列、まだ勉強不
足なんです。すみません。)

教えていただいたSafeArrayCreateと、インタ
フェース等を再検討してみます。


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

仮に多次元配列だとして、VB側で確保された領域に対しての操作でしたら、
配列のサイズと、先頭の要素を渡してあげれば、そんなに難しいことはないです。
(double*型で処理しようと思えばできると思う)

しかし、C側でVBがつかう領域を確保して、値等を設定して返すには工夫が必要です。
(Cでmallocした領域はVB側では使えない。)


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

いまさらですが、
> VB6はどうかわかりませんが、VC側でDLLを作成する時に
> 多段階配列として受け取れないと思われます。
VB6で、

Dim a() As Variant
Dim b() As Variant

ReDim a(5)
a(0) = Array(1, 2, 3, 4)
a(1) = Array(1, 2, 3, 4, 5)

ReDim b(6)
a(2) = b

で多段階配列として扱えることが出来ました。(質問に答えた時は知識不足でした。)

よって、VC側も VARIANT型で受け取れると思います。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました