首页 > 解决方案 > 在循环的每次迭代中变化的特定范围的总和

问题描述

我有一张表,每次更改特定单元格时,范围的值都会发生变化。假设单元格 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分钟。

如果有人能更快地给我建议,我将不胜感激。

非常感谢您提前。

标签: excelvbaloopscopypaste

解决方案


欢迎来到 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

您将需要一个二维数组来从一个范围内提取数据,但我觉得您可能需要一个二维数组数组来计算总和。

一些推荐阅读:https ://excelmacromastery.com/excel-vba-array/


推荐阅读