【发布时间】:2016-02-26 03:14:33
【问题描述】:
编辑:在下面添加了原始数据示例
我每个月都会生成一份索赔报告,并将数据复制到一个标签中。所有的数据都被组织成列,我一直在使用一个充满SumProduct和CountIf的电子表格来根据不同的标准集来计算和组织数据,但是处理时间太长了我正在尝试编写一个 VBA 子程序来更有效地完成此任务。其中一列数据是“Adjuster Home Office”。此列基本上是每个索赔起源的办公室列表。我使用AdvancedFilter 提取此列中的所有唯一值并将它们复制到 A 列中的单独选项卡中。然后,在 C 列中,在每个位置下方,我有一个声明类型列表或处理的“行项目”在每个办公室。设置这部分我没有问题。在 D 列中,我需要能够在该指定位置显示每个行项目的计数。这就是所有Countif 和SumProduct 在我一直使用的旧模板中发挥作用的地方。这是我遇到障碍的地方。我正在尝试使用 For Each 循环来计算第一个位置下方 B 列中的每个行项目,然后移动到 A 列中的下一个位置并重复。以下是我尝试过的代码:
Private Sub CommandButton23_Click()
Dim linerngs As Range
Dim lineitem As Range
Dim lastlinerow As Long
Dim wsf
Dim TabLastRow
Dim claimstab As String
Dim officesrange As Range
Dim office As Range
claimstab = Sheet2.Range("F2") & " Claims"
TabLastRow = Sheets(claimstab).Cells(Sheets(claimstab).Rows.Count, "A").End(xlUp).Row
Set wsf = Application.WorksheetFunction
officeslastrow = Sheet2.Range("A" & Rows.Count).End(xlUp).Row
lastlinerow = Sheet2.Range("C" & Rows.Count).End(xlUp).Row
Set officerng = Range("A6:A" & officeslastrow).SpecialCells(xlCellTypeConstants, 23)
Set linerngs = Range("C7:C" & lastlinerow).SpecialCells(xlCellTypeConstants, 23)
For Each office In officerng
For Each lineitem In linerngs
If InStr(1, lineitem.Value, "IN") > 0 And InStr(1, lineitem.Value, "AOS") = 0 Then
lineitem.Offset(0, 3) = Application.WorksheetFunction.SumProduct(wsf.CountIfs(Sheets(claimstab).Range("B2:B" & TabLastRow), office))
End If
Next lineitem
Next office
End Sub
我知道这是不正确的,因为这些循环将遍历 B 列中的所有内容,而不仅仅是每个位置下方的行项目。所以我最终得到的是整个列中每个行项目显示的最后一个位置的计数。下面是我需要它的样子的一个例子。现在,我所关心的只是设置循环以正确运行。
我目前得到的示例 [
我想要得到的例子 [
您可以从第一个示例中看到,我得到了所有内容的值“3”。我包括了位置和它们的值的一个支点。您可以看到枢轴中的最后一个位置南波特兰的计数为 3。
任何帮助将不胜感激。
原始数据示例 [
目标 [
[ 订单项列表由要求用户输入的用户表单创建完成
【问题讨论】:
-
使用多张工作表时的快速注释,总是明确说明您正在使用哪个工作表,当使用
Cells()、Range()、Rows.Count等时。例如,将您的行更改为officeslastrow = Sheet2.Range("A" & Sheet2.Rows.Count).End(xlUp).Row(其他变量也一样)。 -
亚特兰大,GA 应该是 7 岁?
-
是的@findwindow,我在那里犯了一个错误。佐治亚州亚特兰大应该是 7
-
这肯定不会比使用 VBA 在范围内循环的公式快。使用优化的 VBA(例如循环变体数组)可能不会更快。无论如何,最好寻求帮助来优化您的公式。
-
@BruceWayne 谢谢我会记住这一点