2010-05-06 10 views
3

Disons que j'ai un tableau de dimension unique (pour le garder simple). Existe-t-il un moyen simple de dire quel est l'indice le plus élevé d'un élément auquel une valeur a été explicitement affectée? autre que de faire une boucle et compter? Je sais que Ubound trouve la plus grande dimension du tableau mais ce n'est pas ce dont j'ai besoin. Y at-il quelque chose comme Ubound mais il ne compte que les éléments peuplés d'un tableau, ou l'index le plus élevé?Dimension la plus élevée d'un tableau vba

Mon tableau contient des chaînes. En outre, que faire si le tableau est multidimensionnel.

Je travaille dans excel vba.

+0

Votre formulation n'est pas claire ... La "dimension la plus élevée" d'un "tableau de dimension unique" est une. Voulez-vous dire la plus grande valeur dans le tableau? – ewall

+1

Il semble que l'OP signifie l'index * le plus élevé d'un élément auquel une valeur a été explicitement affectée, contrairement aux éléments qui ont des valeurs par défaut. Il n'y a aucun moyen de le faire en général dans VBA, mais si vous connaissez le type de valeurs que votre tableau peut contenir, vous pouvez obtenir ce que vous voulez en utilisant l'une des fonctions d'Excel (comme COUNTA) via 'Application.WorksheetFunction' – jtolle

+0

avec @jtolle, donc une réponse spécifique devra faire en fonction de plus de détails de votre tableau que vous avez besoin de partager. –

Répondre

3

Dans un mot court, non il n'y a pas de mécanisme intégré pour ce faire, mais si vous cherchez un moyen de le pirater, alors lisez la suite.

Cela dépend de la façon dont vous remplissez la baie. Si c'est séquentiel, le plus simple serait d'avoir un compteur. Si elle est randomisée alors vous avez un plus grand défi de trouver l'indice exact du dernier élément. Une idée, est de commencer à partir du maximum et commencer à compter.

Si le tableau est initialisé, vous pouvez compter les valeurs par défaut et les soustraire du trafic sortant.

Il y a d'autres idées, mais vous devez définir plus clairement le problème pour nous donner une meilleure chance de répondre. De préférence avec un exemple.

2

Je suggère d'utiliser ReDim Preserve lorsque vous remplissez la baie. Ainsi, UBound fonctionnera très bien pour vous. Seule la dernière dimension d'un tableau multidimensionnel peut être ReDimmed.

+0

Cela fonctionnerait, mais ce n'est pas tout à fait pratique pour ce que je fais, cela signifierait juste que je suis ReDim Persévérer partout. Ce qui pourrait bien se passer. En ce moment je fais une chose semblable que je garde juste la trace quand j'ajoute/enlève quelque chose à/de la rangée. – Ommit

0

Bien sûr, il n'y a vraiment rien de mal avec looping, mais ...

Supposons que vous avez ceci:

Public Sub test() 
    Dim a(1 To 3) 

    a(1) = 1 
    a(2) = "stuff" 

    Debug.Print Application.WorksheetFunction.CountA(a) 
End Sub 

qui imprimera « 2 », étant donné que le troisième élément a une valeur par défaut de 'Vide'. (Notez que votre tableau doit être déclaré comme type Variant pour que cela fonctionne, mais il peut contenir des éléments de type String.Si votre tableau est de type String, il n'y a pas de vide!) Et bien sûr, cela suppose que vous sachez que tous vos vides sont à la fin, puisque c'est juste de compter, pas vraiment de retourner un index. Pour la même raison, vous devez connaître la distribution de vos valeurs dans un tableau à deux dimensions pour que cela soit significatif.

Je pense que c'est ce que vous cherchez, basé sur votre édition.

1

Vous pouvez envisager d'utiliser une classe personnalisée qui contient une variable de tableau, un code pour ajouter des éléments au tableau, ce qui modifierait également une autre variable pour suivre le numéro d'index «utilisé». Vous pouvez ensuite inclure une fonction pour renvoyer le numéro "index le plus élevé" stocké.

Questions connexes