前言

第一个demo在这里,走过路过不要错过,嗨起来:

第一个excel VBA demo —— 添加信号并生成一段Verilog代码

第二个demo要解决快速生成加班数据的问题,具体情况在于某公司的周末加班规则如下:

  1. 原则上加班时间区间8:30~24:00,每日最多上报8小时;
  2. 中午休息时间为12:30~14:00,傍晚休息时间为18:00~18:30;
  3. 加班申报具体原则是填写上班到岗时间和下班时间,刨除中午休息时间晚上休息时间后为当日加班时长;
  4. 每次申报刨除休息时间后要小于等于8小时,多余部分自行减除;
  5. 加班时间不跨一天,即最多申请到当日24:00;

申报规则中最麻烦的是刨除休息时间时可以选择刨除中午休息时间晚上休息时间,同时最多申报8小时,举几个例子:

  1. 8:30上班,18:00下班,则填报8:30上班,18:00下班,中午休息,共计8小时;
  2. 9:00上班,18:30下班,则填报9:00上班,18:30下班,中午休息,共计8小时;
  3. 11:00上班,22:00下班,则填报11:00上班,17:30下班,晚上休息,共计8小时;
  4. 13:00上班,21:00下班,则填报13:00上班,21:00下班,晚上休息,共计7个半小时;
  5. 14:00上班,15:30下班,则填报14:00上班,15:30下班,未休息,共计1个半小时;

OK,规则就是这个,每次算应该填什么时间下班时都非常头疼,因此通过VBA做一个Excel自动生成模板。

界面

最终成型的Excel模板有两个sheet:

“加班申报界面”

“默认选项界面”

方案

为自己记录下实现过程,避免之后忘了,毕竟马上Excel就要过期了。。。

定义的公共变量

Dim myName As String
Dim myID As String
Dim myLoc As String
Dim myOffc As String
Dim myWork As StringDim noonStart As String
Dim noonEnd As String
Dim evenStart As String
Dim evenEnd As StringDim myDate As String
Dim myStart As String
Dim myEnd As String
Dim myRest As StringDim realEndT As Date

Private Function get_info(need As String) As String

根据给定的need关键词,返回其后一列的单元格的值,主要用来索引如下的情况:

Private Function get_info(need As String) As StringCells(1, 1).SelectSet keyCell = Cells.Find(What:=need, After:=ActiveCell, LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=True, SearchFormat:=False)If Not keyCell Is Nothing Thenget_info = ActiveSheet.Cells(keyCell.Row, keyCell.Column + 1).ValueElseget_info = "???" & needEnd If'MsgBox get_info
End Function

Private Function get_start(need As String) As Date

获取休息起始时间;

Private Function get_start(need As String) As DateCells(1, 1).SelectSet keyCell = Cells.Find(What:=need, After:=ActiveCell, LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=True, SearchFormat:=False)If Not keyCell Is Nothing Thenget_start = CDate(ActiveSheet.Cells(keyCell.Row, keyCell.Column + 1).Value)Elseget_start = CDate("12:30:00")End If'MsgBox get_start
End Function

Private Function get_end(need As String) As Date

获取休息截止时间;

Private Function get_end(need As String) As DateCells(1, 1).SelectSet keyCell = Cells.Find(What:=need, After:=ActiveCell, LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=True, SearchFormat:=False)If Not keyCell Is Nothing Thenget_end = CDate(ActiveSheet.Cells(keyCell.Row, keyCell.Column + 2).Value)Elseget_end = CDate("14:00:00")End If'MsgBox get_end
End Function

Private Sub gain_glb_info()

获取全部基本信息;

Private Sub gain_glb_info()Dim sh As WorksheetDim keyCell As RangeFor Each sh In WorksheetsIf sh.Name = "默认选项配置" ThenSheets(sh.Name).SelectExit ForEnd IfNext'MsgBox ActiveSheet.NamemyName = get_info("姓名")myID = get_info("ID")myLoc = get_info("办公地点")myOffc = get_info("所属部门")myWork = get_info("加班事宜")noonStart = get_start("午饭时间")noonEnd = get_end("午饭时间")evenStart = get_start("晚饭时间")evenEnd = get_end("晚饭时间")End Sub

Private Function gain_work_info() As Boolean

通过弹窗获取上下班真实打卡时间;

