繁体   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