2017-11-28 15 views
1

VBAでマクロを開発しています。関数を呼び出すときに何らかの理由で変数に括弧を追加する必要があります。 MacでVBAを使用してコードをクロスプラットフォームにし、C++ライブラリとのデータ交換を行うには、これを行います。必要な変数はカッコでこの式に代入することはできません

エラーを再現するコードサンプルがあります。あなたが見ることができるように

Private Type S0 
     x As Double 
    End Type 

    Private Type S1 
     s_0 As S0 
    End Type 

    Private Type S2 
     s_1() As S1 
    End Type 

    Private Sub RunMe() 
     Dim l As S2 
     ReDim l.s_1(1 To 2) 

     'no error 
     Call Display(l.s_1(1).s_0) 

     'compilation error : variable required can't assign to this expression 
     Call Display((l.s_1(1).s_0)) 
    End Sub 

    Private Sub Display(d As S0) 
     MsgBox d.x 
    End Sub 

は、それがadditionalsの括弧で私の機能表示を呼び出すことは論理的ではないのですが、それは基本的な例については、このような作業は、理由は、私は知りません。

基本タイプのみを使用すると機能します。私はそれがユーザー定義型に関連していると思います。

だから、私は2つの質問があります:私は私の例のように括弧を追加するとき

  • をVBAの振舞には何ですか?
  • コンパイルエラーを回避して同じコンパイルを維持するにはどうすればよいですか?

私を読んで助けてくれてありがとう!

+0

あなたの最初の質問に:私の答えを見てください。あなたの2番目の質問に:単にかっこをつけないでください。なぜあなたはそれらが必要だと思いますか? –

+0

Macでは、Display Callの後にライブラリからC++関数を呼び出すと、配列s_1を取得できません。私は、データメモリアドレス(SAFEARRAY *タイプとpvData)へのヌルポインタしか持っていません。 VBA配列がSAFEARRAYであり、ネイティブ(Windowsフレームワーク)でC++で使いやすいため、PC上でうまく動作します。 しかし、Macでは、この構造体をC++で再定義する必要があり、配列のサブパートをC++関数の前の関数に渡す場合を除いてうまくいきます。 – TuDa

答えて

0

VBAのデフォルトの変数渡しメソッドはByRefです。しかし、 "呼び出されたプロシージャがByRefのようなパラメータを宣言したとしても、それらを括弧で囲んでByValを強制することができます。" http://www.cpearson.com/excel/byrefbyval.aspxを参照してください。

だからあなたCall Display((l.s_1(1).s_0))試行は、ユーザー定義型S0ByValとして(l.s_1(1).s_0)を渡します。

しかし、User-defined type may not be passed ByVal。それはなぜエラーです。

+0

ありがとうございます。私はかっこを元に戻していることをよく理解しています。 私の場合は、回避策を見つける必要があります。 ベスト – TuDa

関連する問題