簡體   English   中英

數組公式到VBA

[英]Array formula to VBA

我有一個Excel電子表格,其中包含兩個名為“Cities”和“Data”的工作表。 “數據”頁面包含108264行數據,列一直向上進行到列AT。

在城市工作表下,我列出了從B4到B214行的210個城市。 旁邊(C列)是每個城市使用的代碼計數列表(即該城市使用的代碼數量)。 接下來的20列(列D到W)應該顯示每個城市最常用代碼的序列(即最常見到最不常見的代碼)。 我用樣本偽數據集包含了圖像,以提供我所指的內容的圖形表示。

城市工作表

數據工作表

如果您將查看City“1”(例如第4行“城市”),您會注意到它的計數為5,最常用的代碼是5,然后是4,然后是3,然后是2,最后是1。如果您參考“數據”圖像,則可以看到相關性。

我用於此示例集的數組公式如下:

在“城市”的D4

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

在“城市”的E4

{=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開始拖動公式,它會根據前一列中的數據自動計算常用代碼的頻率。

目標是:對於“城市”工作表中記錄的每個城市,我想通過從“數據”工作表中搜索列B和列K到AT來返回這20個最常用的代碼。 因此,它將在B列中查找該城市,然后查看K列到AT中常用的代碼。

我有兩個用於此的數組公式(即計算最常用的代碼,而不是依賴於前一列中的值,返回下一個最常用的代碼)。 問題是,由於這么大的數據集,為每個單元格創建一個數組公式變得非常耗時,並且大大減慢了Excel電子表格的速度。

所以,這是我到目前為止所嘗試的:

  1. 數組公式(另請參閱隨附表格)
  2. 在VBAs下面。 第一個返回運行時錯誤'1004'無法設置Range類的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

第一個提示:

在你的兩個VBA公式的末尾,你有""

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

在VBA中,如果要在公式中包含引號,則應使用double qoutes: """"而不是""

第二個提示:

無需使用循環將公式應用於范圍中的每個單元格:

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

您的代碼會更快 ,如果你會使用(列№ 210HB ):

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

此方法將自動調整公式中的所有相對/混合引用:

  • HB4你會有=IFERROR(...C4,...)
  • HB5你會有=IFERROR(...C5,...)
  • ...
  • HB214你會有=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)))),"""")"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM