2014-02-21 150 views
4

我有一個Excel電子表格,其中包含兩個名爲「Cities」和「Data」的工作表。 「數據」頁面包含108264行數據,列一直向上到列AT。陣列公式到VBA

在城市工作表下,我有一個從B4到B214行的210個城市的列表。在它旁邊(C欄)列出了每個城市使用的代碼計數(即該城市使用了多少代碼)。接下來的20列(D列到W列)應該顯示每個城市最常用的代碼序列(即最不常見的共同代碼)。我附上了帶有樣本僞數據集的圖像,以提供我所指的內容的圖形表示。

Cities Worksheet

Data Worksheet

如果你看市「1」,例如(行4「城市」),你會發現它有5計數,以及最常用的代碼5,然後是4,然後是3,然後是2,最後是1.如果您參考「數據」圖像,則可以看到相關性。

我已經用於該樣本集的陣列式如下:

在 「城市」

 {=IFERROR((MODE(IF(ISNUMBER(SEARCH(B4,Data!$B2:$B6)),IF(ISNUMBER(Data!$K2:$AT6),Data!$K2:$AT6)))),"")} 

在 「城市」

{=IFERROR(MODE(IFERROR(SMALL(IF(ISNUMBER(SEARCH($B$4, Data!$B2:$B6))*ISNUMBER(1/Data!$K2:$AT6)*ISNA(MATCH(Data!$K2:$AT6,$D4:D4,0)),Data!$K2:$AT6,""),ROW(INDEX($A:$A,1):INDEX($A:$A,COUNT(Data!$K2:$AT6)))),"")),"")} 

的E4的D4然後我從E4開始拖動公式,並根據前一列中的數據自動計算常用代碼的頻率。

目標是:每個城市在「城市」工作表中所指出的,我想從「數據」工作表搜索列B和列K至AT返回那些20個最常用的密碼。因此,它會查看B列中的城市,然後查看列K到AT中常用的代碼。

我確實有兩個數組公式用於計算最常用的代碼,比取決於前一列中的值,返回下一個最常用的代碼。問題是,由於這樣一個大的數據集,爲每個單元格創建一個數組公式會耗費大量時間,並會顯着降低Excel電子表格的速度。

所以,這是我到目前爲止已經試過:

  1. 數組公式(請參閱隨附表)
  2. 以下VBAS。第一個返回運行時錯誤'1004'無法設置範圍類的FormulaArray屬性,而第二個不執行任何操作。

任何建議或幫助,無論是加快陣列公式,或相應地修改VBA將不勝感激。如果你有一個備用的VBA,那也是值得讚賞的。

謝謝。

Sub Option1() 
    Dim r As Long 
    For r = 4 To 214 
     Sheet2.Cells(r, 210).FormulaArray = _ 
     "=IFERROR((MODE(IF(ISNUMBER(SEARCH(C" & CStr(r) & ", Data!$B$2:$B$108264)),IF(ISNUMBER(Data!$K2:$AT108264),Data!$K2:$AT108264)))),"")" 
    Next r 
End Sub 



Sub Option2() 

    Sheet1.Range("C4").FormulaArray = _ 
     "=IFERROR((MODE(IF(ISNUMBER(SEARCH(C4, Data!$B$2:$B$108264)),IF(ISNUMBER(Data!$K2:$AT108264),Data!$K2:$AT108264)))),"")" 

    Sheet1.Range("D4:D214").FillDown 

End Sub 

回答

8

首先提示:

在你有""雙方你VBA公式的端部:

...Data!$K2:$AT108264)))),"")" 

在VBA中,如果你想在公式報價,你應該使用雙幣:""""而不是""

二提示:

沒有必要使用循環適用公式範圍內的每個單元:

For r = 4 To 214 
    Sheet2.Cells(r, 210).FormulaArray = "=IFERROR(...C4,...)" 
Next r 

你的代碼將更快如果你願意使用(欄目№210HB):

Sheet2.Range("HB4:HB214").FormulaArray = "=IFERROR(...C4,...)" 

這種做法將自動調整公式中所有的親戚/混合引用:在HB214

  • HB4你會=IFERROR(...C4,...)
  • HB5你會=IFERROR(...C5,...)
  • ...
  • 你將有=IFERROR(...C214,...)

因此,工作代碼將是:

Sheet2.Range("HB4:HB214").FormulaArray = "=IFERROR((MODE(IF(ISNUMBER(SEARCH(C4, Data!$B$2:$B$108264)),IF(ISNUMBER(Data!$K2:$AT108264),Data!$K2:$AT108264)))),"""")" 
+1

謝謝。這非常有用。 – user2722253

+0

**可讀性提示**:四則引號是可怕的 - 當指定一個複雜的公式時,您會*弄錯它們,並且調試它需要很長時間。所以試試這個:'公共常量QQ作爲字符串* 2 =「」「」'將雙引號放入引用的字符串中,並將其用作'strFormula = QQ&「Today =」&QQ&「&DATE() 「......就是這樣,或者Chr(34) –