
C++で作ったdllにVBAから配列を渡して、計算結果を再びVBAに戻して、アウトプットはVBAで、ということをしています。(経験豊富な方への相談です。)
具体的には、渡したい配列の先頭アドレスをlong型で記憶し、そのlong型の配列を受け渡ししています。
ただ、ご存知の方が多いかもしれませんが、VBAとC++では配列の添え字の順序が逆になっており、非常に面倒です。どういうことかといいますと、
Dim array(0 to 4, 0 to 9) as long
をdllに渡し、array(2,6)を参照したい場合、C++では(Cでの配列名をc_arrayとし、これに先頭アドレスを入れると)、
c_array[(4+1)*6 + 2 ];
としなければならないと思います。これをプリプロセッサで
#define C_ARRAY(a,b) c_array[(4+1)*b + a]
としたらVBでの配列の感覚で扱えますが、この擬似配列C_ARRAY(a,b)を関数に渡すときなどは結局同じ混乱が再び生じることになってしまいます。
これを、何らかの方法で、簡潔に解決することはできないものでしょうか?
VBA(エクセルを念頭においています)のほうで配列の添え字の順序をC++のそれに沿うように変更できたりしたら非常にうれしいですが、無理でしょうか?
No.1ベストアンサー
- 回答日時:
早速の情報どうもありがとうございます。
まだ全部よんでおりませんが、役に立ちそうです。試してみます。
パフォーマンスの低下はある程度ありそうですが、経験的なコメントはありますでしょうか?
No.2
- 回答日時:
解決すべき問題が今ひとつ把握できずにいますが。
VBA 側で
Private Declare Function func Lib "C:\tmp\Array2D\Array2D___Win32_Debug\Array2D.dll" Alias "_func@4" (ByRef a As Long) As Long
...
Dim a(0 To 4, 0 To 9) As Long
...
func a(0, 0)
のように呼び出した場合、C/C++ 側で、
extern "C" __declspec(dllexport) int __stdcall func(long array[][5])
で受ければ、VB 側の a(2,6) は C/C++ では array[6][2] となるのですが…。
「c_array[(4+1)*6 + 2 ]; としなければならないと思います」と書かれていますが、一次元配列で受けてしまわず、二次元配列で受け取れば、単純に添え字の順序が逆になるだけです。これでは問題の解決になりませんか?
ありがとうございます。もともと大きな問題ではないのですが、残念ながら問題の解決にはならないと思います。
VBAでコーディングされた計算時間を要するsubroutineを、スピードアップを図るためCでコーディングしてdllとしてVBAから使用する、ということが念頭にあります。ですので(もとのコードがVBで存在するため)CとVBで配列の順序が異なるとコーディングミスの原因となりやすいのです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) Vbaで数式をポーランド記法に変換するコードを作って実行しようとするとフリーズします。 1 2022/05/24 17:53
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# C言語初心者 ポインタについて、お助けください、、 2 2023/03/15 23:50
- Excel(エクセル) VBA オリジナル関数で選択セルの合計を作成したい 3 2023/03/19 19:45
- PHP PHPでCSVを出力するさいに、ループの中で前の行の値を変更したい 1 2022/10/27 14:21
- PHP 配列の値の更新方法について 1 2022/08/05 09:49
- Visual Basic(VBA) Sheet3から2つの条件でオートフィルターで抽出した個数をSheet2へ入力するマクロで、一つ目の 4 2023/01/12 23:40
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- PHP ファイルの書き込みについて教えて下さい。 1 2023/03/20 12:01
- Visual Basic(VBA) 前回ご教授いただいたコードに覚えたてのループ処理で品名りんごAから順に20回for nextでループ 7 2023/01/13 22:01
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語 配列の長さの上限
-
C# Listを使わずに2次元配列の...
-
ExcelVBAで質問です。離れた二...
-
C# 配列の変数宣言について。
-
配列で格納したものをmsgboxで...
-
unsigned char配列への入力の仕方
-
配列を使わずに、変数名を動的...
-
VBで動的なメモリの確保
-
配列の参照渡しで型が一致しま...
-
VBで構造体の配列を関数に渡す...
-
ポインタの配列のコンマについて
-
整数型の配列をランダムに並べ...
-
sinのマクローリン展開
-
配列をEraseしてもメモリが開放...
-
CSVファイルのデータを2次元配...
-
[VBS] 動的配列について教えて...
-
先頭アドレスとは何ですか?
-
RGB値を画像(PNG・BMPJPEGなど)...
-
2次元配列を戻り値とする関数?
-
データベースの値を構造体へ代入
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語 配列の長さの上限
-
配列を使わずに、変数名を動的...
-
配列で格納したものをmsgboxで...
-
C# 配列の変数宣言について。
-
テキストファイルから文字列を...
-
C# Listを使わずに2次元配列の...
-
先頭アドレスとは何ですか?
-
C言語で特定列だけを抽出して配...
-
【速いブラインドタッチ】手を...
-
配列の参照渡しで型が一致しま...
-
unsigned char配列への入力の仕方
-
ExcelVBAで質問です。離れた二...
-
VBで構造体の配列を関数に渡す...
-
複数の選択範囲の行番号を個別...
-
C++ vectorに配列をプッシュしたい
-
【C言語】配列の中に配列を入れ...
-
配列をEraseしてもメモリが開放...
-
Excel、VBAのユーザーフォーム...
-
Redimした動的配列はEraseする...
-
VB.NET 構造体の配列の検索機能...
おすすめ情報