我通过Sharperlight报告创建了一个数据表,将其结果生成到excel中,如下所示:-
我想要做的是开发一个宏,它将对数据的所有类别进行小计。除了总是 G - J 列之外,没有确定的表长度大小。
这样,我希望当用户使用侧面的菜单刷新表格时,他们将能够运行宏来快速获得每个类别的总行数。
有人能帮忙吗???
我通过Sharperlight报告创建了一个数据表,将其结果生成到excel中,如下所示:-
我想要做的是开发一个宏,它将对数据的所有类别进行小计。除了总是 G - J 列之外,没有确定的表长度大小。
这样,我希望当用户使用侧面的菜单刷新表格时,他们将能够运行宏来快速获得每个类别的总行数。
有人能帮忙吗???
右键单击 sheet1 选项卡 > 查看代码
粘贴此代码
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 4 Then
If Target.Row = 4 Or Target.Row = 5 Or Target.Row = 6 Then Totals
End If
End Sub
然后在中添加右键module
然后拍下这段代码Sheet1
Project Explorer
VBE window
Insert > Module
Sub Totals()
Range("C10:D" & Range("C10:C" & Rows.Count).End(xlDown).Row).ClearContents
Dim startAtRow As Long
startAtRow = 10 ' Set starting row
Dim lr As Long, i As Long, j As Long
lr = Range("J" & Rows.Count).End(xlUp).Row
ReDim arr(lr - 4) As String
For i = 5 To lr
arr(i - 5) = Range("J" & i).Value
Next i
Dim arr2() As String
arr2 = arr
RemoveDuplicate arr
For i = LBound(arr) To UBound(arr) - 1
Range("C" & (i + startAtRow)).Value = arr(i)
For j = LBound(arr2) To UBound(arr2) - 1
If arr(i) = arr2(j) Then
Range("D" & (i + startAtRow)).Value = Range("D" & i + startAtRow).Value + Range("I" & (j + 5)).Value
End If
Next j
Next i
End Sub
Private Sub RemoveDuplicate(ByRef StringArray() As String)
Dim lowBound$, UpBound&, A&, B&, cur&, tempArray() As String
If (Not StringArray) = True Then Exit Sub
lowBound = LBound(StringArray): UpBound = UBound(StringArray)
ReDim tempArray(lowBound To UpBound)
cur = lowBound: tempArray(cur) = StringArray(lowBound)
For A = lowBound + 1 To UpBound
For B = lowBound To cur
If LenB(tempArray(B)) = LenB(StringArray(A)) Then
If InStrB(1, StringArray(A), tempArray(B), vbBinaryCompare) = 1 Then Exit For
End If
Next B
If B > cur Then cur = B: tempArray(cur) = StringArray(A)
Next A
ReDim Preserve tempArray(lowBound To cur): StringArray = tempArray
End Sub
现在,每次用户更改 D4、D5、D6 的值时,您的结果都应该更新。类别将从 C10 向下开始显示,总数将在 D10 向下显示。看起来像这样(示例版本)