Excel VBA – Affectez les résultats de la formule au tableau

Cela permet de mettre les valeurs dans la colonne:

Sub JR_ArrayToDebugPint2() ' written by Jack in the UK for [url]www.OzGrid.com[/url] ' our web site [url]www.excel-it.com[/url] ' Excel Xp+ 14th Aug 2004 ' [url]http://www.ozgrid.com/forum/showthread.php?t=38111[/url] Dim JR_Values(500) Dim JR_Count As Integer Dim R As Long R = 2 For JR_Count = 1 To 500 Step 1 JR_Values(JR_Count) = Evaluate("=INDEX('Client'!$O$2:$O$347473,MATCH(1,(('Client_Cost'!$D$2:$D$347473=BC" & CStr(R) & ")*('Client_Cost'!$E$2:$E$347473=BE" & CStr(R) & ")),0))") Sheet1.Range("BG" & CStr(R) & "").Value = JR_Values(JR_Count) R = R + 1 'Debug.Print JR_Values(JR_Count) Next JR_Count End Sub 

J'ai modifié le code original que j'ai trouvé sur mrexcel.com

Je reçois la list correcte des valeurs, que je débogue. Imprime ou imprime sur la feuille de calcul. Donc, dans mon esprit, je devrais être capable de mettre les valeurs dans un tableau car elles sont calculées, puis utiliser la plage ("BG2: BG500"). Value = Application.Transpose (myarray).

Je suppose que si je fais cela, les valeurs seront placées dans les cellules dans la colonne tout à la fois, plutôt que l'une à la fois, ce que ce code et tous les autres que j'ai essayé. Je suppose également que, si les valeurs sont placées dans les cellules dans la colonne tout à la fois, il est beaucoup plus rapide que de placer les valeurs dans les cellules une à la fois.

Ce que je ne peux pas faire, c'est get le code pour mettre la valeur dans un tableau une fois que la formule est évaluée. J'ai essayé des variantes de ce qui suit sans succès – les instructions pour définir le tableau et que le tableau prennent la valeur du calcul sont en caps et marquées par ==>. L'erreur la plus courante que j'obtiens est le désaccord entre types.

 Sub JR_ArrayToDebugPint2() Dim JR_Values(500) Dim JR_Count As Integer Dim R As Long ==> DIM arrPRICE(0 TO 500) AS VARIANT R = 2 For JR_Count = 1 To 500 Step 1 JR_Values(JR_Count) = Evaluate("=INDEX('Client'!$O$2:$O$347473,MATCH(1,(('Client_Cost'!$D$2:$D$347473=BC" & CStr(R) & ")*('Client_Cost'!$E$2:$E$347473=BE" & CStr(R) & ")),0))") ==> arrPRICE(R) = JR_VALUES(JR_COUNT) R = R + 1 'Debug.Print JR_Values(JR_Count) Next JR_Count End Sub 

Lorsque vous dimensionnez le tableau variant comme Dim JR_Values(500) vous créez un tableau à un seul dimension basé sur un index basé sur zéro. Ce premier élément dans le tableau est JR_Values(0) et le dernier est JR_Values(500) pour un total de 501 éléments de tableau. Bien que vous puissiez travailler de 0 à 499 avec un peu de mathématiques, vous pouvez également forcer un index unique sur le tableau variant en le déclarant de cette façon.

La parenthèse de la feuille de travail supposée des colonnes BC et BE, dont le critère de données de ligne individuel provient, n'est pas définitive lors de l'utilisation d' Application Evaluate, comme c'est le cas lorsque la même formule est utilisée sur une feuille de calcul. Une feuille de travail sait qui elle est; VBA peut ou ne sait pas quelle feuille de travail vous impliquez.

 Sub JR_ArrayToDebugPint2() Dim olr As Long, rws As Long, JR_Count As Long, JR_Values As Variant 'get some dimensions to the various data ranges With Worksheets("Client_Cost") 'only use as many rows as absolutely necessary olr = Application.Min(.Cells(Rows.Count, "C").End(xlUp).Row, _ .Cells(Rows.Count, "E").End(xlUp).Row) End With With Worksheets("Client") rws = Application.Min(.Cells(Rows.Count, "BC").End(xlUp).Row, _ .Cells(Rows.Count, "BE").End(xlUp).Row) 'override the above statement unless you want to run this overnight rws = 500 End With ReDim JR_Values(1 To rws) 'force a one-based index on the array 'Debug.Print LBound(JR_Values) & ":" & UBound(JR_Values) For JR_Count = LBound(JR_Values) To UBound(JR_Values) Step 1 'Debug.Print Evaluate("INDEX('Client'!O2:O" & olr & _ ", MATCH(1, (('Client_Cost'!D2:D" & olr & "='Client'!BC" & JR_Count+1 & ")" & _ "*('Client_Cost'!E2:E" & olr & "='Client'!BE" & JR_Count+1 & ")), 0))") 'R would be equal to JR_Count + 1 if R was still used (starts as R = 2) JR_Values(JR_Count) = _ Evaluate("INDEX('Client'!O2:O" & olr & _ ", MATCH(1, (('Client_Cost'!D2:D" & olr & "='Client'!BC" & JR_Count + 1 & ")" & _ "*('Client_Cost'!E2:E" & olr & "='Client'!BE" & JR_Count + 1 & ")), 0))") 'Debug.Print JR_Values(JR_Count) Next JR_Count With Worksheets("Client") .Range("BG2").Resize(UBound(JR_Values), 1) = Application.Transpose(JR_Values) End With End Sub 

J'ai laissé beaucoup de commentaires pour que vous puissiez passer en revue et ensuite nettoyer. J'ai récemment écrit un récit de déclaration de masortingces de variantes à une dimension et à deux dimensions dans Comment atsortingbuer la longueur variable d'un tableau à une variable entière .