『懒人』办公现状 - 一键搞定!!!

关于销售日前,昨天我们写了一批,通过技巧法完成批量生成,但是对于我这种“懒人”,还是有点麻烦的!今天我们就分享一种更加高效的方法! 一键搞定

日报 | 批量生成

大概就是这种效果
▼ 动画-一键生成日报
以上,我们想要生成那个月的月报,只要点击一键搞定按钮,然后输入月份,等待几秒,即可快速生成整个月的日报!
完整代码:重要部分已注释

功能实现

1、根据输入的月份结合当前电脑的时间,取到对应的年份,并计算出对月份的天数,last_date:给定月份计算最后一天的日期(VBA中写法)
last_date = VBA.DateSerial(Year(Now), imonth + 1, 0)
2、在每次生成前,删除之前的数据,确保本次生成是最新的。
我们生成的表名称规则是X月X日,所以我们使用 like
sht.Name Like "?*月?*日"
来找到全部,并删除,?-任意1个字符,*-任意0个或者多个字符!
3、格式化字符串,我们在工作表中使用TEXT函数,在VBA中使用Format,当然你也可以通过Application.Text来调用工作表函数,不过一般不用!
其他就是一些简单的循环+判断,就不多啰嗦了,有基础的同学应该看的比较轻松了!
源码:直接复制调用(如何使用VBA代码?
'功能:根据模板和指定月份批量生成日报
'公众号: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)引用语法:如果工作表名称有特殊字符,加上单引号
sheet名称!单元格地址
比如INDIRECT("'1-2'!A:A")
然后如果你还想把每天的明细也汇总到一起,方便进一步汇总,那么还是请上我刚写的代码!
喜欢研究Excel高级知识的同学,也可以关注

VBA | 明细汇总

▼ 动画-一键汇总
有了明细汇总,我们就可以通过数据透视表,公式等非常方便的汇总各种统计与分析!
完整代码:收藏需要用的时候,看看说不定有所启发
源码:直接复制调用(如何使用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,开始或许是我想做一个“懒人”,我什么都怕“麻烦”,又或许是重复繁琐,觉得浪费生命吧…….
现在已经记不清了,但是总归,让我解放出来了,计算机是一个好的优点就是“听话照做”,想出错都难……这或许也是我一个文科生爱上他的原因吧!
(0)

相关推荐