|
楼主 |
发表于 2020-1-18 16:11
|
显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用 · 内置多项VBA编程加强工具 ★ 免费下载 ★ ★ 使用手册★
在您的代码基础上自己根据需要的变化修改了一下,目前可以使用。但不知道能不能更精简一下。也为了能够更好的学习VBA代码。
有几处修改过程出现错误或者需要的功能,在下面代码有标注。
- Option Explicit
- Sub test()
- Dim arr, br, i, d As Object, str, lr, m, hb, ytr, strY, ytrY
- Set d = CreateObject("scripting.dictionary")
- hb = Sheets(7).Cells(Rows.Count, 1).End(xlUp).Row
- arr = Sheets(6).Range("a1").CurrentRegion
- ReDim br(1 To UBound(arr), 1 To 4)
- If hb < 2 Then '不定义hb>=2,在新表使用m返回空值报错
- hb = 2
- End If
- For i = 2 To UBound(arr)
- str = Format(arr(i, 1), "yyyy-mm")
- ytr = Format(Sheets(7).Cells(hb, 1), "yyyy-mm")
- strY = Format(str, "General Number")
- ytrY = Format(ytr, "General Number")
- If strY > ytrY Or strY = ytrY Then
- str = Format(arr(i, 1), "yyyy-mm")
- lr = arr(i, 2) - arr(i, 3)
- If Not d.exists(str) Then
- m = m + 1
- br(m, 1) = str: br(m, 3) = lr: br(m, 4) = 1
- d(str) = m
- Else
- br(d(str), 3) = br(d(str), 3) + lr
- br(d(str), 4) = br(d(str), 4) + 1
- br(d(str), 2) = br(d(str), 3) / br(d(str), 4)
- End If
- End If
- Next
- With Sheets(7)
- .UsedRange.Offset(hb, 0).ClearContents
- .Cells(hb, 1).Resize(m, 2) = br '不计算月份净利润,直接返回月份中的平均日利润到B列。
- End With
- For i = 1 To m
- With Sheets(7) '把返回的日期数据重新换成标准日期,单元格格式设置为yyyy/m,方便后面其他表格匹配年月份获取数据。
- .Cells(hb, 1) = Format(br(i, 1), "ddddd")
- hb = hb + 1
- End With
- Next
- End Sub
- 'sheets(7)为数据汇总表格。sheets(6)为账目表格。
- '定义汇总表的hb行号是为了避免每一次汇总数据全部重算一次,这样计算过程较长会造成电脑假死。
复制代码 |
|