Excel VBA – 将公式结果分配给数组

这可以将值放在列中:

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 

我修改了我在mrexcel.com上find的原始代码

我得到正确的值列表,无论是我Debug.Print或打印到工作表。 所以在我看来,我应该能够将它们的值放入数组中,然后使用Range(“BG2:BG500”)。Value = Application.Transpose(myarray)。

我假设如果我这样做,值将被放置在列中的单元格,而不是一次一个,这是这个代码,以及所有其他我已经尝试过的。 我还假设,如果将这些值同时放入列中的单元格中,则比将单元格中的值放入一次的速度要快得多。

我无法做的是获取代码公式后,将值放入数组中。 我已经尝试过以下的变体,但没有成功 – 设置数组的语句,并使数组获取计算值,并用==>标记。 我得到的最常见的错误是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 

当您像Dim JR_Values(500)一样Dim JR_Values(500)variables数组时,您将基于从零开始的索引创build一维数组。 数组中的第一个元素是JR_Values(0) ,最后一个是JR_Values(500) ,总共有501个数组元素。 虽然可以使用小math从0到499,但也可以通过声明这种方式强制variables数组上的基于一个索引。

当使用Application Evaluate时,BC行和BE列的假设工作表父项(来自单个行数据条件)不是确定性的,就像在工作表上使用相同的公式时一样。 工作表知道它是谁; VBA可能会或可能不知道你在暗示什么工作表。

 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 

我已经留下了很多评论,供您审核并随后清理。 我最近写了一个叙述如何将一个数组的可变长度赋值给整数variables ,来声明一维和二维变体数组。