Le moyen le plus efficace d'parsingr dans une large gamme dans un réseau VBA

J'ai une large gamme de données dans excel que je voudrais parsingr dans un tableau pour une fonction définie par l'user. La scope est de 2250 x 2250. Il faut trop longtime pour parsingr chaque cellule via une boucle for, et il est trop important pour être affecté à un réseau via cette méthode:

dim myArr as Variant myArr = range("myrange") 

Juste un brainstorming ici, serait-il plus efficace d'parsingr dans chaque colonne et de join les arrays? Des idées?

Merci

Vous êtes presque là.

Le code dont vous avez besoin est:

 Dim myArr as Variant myArr = range("myrange").Value2 

Notez que j'utilise la propriété .Value2 de la gamme, pas seulement 'Value', qui lit les formats et les parameters régionaux, et mangera probablement toutes les dates

Notez également que je n'ai pas dérangé Redim et spécifié les dimensions du tableau: les propriétés Value et Value2 sont un tableau bidimensionnel (1 à Rowcount, 1 à Col Count) … Sauf si c'est une cellule unique , qui sera une variante scalaire qui brise tout code en aval qui attendait un tableau. Mais ce n'est pas votre problème avec une gamme 2250 x 2250 connue.

Si vous inversez l'opération et écrivez un tableau dans une plage, vous devrez définir la taille de la plage de réception exactement aux dimensions du tableau. Encore une fois, pas votre problème avec la question que vous avez posée: mais les deux opérations vont généralement set.

Le principe général est que chaque «hit» à la feuille de travail prend environ un vingtaine de secondes – certaines machines sont beaucoup plus rapides, mais elles ont tous des mauvaises journées – et le «succès» ou la lecture d'une seule cellule à une variable est presque exactement la même que la lecture d'une gamme de sept millions de cellules dans une variante. Les deux sont plusieurs millions de fois plus rapides que la lecture de cette gamme dans une cellule à la fois.

Quoi qu'il en soit, vous pouvez également countr toute opération dans VBA comme étant en time zéro une fois que vous avez effectué la «lecture» et que vous avez cessé d'interagir avec la feuille de calcul.

Les numbers sont tous très difficiles à mettre en place, mais les principes généraux se maintiendront jusqu'au moment où vous commencez à allouer des arrays qui ne correspondent pas à la memory de travail et, encore une fois, ce n'est pas votre problème aujourd'hui.

N'oubliez pas d' Erase la variante du tableau lorsque vous avez fini, plutôt que de countr sur le fait de sortir de la scope: cela fera une différence, avec une scope de cette taille.

Je viens de faire un test, et sur ma machine, le suivi prend environ 1-2 secondes pour l'exécution. Il semble que vous pouvez simplement atsortingbuer les valeurs à un object de scope

 Public Sub get_Range() Debug.Print Now() Dim myRange As Range: Set myRange = Range("A1:BEA5000") 'over 7,000,000 Cells Dim Cell As Range For Each Cell In myRange 'Do something here Next Debug.Print Now() End Sub 

Cela fonctionne bien.

 Sub T() Dim A As Variant A = Range("A2").Resize(2250, 2250).Value2 Dim i As Long, j As Long For i = 1 To 2250 For j = 1 To 2250 If i = j Then A(i, j) = 1 Next j Next i Range("A2").Resize(2250, 2250).Value2 = A End Sub