2011-05-18 121 views
7

我有一个输出单个值的数组公式,并且我想给出一大堆单元格这个相同的数组公式。问题是,当我将数组公式分配给范围时,它以这样的方式解释公式,它们都将单个调用的输出共享给数组公式,而不是每个公式都输出一个单独的值。使用VBA将ArrayFormula设置为多个Excel单元格

要告诉你我的意思是,我使用下面的代码:

With MarginalData 
    .Range(.Cells(2, 1), .Cells(13, .UsedRange.Columns.Count)).FormulaArray = pullFormula 
End With 

我想,是一个结果,看起来像这样: desired result

这是它看起来像当我在范围内的每个单元格中分别输入数组公式时。

我所得到的是这样的: given result

数组公式中的第一个单元的输出重复中的所有列 - 他们都有着相同的输出。

如何以编程方式分配数组公式,就好像每个单元格都分开分配了一样?


的公式为:

{= INDEX(BatchResults,MATCH(TTID & CHAR(1)& ROW() - 1,BatchResultsTTIDS & CHAR(1)& BatchResultsLayers,0), (!A $ 1,$ BatchTTIDData 1:$ 1,0)MATCH)}

它必须被置于作为数组公式,因为它在单个列进行匹配,而是在两个级联的列。串联的列必须以数组的形式返回,因此公式必须作为数组公式输入。


到目前为止,最简单的解决方案,下面的接受的答案的变体,如下:

Const pullFormula = "=INDEX(BatchResults,MATCH(TTID&CHAR(1)&ROW()-1,BatchResultsTTIDS&CHAR(1)&BatchResultsLayers,0),MATCH(A$1,BatchTTIDData!$1:$1,0))" 
With wrksht 
    With .Range(.Cells(2, 1), .Cells(13, .UsedRange.Columns.Count)) 
     .Formula = pullFormula 
     .FormulaArray = .FormulaR1C1 
    End With 
End With 
+0

您需要能够使'pullFormula'依赖于它所在的单元格,但我们需要使用该字符串来向您展示如何实现这一点(如果可能的话)。 – 2011-05-18 16:58:29

+0

正如你在上面看到的,pullFormula已经依赖于它所在的单元格了。它考虑到了当前行和列标题('A $ 1'),每列都不相同。 – Alain 2011-05-18 17:23:37

+0

好问题。并根据[本文](http://colinlegg.wordpress。com/2012/05/23/working-with-range-formulaarray-in-vba /)你有最好的办法 – brettdj 2014-07-12 13:47:27

回答

5

或者拿起阵列公式为R1C1,将范围赋值为FormulaR1C1,然后将FormulaR1C1指定为Array Formula。这假定阵列公式在单元格A2

Sub test() 

With Sheet1 
    pullFormula = .Range("A2").FormulaR1C1 
    Set Rng = .Range(.Cells(2, 1), .Cells(13, .UsedRange.Columns.Count)) 

    Rng.Formula = pullFormula 
    Rng.FormulaArray = Rng.FormulaR1C1 

End With 
End Sub 
+0

该解决方案可以工作,但最奇怪的事情发生时,将公式数组设置为等于formular1c1时,操作速度非常慢 - 甚至比手动循环所有单元更慢,这就是执行该行时出现的情况打开屏幕更新的代码。 – Alain 2011-05-19 15:29:59

+0

@Alain Ouch在大范围内速度很慢!也许它会更快地使用我的方法的第一行,然后自动填充EG Rng.AutoFill目的地:= Rng.Resize(999,Rng.Columns.Count),类型:= xlFillDefault。或者使用'Application.Calculation = xlCalculationManual'稍微快一点 – osknows 2011-05-19 15:59:18

2

代替A $ 1,尽量

INDIRECT(ADDRESS(1,COLUMN())) 
+1

我不知道为什么这样被提高了这么多,COL()甚至不是一个有效的函数excel - 你的意思是COLUMN()。此外,ADDRESS返回一个字符串“$ A $ 1”,“$ B $ 1”等。MATCH函数使用范围而不是字符串。把它放在函数中会打破它。 – Alain 2011-05-19 15:35:54

+1

这并不完全是错误的,为了在将引用转换为字符串之后使该函数有效,必须使用INDIRECT函数,该函数是易失性的,意味着每次任何事情都会重新计算这些昂贵的数组公式在工作手册中改变了,这是非常令人难以接受的。 – Alain 2011-05-19 15:37:54

+0

即使有人忍受了INDIRECT公式,你的改变仍然没有完成,整个范围仍被视为具有单个输出,并且发生相同的重复问题,而不是每个单元格都获得它自己的值。 – Alain 2011-05-19 15:38:50

1

尝试半自动地做它。为第一行设置公式,然后使用FillDown。

Private Sub soCopyFormula() 

    Dim MarginalData As Worksheet 
    Set MarginalData = ActiveWorkbook.Worksheets("Sheet2") 
    Dim oRange As Range 
    Dim i As Integer 

    With MarginalData 
     Set oRange = .Range(.Cells(2, 1), .Cells(13, .UsedRange.Columns.Count)) 
     ' for each column 
     For i = 0 To oRange.Columns.Count - 1 
      ' set first row 
      oRange(1, i).FormulaArray = pullFormula 
      ' copy down 
      oRange.Columns(i).FillDown 
     Next 
    End With 

End Sub 
+0

这个解决方案可行,但比我想要的更复杂。我的临时解决方案实际上比这更简单一些,包括将公式设置为一个单元格,复制,然后复制。 – Alain 2011-05-19 15:30:59

+0

@Alain是的,绝对是一种解决方法。我没有真正使用FormulaR1C1,但现在我会记住这一点。 – 2011-05-19 15:47:49

相关问题