首先我想说的是,我对 VBA 编码的了解足以让人“感到危险”,正如那句老话所说。
我在图书馆工作,系统给了我一份报告,让我将其制作成一个带总数的表格。我之前用 Countifs 制作过另一份报告(显然需要计数而不是总数),而且相当精简。但是,当我进入需要 Sumifs 公式的这份报告时,我遇到了一个错误,说程序太大。在网上搜索后,我发现我需要将我的子程序分解成更小的程序。这很好,但我觉得我的代码对于我正在做的事情来说可能效率极低。有人可以看一下并告诉我是否有更好的方法来做到这一点吗?
以下是报告全文:
完成后应该是这样的:
该报告关注的是“拥有图书馆”(实际拥有书籍/材料的图书馆)和“流通图书馆”(实际流通书籍/材料的图书馆),结果表对每个图书馆的报告行进行了总结。
我必须按如下方式分解我的程序:
这就是我的 sumifs 编码的样子:
所有这些都有效,但我觉得它非常笨重,可能有一种更简化的方法来编码。如果您需要更多信息,请告诉我,我会更新帖子。
[编辑] - 我将补充说,有 40 个位置(行)乘以 24 个位置(列),因此这个总和表/网格中有 960 个单元格(不仅仅是屏幕截图中的内容),外加三列和三行用于不同的总数。
答案1
我认为您正在做的是主要循环在分支名称上(我可能会使用分支编号);然后循环在城镇代码上(Irondeqouit;Henrietta 等)。目标列以某种方式与分支编号相关联;目标行与城镇代码相关联。
需要存储:分支机构名称以及:行;城镇代码以及:列;
有很多选择,但用户定义类型的数组或字典可能是最有意义的。
下面是一个完全未经测试(且未经过拼写检查)的概括方法。这不是唯一的方法。如果我要做这样的事情,我可能会在子类之外声明用户类型数组并传递它们等。
option explicit
Type towncodeType
code as string
displaycol as string
end Type
Type branchType
branchname as string
displayrow as string
End Type
sub onePossibleWay()
dim branchCount as long
dim townCount as long
dim destRange as string
dim alltowns(10) as towncodeType ' change 10 to total number of towns
dim allBranches(20) as branchType ' change 20 to total number of branches
alltowns(0).code = "BROCK"
alltowns(0).displaycol = "C"
[...] one entry per town, remember to increment the index
allBranches(0).branchname = "Arnett Branch Library"
allBranches(0).diisplayrow = "4"
[...] one entry per branch
for branchcount = 0 to ubound(allbranches)-1
for towncount = 0 to ubound(alltowns)-1
destRange = alltowns(towncount).displaycol & allbranches(branchcount).displayrow
wst.Range(destRange) = application.worksheetfunction.sumifs(wsr.range(H:H"), wsr.range("G:G"), alltowns(towncount).code, wsr.range("E:E"), allbranches(branchcount).branchname
next towncount
next branchcount
end sub
答案2
您或许可以完全抛弃 VBA,而使用 PowerQuery。
选择您的表格,然后使用“数据”>“获取和转换数据”>“从表格/范围”。Power Query 编辑器将打开:
选择“TRACT”列并使用Transform>Pivot Column。按如下方式配置:
单击“确定”后,您将看到 TRACT 值作为列标题,分支名称和分支编号作为行标题,如下所示:
如果您想要重新排列 TRACT 列,可以将它们拖到您想要的位置。您还可以重命名它们,或更改格式。
您可以对数据应用许多其他转换来将其清理成您想要的样子。
您现在可以使用“主页”>“关闭并加载”将查询结果放回电子表格中。
当新数据添加到源表时,您可以通过右键单击并选择“刷新”来重新运行查询: