7
votes

Array de la gamme dans Excel VBA

Eh bien, j'ai eu du mal avec le peu de code et je n'arrive pas à sembler se déplacer ... J'essaie d'obtenir un tableau à partir d'une gamme de cellules, la matrice s'affiche cependant jusqu'à 1 élément large.
Bien voici le code: xxx

selon mon élément de compréhension doit contenir un tableau 2D ... Cependant, je reçois le résultat suivant 1er msgbox impression 5 2nd MsgBox Imprime 1 1

Qu'est-ce qui ne va pas?


4 commentaires

Je ne suis pas un expert VBA, mais la prise de valeur d'une gamme (ou d'une matrice) semble étrange. Est-ce que cela retourne la première valeur de la gamme?


En règle générale, VBA retournerait une matrice 2D avec des valeurs de ligne étant la 1ère dimension et les valeurs de colonne étant la 2e dimension, mais je cherche ici une plage qui a 5 cellules toutes dans une rangée, donc je ne suis pas tout à fait sûr que ce soit un 1D ou 2D Array sera retourné ...


@Dave: Et oui, il ne renvoyait que la première valeur de la gamme ... TOUTES LES IDÉES POURQUOI C'EST DOCIER ?!


Il ne renvoie pas réellement la première valeur de la gamme. Sélectionnez une plage 2D de cellules et appuyez plusieurs fois sur l'onglet . Vous verrez une cellule sélectionnée qui est en surbrillance. C'est la valeur de la cellule renvoie le contenu de.


5 Réponses :


1
votes

c'est correct tel quel. Même si vous sélectionnez une gamme de cellules, vous avez toujours la possibilité de sélectionner une seule cellule de la matrice (et de l'étape par exemple avec l'onglet via les éléments de ce tableau)

Range("D19:H19").Cells(2)


6 commentaires

L'extrait de code ici ici support.microsoft.com/kb/213798 dans le "pour prendre des valeurs de Une feuille de calcul et remplir la matrice "montre un code similaire, alors je me demande pourquoi mon code ne fonctionne pas!


Eh bien, j'ai testé cela sur Excel 2K3. Peut-être que cela est dû au fait que la valeur pourrait être 2-dimensionnelle ... lbound prend un deuxième paramètre qui exprime comme ce que nous appelons la dimension. Je ne suis plus sûr que le paramètre correspond à quelle valeur. Qu'est-ce que VarType (gamme ("D19: H19"). Valeur) retour? Il devrait être vbarray ... Vous pouvez essayer ubound (élément, 1) au lieu de ubound (1)


Eh bien, j'ai essayé ubound (article, 1) mais sans être disponible. Je reçois toujours le 1 1 de la sortie de la 2e msgbox .. Et sur quoi (gamme ("D19: H19"). La valeur) devrait revenir ... je pense que Je ne suis pas vraiment sûr, je ne fais que travailler sur des échantillons de code ..


Hmm étrange alors ... Eh bien, l'article fait référence à toutes les versions avant 2007, mais pas 2007 elle-même. Il est donc possible que cela fonctionne différemment maintenant. Que diriez-vous de la solution avec .Cells (numéro)? ... Encore un autre point: essayez de déclarer l'élément avec élément () au lieu de élément


En utilisant .Cells (numéro), je devrai parcourir toutes les cellules de la gamme dans une boucle pour la prochaine boucle, non? ... bien s'il n'y a pas d'autre choix que cela ne me dérange pas d'aller pour cette solution ... longtemps comme ça marche de manière cohérente ...


Oui, vous devriez malheureusement. Si la plage ("D19: H19"). Valeur = Yourarray ne fonctionne pas, je ne peux voir aucune autre solution. En fin de compte, Excel ne fait rien d'autre, sauf qu'il fonctionne beaucoup plus vite car il est compilé dans les fonctions de base de Excel



2
votes

Votre article doit contenir un tableau 2-D comme prévu. Si vous collez un point d'arrêt dans votre code et regardez la fenêtre Little "Locaux" de l'éditeur VBA, vous devriez voir cela. Vos appels vers LBound et Ubound reçoivent les limites de la première dimension. Si vous appelez LBound (article, 2) et Ubound (article, 2), vous devez obtenir 1 et 5 comme vous vous attendez.

EDIT: C'est-à-dire une fois que vous avez fait la mission, l'élément ressemblerait à quelque chose que vous auriez pu déclarer comme tel:

ARTICLE DIM (1 à 1, 1 à 5)

Une des banites de la programmation VBA est que les matrices peuvent avoir des limites inférieures arbitraires. Donc, tout votre code doit être conscient de cela.


0 commentaires

11
votes

Le problème est en lbound et ubound strud>

jtolle était correct sur le lbound et Ubound. p> xxx pré>

Cependant, l'élément ne doit pas être Dimmed comme une matrice (vous obtiendrez une erreur). P>

Je pense que c'est ce que vous voulez strong> p>

Dim item As Variant
MsgBox Range("D19:H19").Count
item = Range("D19:H19").Value

MsgBox LBound(item, 2) & " " & UBound(item, 2)

For i = LBound(item, 2) To UBound(item, 2)
  MsgBox item(1, i)
Next


2 commentaires

C'est correct. Mon édition était destiné à décrire la forme du tableau renvoyé en obtenant la propriété de valeur de l'objet de la plage et en la mettant en poste. Je n'avais pas l'intention de suggérer que l'article devrait être déclaré comme une matrice, une seule fois attribuée, il ressemblerait la même chose qu'une variable déclarée comme telle.


@Imfrancisd: Fonctionne comme un charme! Je n'ai toujours pas compris ce que je faisais mal, je ne semble pas comprendre les concepts de tableau dans VBA ..



0
votes

Si vous souhaitez un tableau 1D, pour le rejoindre pour une clause en clause, par exemple, vous devriez transposer votre gamme. J'ai découvert que vous devez transposer deux fois pour une ligne, une fois pour une colonne de données comme celle-ci: xxx

mérite une lecture.


0 commentaires

1
votes

Essayez ceci:

Dim item As Variant
MsgBox Range("D19:H19").Count
item = Application.Transpose(Range("D19:H19").Value)
MsgBox LBound(item) & " " & UBound(item)


2 commentaires

Je pensais que "transposer" était destiné aux colonnes ... va vérifier cela de toute façon ...


FYI, transposition n'est pas disponible dans Excel 2003.