2016-07-11 11 views
0

ここに自分自身の質問に答える。 Microsoft Script Controlで実行されているJavaScriptを呼び出して、いくつかのJSONデータ構造体を返すことができます。スクリプトコントロールのEvaluateメソッドを使用してJSONを解析することは可能ですが、二次元(2D)バリアント配列に書き込んで、シートに直接貼り付けることも、ユーザー定義関数で返すこともできます。これは、データ構造のマーシャリングに対してバンプします。Windows Excel VBAで、2Dバリアント配列にJSONを書き込む

2次元バリアント配列をJavaScript関数に渡して書き込んだり書き戻したりすることはできません。 [あなたが真実でない証拠があれば投稿してください]。したがって、このコードは

'Tools->References-> 
'Microsoft Script Control 1.0; {0E59F1D2-1FBE-11D0-8FF2-00A0D10038BC}; C:\Windows\SysWOW64\msscript.ocx 

Private Sub TestJSONtoOleVariantGridFails1() 

    Dim oScriptEngine As ScriptControl 
    Set oScriptEngine = New ScriptControl 
    oScriptEngine.Language = "JScript" 

    oScriptEngine.AddCode "function WriteResults1(vGrid) { vGrid(0,0)=1.2;vGrid(0,1)='red';vGrid(1,0)=true;vGrid(1,1)=null; return vGrid;};" 

    ReDim vGridBefore(0 To 1, 0 To 1) 
    Dim vGridAfter 
    vGridAfter = oScriptEngine.Run("WriteResults1", vGridBefore) '<---- FAILS with error "Cannot assign to a function result" 

    Debug.Assert vGridAfter(0, 0) = 1.2 
    Debug.Assert vGridAfter(0, 1) = "red" 
    Debug.Assert vGridAfter(1, 0) = True 
    Debug.Assert IsNull(vGridAfter(1, 1)) 


End Sub 

だから、これは最高の2Dバリアント配列を移入する方法の質問は頼む失敗しますか?

私は投稿しているソリューションを持っていますが、他の誰かがJSONと2Dのバリアント配列のマーシャリングを理解しているかどうかを知ることに夢中になります。

答えて

0

ここで私の解決策は、2dバリアント配列をラップし、クラスへの参照を渡すクラスを作成することです。これは "ボクシング"のようなものです。

'Tools->References-> 
'Microsoft Script Control 1.0; {0E59F1D2-1FBE-11D0-8FF2-00A0D10038BC}; C:\Windows\SysWOW64\msscript.ocx 

Private Sub TestJSONtoOleVariantGridSucceeds() 

    Dim oScriptEngine As ScriptControl 
    Set oScriptEngine = New ScriptControl 
    oScriptEngine.Language = "JScript" 

    oScriptEngine.AddCode "function WriteResults(oGrid) { oGrid.Redimension(2,2); oGrid.Cell(0,0)=1.2;oGrid.Cell(0,1)='red';oGrid.Cell(1,0)=true;oGrid.Cell(1,1)=null;};" 

    Dim oGrid As JSONOLEVariant 
    Set oGrid = New JSONOLEVariant 

    Call oScriptEngine.Run("WriteResults", oGrid) 

    Dim vGrid As Variant 
    vGrid = oGrid.ExportGridData 

    Debug.Assert vGrid(0, 0) = 1.2 
    Debug.Assert vGrid(0, 1) = "red" 
    Debug.Assert vGrid(1, 0) = True 
    Debug.Assert IsNull(vGrid(1, 1)) 



End Sub 

及びクラスコードJSONOLEVariant.cls

Option Explicit 
Option Base 0 

Private mvGridData As Variant 

Public Function ExportGridData() 
    ExportGridData = mvGridData 
End Function 

Public Sub Redimension(ByVal lRows As Long, ByVal lColumns As Long) 
    ReDim mvGridData(0 To lRows - 1, 0 To lColumns - 1) 'Zero base 
End Sub 

Public Property Let Cell(ByVal lRow As Long, ByVal lColumn As Long, ByVal vNewValue As Variant) 
    mvGridData(lRow, lColumn) = vNewValue 
End Property 
関連する問題