2009-08-26 7 views
1

Je suis en train de transférer Excel VBA vers VB.NET. J'ai une fonction qui prend une sélection de données, et il peut être une dimension ou deux. Le code VBA est assez fluide sur l'utilisation d'une variable comme un tableau 1-D ou 2D, mais VB.NET le marque comme une erreur.Portage VBA vers VB.NET: le paramètre de la fonction est un tableau multidimensionnel possible

Voici le code réduit:

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 

Il échoue avec « nombre d'indices dépasse le nombre de dimensions du tableau indexé » sur la dernière ligne. Edit: La question est quelque chose comme: "Comment puis-je utiliser une seule variable dans VB.NET comme je peux dans Excel VBA - ayant dimensionnalité ambigu/flexible?" A défaut, "Comment recommanderiez-vous de changer le code pour qu'il soit le plus naturel dans VB.NET?"

Répondre

1

Comme je n'ai pas l'échantillon de données pour travailler avec ce non testé, mais quelque chose comme cela pourrait fonctionner:

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 retourne le nombre de dimensions (je suppose que cela se traduit par la même valeur que l'appel au NumberOfArrayDimensions(Y)).

Edit: Je pense que vous devrez également modifier la déclaration de Y à ceci:

Dim Y As Array 
+0

Je pense que le "Dim T comme Array" était ce qui m'a permis de surmonter la bosse. – 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: L'idée est d'utiliser l'objet Range pour obtenir les limites au lieu du tableau.
Je n'ai pas modifié le reste du code (autre que la recherche de dimensions), ce qui nécessitera quelques améliorations.

EDIT2: Parce que la transposition renvoie un tableau dont les limites commencent à 1.
EDIT3: Le code ci-dessus est dans le style VB6. Mais l'idée reste la même dans VB.net

+0

J'imagine que c'est 'cols = Data.Columns.Count'. Pourquoi supposez-vous des tableaux basés sur 1 dans VB.NET? En outre, je peux extraire les données du tableau. Ce n'est pas le problème. – hughdbrown

+0

Alors, quel est exactement le problème? – shahkalpesh

+0

"Comment utiliser une seule variable dans VB.NET pour agir comme dans Excel VBA - ayant une dimensionalité ambiguë/flexible?" A défaut, "Comment recommanderiez-vous de changer le code pour qu'il soit le plus naturel dans VB.NET?" – hughdbrown

Questions connexes