excel - 在循环的每次迭代中变化的特定范围的总和
问题描述
我有一张表,每次更改特定单元格时,范围的值都会发生变化。假设单元格 C8 是一个人的身份,而列 H 是预定的每月还款额。我需要找到每月的总还款额,因此在 C8 的每个可能值上(这实际上意味着每个人,因为你可以想到 C8 的不同值)我需要还款总额,因此需要单元格的总额,因此,保持第 i 行常量和更改单元格 C8,我总是需要总结 Hi。所以我实际上需要 sum(Hi) (i 常量并且 sum 的索引是单元格 c8,所以如果 c8 取值从 1 到 200,我需要 sum(Hi(c8)),再次行 i . Hi(c8)它只是向您显示 Hi 取决于 c8 的值的符号。单元格 H10 中的实际公式是 INDEX('Sheet2'!R:R,MATCH('Sheet1'!$C$8,'Sheet2'!F: F,0))))。
然后,将 c8 的所有可能值的 H10 的总和粘贴到 c17 中,将 H11 的总和粘贴到 C18 中等等。请在下面找到一些图片,也许这有助于支持我试图实现的目标。在此处输入图像描述
为此,我有以下代码。请注意,上面的示例只是向您解释一下背景,更改的单元格和范围是不同的。
sub sumloop()
Application.ScreenUpdating = False
Application.DisplayStatusBar = False
Sheets("Sheet1").Range("C8").Value = 1
Dim i, k As Integer
i = 1
k = Sheets("Sheet1").Range("C9").Value
Dim LR As Long
LR = Sheets("Sheet1").Range("C" &
Sheets("Sheet1").Rows.Count).End(xlUp).row
Sheets("Sheet1").Range("C17:C" & LR).ClearContents
Do While i <= k
If (Sheets("Sheet1").Range("J9").Value = "") Then
Sheets("Sheet1").Range("h10:h200").Copy
Sheets("Sheet1").Range("c17").PasteSpecial
Paste:=xlValues, Operation:=xlAdd, SkipBlanks:= _
False, Transpose:=False
Else
Sheets("Sheet1").Range("h9:h200").Copy
Sheets("Sheet1").Range("c17").PasteSpecial
Paste:=xlValues, Operation:=xlAdd, SkipBlanks:= _
False, Transpose:=False
End If
Sheets("Sheet1").Range("C8").Value = Sheets("Sheet1").Range("C8").Value+1
i = i + 1
Loop
Sheets("Sheet1").Range("C8").Value = 1
Application.ScreenUpdating = True
Application.DisplayStatusBar = True
End Sub
循环内部的 if 是必需的,因为范围的第一个值的位置取决于一些与代码无关的标准。k 还表示可能值的最大数量。我需要的是大约250。
虽然代码有效,但运行 84 个单元格 C8 值大约需要 40 秒,运行 250 个值大约需要 1.5 分钟。我尝试了一些事情,将 do while 更改为 for 但没有什么意义,使用变量范围而不是像 h10:h100 这样的固定范围,与我对 Sheet1.Range(C17:C&LR) 所做的非常相似。再次没有显着变化。由于我对 vba 很陌生,我不知道 1.5 分钟对于这么简单的代码是否很多,但对我来说似乎很多,并且需要对单元格 c8 的 250 个不同值的 10 种不同组合进行此分析,这意味着大约15分钟。
如果有人能更快地给我建议,我将不胜感激。
非常感谢您提前。
解决方案
欢迎来到 StackOverflow。我必须承认我对你的叙述有点困惑,因为我不完全理解你是在做 sum(a,b,c) 还是 sum(sum(a,b,c), sum(d,e, F), ...)。在任何情况下,一个可以显着加速你的脚本的技巧是使用数组。
使用 VBA 执行计算并不慢,但从 Excel 中检索数据(与应用程序通信)很慢,并且很大程度上取决于“请求”的数量,而不是请求的数据量。
您可以使用数组一次从一个范围内请求数据,而不是分别请求每个单元格的值。
Dim Arr() As Variant
Arr = Range("A1:E999")
就这么简单。试一试,如果您仍在苦苦挣扎,请告诉我们。
奖金
如果您不熟悉数组,请记住您可以拥有一个二维数组:
Dim 2DArray(0 to 10, 0 to 50)
或堆叠数组(数组数组):
Dim MyArray() as String
Dim StackedArray() as MyArray
Dim StackedArray() as Variant
您将需要一个二维数组来从一个范围内提取数据,但我觉得您可能需要一个二维数组数组来计算总和。
推荐阅读
- javascript - 使用 PhantomJS 找不到模块网页
- java - Javafx tableview中的百家乐大眼棒
- java - PrintWriter 不写入 java 文件
- kubernetes - 检测我的 Kubernetes 部署的更新容器映像或 Helm 图表
- java - 使用 Spring JPA 存储库进行不同计数
- ios - 在 iOS 上获取当前位置
- android - Firebase 检查电子邮件是否存在(fetchProvidersForEmail 替代方案)
- r - R以交错(交叉)形式组合两个表
- oracle - Windows 上 Oracle XE 11g 的 ORA-12505
- ios - 无法从swift ios中的一段tableview中删除单元格