Private Function gain_work_info() As Booleangain_work_info = FalsemyDate = InputBox(prompt:="加班日期", Title:="信息获取", Default:=Date)If myDate = "" ThenmyDate = FalseExit FunctionEnd IfmyStart = InputBox(prompt:="打卡开始(8:30~23:59)", Title:="信息获取", Default:="8:30")If myStart = "" ThenmyStart = FalseExit FunctionEnd IfmyEnd = InputBox(prompt:="打卡结束(8:30~23:59)", Title:="信息获取", Default:="18:00")If myEnd = "" ThenmyEnd = FalseExit FunctionEnd Ifgain_work_info = TrueEnd Function

Private Sub cal_work_time()

计算应该填报的下班时间,这个地方是我最头疼的,所以最后选择的方式是:

上班时间直接+8个小时+傍晚0.5小时,是不是比6:30晚,如果是则选择扣除晚饭时间;否则扣除午饭时间;

上面算出来的时间(上班时间直接+8个小时+傍晚0.5小时)再和实际打下班卡时间比较,选择比较晚的那个;

Private Sub cal_work_time()Dim myStartT As DateDim noonGrap As DateDim evenGrap As DateDim noonFlag As IntegernoonGrap = Format(CDate(noonEnd) - CDate(noonStart), "hh:mm")evenGrap = Format(CDate(evenEnd) - CDate(evenStart), "hh:mm")myStartT = Format(CDate(myStart), "hh:mm")If Format(myStart, "hh:mm") >= CDate("15:30") ThenrealEndT = CDate(myEnd)ElseIf Format(myStart + CDate("8:00:00") + evenGrap, "hh:mm") >= CDate(evenEnd) Then '扣除晚上时间realEndT = Format(myStart + CDate("8:00:00") + evenGrap, "hh:mm")Else '扣除中午时间realEndT = Format(myStart + CDate("8:00:00") + noonGrap, "hh:mm")noonFlag = 1End IfIf realEndT > CDate(myEnd) ThenrealEndT = Format(CDate(myEnd), "hh:mm")End IfIf Format(myStart, "hh:mm") <= CDate(evenStart) And Format(realEndT, "hh:mm") >= CDate(evenEnd) And noonFlag <> 1 ThenmyRest = Format(evenStart, "hh:mm") & "~" & Format(evenEnd, "hh:mm")ElseIf Format(myStart, "hh:mm") <= CDate(noonStart) And Format(realEndT, "hh:mm") >= CDate(noonEnd) ThenmyRest = Format(noonStart, "hh:mm") & "~" & Format(noonEnd, "hh:mm")ElsemyRest = "无午休时间"End If'MsgBox realEndTEnd Sub

不过这里我总感觉有点漏洞,可能正常用还行,如果试错的可能有Corner点;

Private Function gainLastRow() As Integer

获取当前sheet可用的最后一行的行号;

Private Function gainLastRow() As IntegerDim lastRow As IntegerlastRow = ActiveSheet.UsedRange.Rows.CountgainLastRow = ActiveSheet.UsedRange.Rows(lastRow).Row + 1'Debug.Print gainLastRowEnd Function

Public Sub mainAddSig()

将各项添加到申报表中,每添加一次会询问是否继续添加;

Public Sub mainAddSig()Dim addRow As IntegerDim sh As WorksheetFor Each sh In WorksheetsIf sh.Name = "加班申报界面" ThenSheets(sh.Name).SelectExit ForEnd IfNextDoIf gain_work_info() = True Then'Debug.Print "@@@@@@@"Call cal_work_timeaddRow = gainLastRow()With ActiveSheet.Cells(addRow, 1).Value = myName.Cells(addRow, 2).Value = myID.Cells(addRow, 3).Value = myLoc.Cells(addRow, 4).Value = myOffc.Cells(addRow, 5).Value = myDate.Cells(addRow, 6).Value = myStart.Cells(addRow, 7).Value = Format(realEndT, "hh:mm").Cells(addRow, 8).Value = myRest.Cells(addRow, 9).Value = myWorkEnd WithElseExit SubEnd IfLoop Until MsgBox("是否继续添加?", vbOKCancel) <> vbOKEnd Sub

Public Sub mian()

主函数,分为两部分:获取配置信息和循环添加;

Public Sub mian()Call gain_glb_infoCall mainAddSig
End Sub

成果

添加按钮后点击按钮,一次询问加班日期和上下班时间:

最后的结果:

嗯,看着还行,再填一个:

OK,收工~~~给自己点个赞吧~~~

