VBA,需要基于另一列中的更改的条件和
VBA新手。尝试运行与每个id相关的唯一id和小计值列表 之后,该总和需要显示在第一行的不同列中 考虑事项:VBA,需要基于另一列中的更改的条件和,vba,excel,Vba,Excel,VBA新手。尝试运行与每个id相关的唯一id和小计值列表 之后,该总和需要显示在第一行的不同列中 考虑事项: 当它找到一个新id时,小计需要重新开始,并且只小计与之相关的值块 每个小计只需在列表中唯一id的第一个实例旁边显示一次 每个新工作表将有5k行或更多行,并且数据将在相同的列中。大量的数据 我的工作表中的列实际上并不相邻,而是在同一工作表中 在每次打印中,custid将在不同的行中更改。它需要遍历id,找到更改,并仅对该custid的值求和。 之后,该总和需要显示在第一行的不同列中 这
- 当它找到一个新id时,小计需要重新开始,并且只小计与之相关的值块李>
- 每个小计只需在列表中唯一id的第一个实例旁边显示一次李>
- 每个新工作表将有5k行或更多行,并且数据将在相同的列中。大量的数据
- 我的工作表中的列实际上并不相邻,而是在同一工作表中
- 在每次打印中,custid将在不同的行中更改。它需要遍历id,找到更改,并仅对该custid的值求和。 之后,该总和需要显示在第一行的不同列中
123456 55.74
123456 61.47
223456 44.53
223456 142.11
223456 -142.11
333456 44.53
333456 52.89
333456 118.37
333456 354.80
443456 6.49
443456 44.53
443456 162.74
946.09 117.21 123456 55.74
123456 61.47
44.53 223456 44.53
223456 142.11
223456 -142.11
570.59 333456 44.53
333456 52.89
333456 118.37
333456 354.80
213.76 443456 6.49
443456 44.53
443456 162.74
为此:
总客户金额
123456 55.74
123456 61.47
223456 44.53
223456 142.11
223456 -142.11
333456 44.53
333456 52.89
333456 118.37
333456 354.80
443456 6.49
443456 44.53
443456 162.74
946.09 117.21 123456 55.74
123456 61.47
44.53 223456 44.53
223456 142.11
223456 -142.11
570.59 333456 44.53
333456 52.89
333456 118.37
333456 354.80
213.76 443456 6.49
443456 44.53
443456 162.74
这比我最初预期的要简单。此代码假定唯一id号列的顺序是,它们总是分组在一起,而不是随机分布在整个工作表中。(如果不是这样,请说明,我将首先包括排序选项) 编辑 我首先更新了代码以包含排序。它还将其复制到第二张图纸(Sheet2)上,以便在出现问题时不会丢失原始数据列表 编辑2 我有一个想法,如果你在大数据集上这样做,那么你需要关闭屏幕更新来加快速度
Sub sumAndFormat()
Dim lastRow As Long
Dim activeRow As Long
Dim uniqueID As Long
Dim totalSum As Currency
Dim subRow As Long
Dim subTotal As Currency
Application.ScreenUpdating = False
ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add Key:=Range("A1"), _
SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Sheet1").Sort
.SetRange Range("A1:B12")
.Header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
lastRow = Sheets("sheet1").Cells(Sheets("sheet1").Rows.Count, "A").End(xlUp).row
totalSum = 0
subTotal = 0
subRow = 1
uniqueID = Sheets("Sheet1").Cells(1, 1).value
For i = 1 To lastRow
totalSum = totalSum + Sheets("Sheet1").Cells(i, 2).value
If uniqueID = Sheets("Sheet1").Cells(i, 1) Then
subTotal = subTotal + Sheets("Sheet1").Cells(i, 2).value
Sheets("Sheet2").Cells(subRow, 2).value = subTotal
MsgBox (subTotal)
Else
uniqueID = Sheets("Sheet1").Cells(i, 1).value
subTotal = Sheets("Sheet1").Cells(i, 2).value
subRow = i
End If
Sheets("Sheet2").Cells(i, 3).value = Sheets("Sheet1").Cells(i, 1).value
Sheets("Sheet2").Cells(i, 4).value = Sheets("Sheet1").Cells(i, 2).value
Next i
Sheets("Sheet2").Cells(1, 1).value = totalSum
Application.ScreenUpdating = True
End Sub
事实上,这是非常接近完美的我的申请谢谢你。这就是我最后使用的。简单有效。谢谢你的屏幕更新小贴士。非常有用。除此之外,我还有大约两页的VBA代码,所有这些代码都作用于那5公里的线路上,所以更新变成了一个巨大的帮助!