2011-05-18 218 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

相關問題