第二个excel VBA demo —— 根据规则生成加班申报数据相关推荐

  1. Python+Excel+VBA实现批量自助生成名牌

    文章目录 需求 在Excel制作名牌 批量导出图片 1. 全VBA 2. VBA+压缩包 3. Python+Excel 打包 需求 这次是hrbp小姐姐需要找我批量生成他们新部门的员工名牌.如果让设 ...

  2. [excel][vba][变量定义、日期计算、数据刷新、公式重算]

    excel-vba的常用功能 1.普通功能 1.1.变量定义 1.2.日期计算 1.3.复制.粘贴.清空.删除 2.进阶功能 2.1.计算相关 2.2.其他 1.普通功能 1.1.变量定义 在进行vb ...

  3. Excel+VBA+之快速上手

    第一章  VBA语言基础  第一节 标识符  一.定义  标识符是一种标识变量.常量.过程.函数.类等语言构成单位的符号,利用它可以完成对变量.常 量.过程.函数.类等的引用.   二.命名规则  1 ...

  4. Excel+VBA+之快速上手(2)

    三.图表格式设置  对于图的格式设置,一般是录制一个宏,再删除不需要的语句,这样是开发者最省事的方法.在本节 的示例中有详细的格式设置,可以更改坐标轴的名礀,大小范围,刻度大小等.对不清楚的图的类型名 ...

  5. excel怎样修改表格时间和计算机一制,Excel表格中如何自动生成记录数据的日期和时间...

    前几天有人问我:Excel表格在录入信息时如何在日期单元格自动生成日期时间? 在录入表格的时候,我们经常需要录入时间,比要填写出入库时间,为了减少录入的工作量,可以把日期设置为自动生成. 例如我们在B ...

  6. 第一章、Excel VBA基础知识

    01-01.Excel VBA简介 1.VBA是什么,能干什么 VBA可以说是一种编程语言,是VB的分支 VBA的作用,可以将重复的Excel工作简单化 2.VBA具备的基础知识 2.1基础操作,能发 ...

  7. 使用Excel VBA查找最后一行

    Recently, I complained about having trouble getting Excel VBA to correctly find the last row with da ...

  8. Excel·VBA自动生成日记账的对方科目

    如图:根据日记账/序时账的日期.凭证号为一组,按借贷方向生成相反的科目,并写入H列.可能存在一对一.一对多.多对多等情况的账目 目录 数组法遍历.判断.写入 测试结果 多对多问题处理 测试结果 数组法 ...

  9. Excel·VBA模板生成文件

    不同于<python实现Excel邮件合并>,字符串内容替换生成文件,仅复制整行数据插入模板中生成工作表,单独保存为工作簿,但如果存在同名工作簿文件,则将工作表附加在该工作簿中 Sub 模 ...

最新文章

  1. jq 修改swal的标题_js-jquery-SweetAlert【一】使用
  2. 【实操】路由选择工具ACL
  3. 不同制式字符串之间的转换
  4. mysql(mariadb)重装
  5. [Swift]LeetCode79. 单词搜索 | Word Search
  6. 聊聊 HTTP 协议的知识点
  7. Kotlin入门(3)基本变量类型的用法
  8. BUUCTF misc 专题(77)间谍启示录
  9. PCB LAYOUT特殊走线总结
  10. 微信王者登录太多服务器怎样删除,使用微信登录游戏或其他app时,可以使用不同的个人信息登录 选项已满 怎么删除?如图...
  11. 怎么能网上赚钱?这6种方法是目前最常赚钱的方式!
  12. 【云锁·nginx自编译web防护教程】
  13. 关于virtualbox无法复制粘贴的问题
  14. 如何解决 类似 nltk安装Wordnet出错[nltk_data] Error loading wordnet: <urlopen error [Errno 111] 问题
  15. JavaScript中的数据类型判断
  16. 我跨过山和大海,穿过人山人海,只为寻找到你
  17. c语言复制粘贴快捷键_大家还知道哪些快捷键方法?如:ctrl+c复制,ctrl+v粘贴
  18. 还有波音737飞机在飞行吗
  19. 华为H3C配置单臂路由、静态默认浮动路由的配置方法
  20. 可以通过限定ip来限制用户重复登录么_饿了么到底有多“贼”?揭秘它一步步让你下单的套路!...

热门文章

  1. 测试用例之等价类划分法
  2. 初学者必读Android开发入门之路
  3. 用Java实现剪切歌曲
  4. 嵌入式开发 | 软件项目中 Debug 和 Release 版本的差异
  5. Mybatis-Puls 基本的sql操作流程
  6. php layer弹出层更改背景,详解Layer弹出层样式
  7. Layer 弹出层组件
  8. baidupcsgo安卓_baidupcsgo安卓百度网盘不限速-BaiduPCS-Go for Android客户端下载v3.6.8手机版-西西软件下载...
  9. 学生登入html,学生登录注册 和 信息管理系统.py
  10. 从阿里云到自建:RocketMQ迁移的注意事项