ReDim Preserve pour un Tableau multidimensionnel en Visual Basic 6
Je suis l'aide de VB6 et j'ai besoin de faire un ReDim Preserve pour un Tableau multidimensionnel:
Dim n, m As Integer
n = 1
m = 0
Dim arrCity() As String
ReDim arrCity(n, m)
n = n + 1
m = m + 1
ReDim Preserve arrCity(n, m)
Chaque fois que je le fais comme je l'ai écrit, j'obtiens l'erreur suivante:
erreur d'exécution 9: indice en dehors de la plage de
Parce que je ne peut modifier la dernière dimension de la matrice, bien dans ma tâche, j'ai changer tout le tableau (2 dimensions dans mon exemple) !
Est-il une solution ou une autre solution pour cela?
OriginalL'auteur Ouerghi Yassine | 2013-05-04
Vous devez vous connecter pour publier un commentaire.
Comme vous le précisez à juste titre, on peut
ReDim Preserve
seulement la dernière dimension d'un tableau (Instruction ReDim sur MSDN):Par conséquent, la première question à décider est de savoir si le tableau en 2 dimensions est la meilleure structure de données pour le travail. Peut-être, 1 tableau multidimensionnel est un meilleur ajustement que vous devez faire
ReDim Preserve
?Une autre façon est d'utiliser de tableau en escalier comme par Pieter Geerkens la suggestion de. Il n'y a pas de support direct pour les tableaux irréguliers en VB6. Un moyen de code de "tableau de tableaux" en VB6 est de déclarer un tableau de
Variant
et faire de chaque élément d'un tableau de type désiré (String
dans votre cas). Le code de démonstration ci-dessous.Encore une autre option est de mettre en œuvre
Preserve
partie sur votre propre. Pour cela, vous aurez besoin de créer une copie des données qui doivent être préservées et puis remplissez redimensionné tableau avec elle.OriginalL'auteur Ilya Kurnosov
Depuis VB6 est très similaire à VBA, je pense que je pourrais avoir une solution qui ne nécessite pas de cette quantité de code à
ReDim
un tableau en 2 dimensions - à l'aide deTranspose
.La solution (VBA):
Ce qui est différent de l'OP de la question: la limite inférieure de
arrCity
tableau n'est pas 0, mais 1. C'est dans le but de laisserApplication.Transpose
faire son travail.Je pense que vous devriez avoir le
Transpose
méthode en VB6.Puis-je vous demander où/comment avez-vous appris de cette Application.La transposition est un raccourci à la Demande.WorksheetFunction.Transposer ?
OriginalL'auteur ZygD
En ce qui concerne cette:
Il suffit d'utiliser un tableau en escalier (c'est à dire un tableau de tableaux de valeurs). Ensuite, vous pouvez modifier les dimensions que vous souhaitez. Un peu plus de travail, peut-être, mais une solution.
oui, c'est fait. Vous pouvez avoir un 1-D tableau de variantes, et les variantes peuvent contenir des tableaux.
OriginalL'auteur Pieter Geerkens
Je n'ai pas testé chacun de ces réponses, mais vous n'avez pas besoin d'utiliser de fonctions complexes pour accomplir cette tâche. C'est tellement plus simple! Mon code ci-dessous dans n'importe quel bureau VBA application (Word, Access, Excel, Outlook, etc.) et est très simple. Espérons que cela aide:
OriginalL'auteur Sam Slaughterbeck
Je sais c'est un peu vieux, mais je pense qu'il y a peut-être une solution beaucoup plus simple qui ne nécessite pas de codage supplémentaire:
Au lieu de transposition, de redimming et la transposition de nouveau, et si l'on parle d'un tableau à deux dimensions, pourquoi ne pas stocker les valeurs transposé pour commencer avec. Dans ce cas, l'instruction redim preserve augmente de fait la droite (deuxième) dimension depuis le début. Ou en d'autres termes, de visualiser, pourquoi ne pas stocker dans des deux lignes, au lieu de deux colonnes si seulement le nombre de colonnes peut être augmenté avec l'instruction redim preserve.
l'index serait que d'être 00-01, 01-11, 02-12, 03-13, 04-14, 05-15 ... 0 25-1 25 etc au lieu de 00-01, 10-11, 20-21, 30-31, 40-41, etc..
Tant qu'il y a une seule dimension qui doit être redimmed conservé l'approche fonctionne encore: il suffit de mettre cette dimension dernier.
Le second (ou le dernier) dimension peut être conservé pendant redimming, on pourrait peut-être dire que c'est la façon dont les tableaux sont censés être utilisés pour commencer avec.
Je n'ai pas vu cette solution, n'importe où, alors peut-être que je suis surplombant quelque chose?
(Posté plus tôt sur la même question, concernant les deux dimensions, l'étendue de réponse ici pour plus d'dimensions)
OriginalL'auteur hombibi
Vous pouvez utiliser un type défini par l'utilisateur contenant un tableau de chaînes de caractères qui seront à l'intérieur de la matrice. Ensuite, vous pouvez utiliser un tableau de ce type défini par l'utilisateur comme à l'extérieur de la matrice.
Ont un look à la suite d'un projet de test:
Exécutez le projet et cliquez sur le formulaire pour afficher le contenu des tableaux.
Cliquez sur Command1 pour agrandir l'extérieur de tableau, et cliquez sur le formulaire à nouveau pour afficher les résultats.
Cliquez sur Command2 pour agrandir intérieure d'un tableau, et cliquez sur le formulaire à nouveau pour afficher les résultats.
Attention cependant: lorsque vous redim que l'extérieur de la matrice, vous avez également de redimensionner l'intérieur des tableaux pour tous les nouveaux éléments de l'extérieur de la matrice de
OriginalL'auteur Hrqls
Je suis tombé sur cette question, tout en frappant de ce bloc de route moi-même. J'ai fini par écrire un morceau de code réel rapide à manipuler ce
ReDim Preserve
sur un nouveau tableau de taille (première ou la dernière dimension). Peut-être que ça aidera d'autres personnes qui font face au même problème.Donc, pour l'utilisation, disons que vous avez de votre tableau défini à l'origine comme
MyArray(3,5)
, et vous voulez faire les dimensions (la première!) plus grand, permet de dire àMyArray(10,20)
. Vous avez l'habitude de faire quelque chose comme ce droit?Mais malheureusement, cela renvoie une erreur, parce que vous avez essayé de modifier la taille de la première dimension. Donc, avec ma fonction, vous faites juste quelque chose comme ceci à la place:
Maintenant le tableau est plus grand, et les données sont conservées. Votre
ReDim Preserve
pour un Multi-Dimension tableau est complet. 🙂Et le dernier mais non le moindre, le miracle de la fonction:
ReDimPreserve()
J'ai écrit cela dans 20 minutes, donc il n'y a pas de garanties. Mais si vous souhaitez utiliser ou à le prolonger, n'hésitez pas. J'aurais pensé que quelqu'un aurait un code comme celui-là déjà, eh bien, apparemment pas. Donc, ici, ya aller collègues réducteurs.
OriginalL'auteur Control Freak
C'est plus compact et le respect de la intial première position dans le tableau et il suffit d'utiliser le premier lié à ajouter de la valeur ancienne.
J'appelle ce sous avec cette ligne pour redimensionner la première dimension
Vous pouvez ajouter un autre test afin de vérifier si la taille initiale n'est pas supérieure à nouveau tableau. Dans mon cas, il n'est pas nécessaire
OriginalL'auteur GeoStoneMarten