2009-08-26 3 views
1

私はExcel VBAをVB.NETに移植しています。私はデータの選択を取る関数を持っており、それは1次元または2次元かもしれません。 VBAコードは変数を1次元配列または2次元配列のどちらかとして使用することに関して非常に流動的ですが、VB.NETはそれをエラーとしてマークします。最後の行の「インデックスの数は、インデックス付きの配列の次元数を超える」とそれが失敗VB.NETへのVBAの移植:関数パラメータはおそらく多次元配列です

Public Function Stat(ByVal Data As Range) As Object 
    Dim Y() As Object 
    Dim Appp As New Application() ''// Very annoying 

    ''//Convert worksheet range into array vector 
    Y = Appp.WorksheetFunction.Transpose(Appp.WorksheetFunction.Transpose(Data)) 

    Dim dimensions As Integer : dimensions = NumberOfArrayDimensions(Y) 

    If dimensions > 1 Then 
     For i = LBound(Y) To UBound(Y) 
      If VarType(Y(i, 1)) <> 0 Then 

:ここ

を低減するコードです。

編集:「Excel VBAでできるように、VB.NETで1つの変数を使用するにはどうすればよいですか?あいまい/柔軟な次元がありますか?それに失敗すると、「VB.NETで最も自然になるようにコードを変更することをどうお勧めしますか?」

答えて

1

私はこれで動作するようにサンプルデータを持っていないのでテストされていないが、このような何かがうまくいくかもしれない:

Dim dimensions As Integer : dimensions = Y.Rank 

If dimensions > 1 Then 
    For i = Y.GetLowerBound(0) To Y.GetUpperBound(0) 
     If VarType(Y.GetValue(i, 1)) <> 0 Then 

Y.Rank次元の数を返します(私はこれはと同じ値になり仮定NumberOfArrayDimensions(Y)への呼び出し)。

編集:

Dim Y As Array 
+0

「Dim Tを配列として」と思っています。 – hughdbrown

0
Public Function Stat(ByVal Data As Range) As Object 
Dim Y() As Object 
Dim Appp As New Application() ''// Very annoying 

dim rows as Integer 
dim cols as Integer 

dim rowCtr as Integer = 1 
dim colCtr as Integer = 1 

rows = Data.Rows.Count 
cols = Data.Columns.Count 

Y = Appp.WorksheetFunction.Transpose(Appp.WorksheetFunction.Transpose(Data)) 

for rowCtr = 1 to rows 
    for colCtr = 1 to cols 
    Debug.Print Y(rowCtr, colCtr) 
    next 
next 

はEDIT::アイデアは境界の代わりの配列を取得するRangeオブジェクトを使用することです、私はあなたにもこれにYの宣言を変更する必要があると思います。
私はコードの他の部分を変更していません(寸法を見つける以外に)。これにはいくつか改善が必要です。

EDIT2:Transposeは、範囲が1から始まる配列を返します。
EDIT3:上記のコードはVB6スタイルです。しかし、その考えはVB.netでも同じです。

+0

私はそれが 'cols = Data.Columns.Count'だと思います。なぜあなたはVB.NETで1ベースの配列を前提としていますか?また、配列からデータを取り出すこともできます。それは問題ではありません。 – hughdbrown

+0

だから、どうして問題なのですか? – shahkalpesh

+0

"VB.NETで1つの変数をExcel VBAのように使用するにはどうすればよいですか?それに失敗すると、「VB.NETで最も自然になるようにコードを変更することをどうお勧めしますか?」 – hughdbrown