关于销售日前,昨天我们写了一批,通过技巧法完成批量生成,但是对于我这种“懒人”,还是有点麻烦的!今天我们就分享一种更加高效的方法! 一键搞定
以上,我们想要生成那个月的月报,只要点击一键搞定按钮,然后输入月份,等待几秒,即可快速生成整个月的日报!1、根据输入的月份结合当前电脑的时间,取到对应的年份,并计算出对月份的天数,last_date:给定月份计算最后一天的日期(VBA中写法)
last_date = VBA.DateSerial(Year(Now), imonth + 1, 0)
2、在每次生成前,删除之前的数据,确保本次生成是最新的。我们生成的表名称规则是X月X日,所以我们使用 like来找到全部,并删除,?-任意1个字符,*-任意0个或者多个字符!
3、格式化字符串,我们在工作表中使用TEXT函数,在VBA中使用Format,当然你也可以通过Application.Text来调用工作表函数,不过一般不用!
其他就是一些简单的循环+判断,就不多啰嗦了,有基础的同学应该看的比较轻松了!
'功能:根据模板和指定月份批量生成日报
'公众号:Excel办公实战
'作者:E精精
'日期:2021年6月16日
'------------------------------------------------------------------
Sub copyByMD()
Dim bMonth As Byte, last_day As Byte
Dim last_date As Date, current_date As Date
'提示输入月份
imonth = Val(InputBox("请输入月份:", "月份", 1))
'对应月份的最后一天
last_date = VBA.DateSerial(Year(Now), imonth + 1, 0)
last_day = Day(last_date)
Application.ScreenUpdating = False
For Each sht In ThisWorkbook.Sheets
If sht.Name Like "?*月?*日" Then
'关闭弹窗
Application.DisplayAlerts = False
sht.Delete
Application.DisplayAlerts = True
End If
Next
For i = 1 To last_day
'复制模板
Sheets("模板").Copy after:=Sheets(Sheets.Count)
'根据i对应的日期
current_date = VBA.DateSerial(Year(Now), imonth, i)
'设置Sheet名称为月日格式
ActiveSheet.Name = Format(current_date, "m月d日")
'表头写入销售日期
ActiveSheet.[C2] = current_date
'删除按钮
For Each shp In ActiveSheet.Shapes
shp.Delete
Next
Next
Application.ScreenUpdating = True
MsgBox "日报已生成," & imonth & "月-共" & last_day & "张"
End Sub说完批量生成,你肯定就先知道生成后,我要如何汇总呢?这里我们首先教大家一种函数法,相对比较简单了!
这个公式,大概应该熟悉吧,讲过很多次了,考勤表常用!
=TEXT(IF(MONTH(DATE(YEAR(TODAY()),$B$1,ROW(A1)))=$B$1,
DATE(YEAR(TODAY()),$B$1,ROW(A1)),""),"m月d日")
=IFERROR(SUM(INDIRECT(B4&"!E4:E999")),"")
> INDIRECT 这个函数的核心功能,就是把我们构建的文本地址,转成Excel能识别的单元格引用!> 扩表(sheet)引用语法:如果工作表名称有特殊字符,加上单引号
然后如果你还想把每天的明细也汇总到一起,方便进一步汇总,那么还是请上我刚写的代码!
VBA | 明细汇总
有了明细汇总,我们就可以通过数据透视表,公式等非常方便的汇总各种统计与分析!'功能:日报明细一键汇总
'公众号:Excel办公实战
'作者:E精精
'日期:2021年6月16日
'------------------------------------------------------------------
Sub combineData()
Dim sht As Worksheet
Dim totalMaxRow As Long '汇总表最大行
Dim maxRow As Long '每日分表最大行
Dim totalSht As Worksheet
Set totalSht = Sheets("明细汇总")
'清空历史数据并写入表头
With totalSht
.Cells.Clear '清空
.Range("a1").Resize(1, 6) = _
[{"日期","名称","单价","数量","金额","销售员"}]
End With
For Each sht In ThisWorkbook.Sheets
If sht.Name Like "?*月?*日" Then
'每日最大行
maxRow = sht.Cells(Rows.Count, 2).End(3).Row
If maxRow > 3 Then
'汇总表中最大行下空白行
totalMaxRow = totalSht.Cells(Rows.Count, 1).End(3).Row + 1
'写入日期
totalSht.Cells(totalMaxRow, 1). _
Resize(maxRow - 3, 1).Value = sht.Name
'写入数据
totalSht.Cells(totalMaxRow, 2).Resize(maxRow - 3, 5).Value = _
sht.Range("B4").Resize(maxRow - 3, 5).Value
End If
End If
Next
totalSht.Activate
MsgBox "全部汇总完成~"
End Sub“日复一日Ctrl+CV,辛辛苦苦忙活了一周,也不知道哪个犊子,非要在老娘粘贴的时候找我,这怎么和总数对不上呀~!555,要死要死……” 辛苦辛苦,忙活了一周,一不小心,还错了,又TM返工了,你能明白那份痛苦吗?上面或许就能解答为什么要学VBA,开始或许是我想做一个“懒人”,我什么都怕“麻烦”,又或许是重复繁琐,觉得浪费生命吧…….
现在已经记不清了,但是总归,让我解放出来了,计算机是一个好的优点就是“听话照做”,想出错都难……这或许也是我一个文科生爱上他的原因吧!
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报。