Excel VBA: les Variantes dans la gamme des Variables
Une question sur les variantes. Im courant que les variantes dans Excel vba sont à la fois le type de données par défaut et aussi inefficace (du point de vue de la surexploitation dans les grandes applications). Cependant, j'ai régulièrement les utiliser pour stocker des données dans des tableaux qui ont de multiples types de données. Un projet en cours, je suis en train de travailler sur est essentiellement une tâche qui nécessite de grands optimistaion de très mauvais code c.7000 lignes) et il m'a fait penser; est-il un moyen de contourner cela?
À expliquer; le code fréquemment stocke les données dans des variables de tableau. Considérons donc un ensemble de données de 10 colonnes par 10000. Les colonnes sont de plusieurs différents types de données (string, double, des entiers, des dates,etc). En supposant que je veux stocker ces informations dans un tableau, j'avais l'habitude;
dim myDataSet(10,10000) as variant
Mais, à ma connaissance, dit que ce sera vraiment inefficace avec le code de l'évaluation de chaque élément afin de déterminer quel type de données il est (quand dans la pratique, je sais ce que j'attend). De Plus, je perds le contrôle que le dimensionnement des différents types de données me donne. Donc, (en supposant que les 6 premiers sont des chaînes de caractères, les 4 doubles pour la facilité d'expliquer le point), j'ai pu,
dim myDSstrings(6,10000) as string
dim myDSdoubles(4,10000) as double
Cela me redonne du contrôle et de l'efficacité, mais c'est aussi un peu maladroit (dans la pratique, les types sont mélangés et différent, et je finis par avoir un nombre impair d'éléments dans chacun d'eux, et finissent par avoir à leur attribuer individuellement dans le code plutôt que sur la masse). Donc, c'est un cas d';
myDSstrings(1,r) = cells(r,1)
myDSdoubles(2,r) = cells(r,2)
myDSstrings(2,r) = cells(r,3)
myDSstrings(3,r) = cells(r,4)
myDSdoubles(3,r) = cells(r,5)
..etc...
Qui est beaucoup plus laid que;
myDataSet(c,r) = cells(r,c)
Donc - ça m'a fait penser - je dois être en manque de quelque chose ici. Quelle est la meilleure façon de stocker une gamme de différents types de données? Ou, en supposant qu'il existe aucun moyen de le faire - ce qui serait le mieux codage pratique pour stocker un tableau de données mixtes-types?
Vous pourriez faire un tableau de tableaux, chaque tableau figurant en étant d'un type spécifique. Vous devriez être en mesure d'indexer via BigArray(3)(4) par exemple. Dick commentaires s'appliquent toujours.
le type de données dans la variante de tableaux est ajusté automatiquement, je crois comprendre que si Excel peut déterminer le Type de données pour chaque élément, il va ajuster automatiquement comme Variante tableaux peuvent stocker des éléments de différents types
OriginalL'auteur Surferosa | 2011-09-22
Vous devez vous connecter pour publier un commentaire.
Jamais optimiser votre code sans le mesurer en premier. Vous serez peut-être surpris d'où le code est le plus lent. J'ai utiliser l'analyseur de performances de l'utilitaire de Professionnel Excel de Développement, mais vous pouvez rouler votre propre aussi.
La lecture et l'écriture et à partir d'Excel Plages est un grand moment de l'évier. Même si des Variantes peuvent perdre beaucoup de mémoire, ce
est généralement plus rapide qu'en parcourant les lignes et les cellules.
Ma méthode de prédilection pour l'utilisation des tableaux avec plusieurs types de données, est de ne pas utiliser des tableaux. Plutôt, je vais utiliser un module de classe et de créer des propriétés pour les éléments. Ce n'est pas nécessairement un gain de performances, mais elle rend le code plus facile à lire et à écrire.
Merci Dick - c'est le type de choses que je recherchais. À la fois la boucle et le degré d'optimisation requis sont un peu hors de propos dans le présent - le code prend 15 minutes et j'ai une vue assez détaillée de bits qui sont à l'origine du goulot d'étranglement (surexploitation des variantes n'est certainement pas la cause!). C'était plus une question générique; je hadnt pensé à utiliser les modules de classe à construire propriétés - je peut poster une nouvelle question sur cette approche en fonction des ressources que je peux trouver. Merci beaucoup.
Trouvé ce Q qui a un assez bon exemple de la façon dont il peut être fait. stackoverflow.com/questions/2161666/...
OriginalL'auteur Dick Kusleika
Je ne suis pas sûr que le goulot d'étranglement vient de la
Variant
de frappe de votre tableau.Par la façon dont, à définir les valeurs à partir d'un tableau à une plage Excel, vous devez utiliser (dans Excel 8 ou plus):
Sur les versions précédentes, vous devez utiliser le code suivant:
de cette source que vous devez lire pour VBA optimisation.
Encore, vous devriez profil de votre application pour voir où votre goulets d'étranglement. Voir cette question de Issun pour vous aider à tester les performances de votre code.
myArray = range("a1:b2")
!!myArray = range("a1:b2").value
OriginalL'auteur JMax