ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 名课 - Power BI数据分析与可视化实战 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
Python自动化办公应用大全 Excel 2021函数公式学习大典 Kutools for Office 套件发布 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: weiyingde

[分享] VBA法自动返回当前周次

[复制链接]

TA的精华主题

TA的得分主题

发表于 2016-1-17 14:18 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
  1. Option Explicit

  2. Sub 获取当前日所处学期周次()
  3.     Dim rq1 As Date, rq2 As Date, rq3 As Date, rq4 As Date
  4.     Dim y As Integer, w As Integer
  5.     If Year(Date) > Year(Lunar(Format(Date, "yyyy-m-d"))) Then y = 1
  6.     rq1 = Format(solar(Year(Date) - y & "-1-12"), "yyyy-m-d")  '下学期正月十二开学
  7.     rq2 = DateSerial(Year(Date) - y, 7, 1)                     '下学期7月1日结束
  8.     rq3 = DateSerial(Year(Date) - y, 9, 1)                     '上学期9月1日开学
  9.     rq4 = Format(solar(Year(Date) - y & "-12-15"), "yyyy-m-d") '上学期腊月十五结束
  10.     Select Case Date
  11.         Case rq1 To rq2
  12.             w = WorksheetFunction.RoundUp(DateDiff("d", rq1, Date) / 7, 0) + 1
  13.             MsgBox "今天是:下学期第 " & w & " 周," & Format(Date, "aaaa")
  14.         Case rq3 To rq4
  15.             w = WorksheetFunction.RoundUp(DateDiff("d", rq3, Date) / 7, 0) + 1
  16.             MsgBox "今天是:上学期第 " & w & " 周," & Format(Date, "aaaa")
  17.         Case Else
  18.             MsgBox "放假期间"
  19.     End Select
  20. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2016-1-17 14:22 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
附件


VBA求周次.zip (24.9 KB, 下载次数: 78)






TA的精华主题

TA的得分主题

 楼主| 发表于 2016-1-17 14:42 | 显示全部楼层
比我的代码更简洁更实用,很好,技高一筹,令人佩服!!

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-1-17 14:52 | 显示全部楼层
这样VBA代码就摆脱了对工作表辅助单元格的依赖了,很好,学习了。

TA的精华主题

TA的得分主题

发表于 2016-1-17 15:15 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 一指禅62 于 2016-1-17 15:16 编辑
weiyingde 发表于 2016-1-17 14:42
比我的代码更简洁更实用,很好,技高一筹,令人佩服!!

我的思路是:

所有日期必须转换为公历,以计算当日与开学日期相差的天数;

先判断农历年份与公历年份的异同,从而确定当前的年份并生成四个节点(日期);

再把开学第一天所在的周作为第一周,计算出周数。


TA的精华主题

TA的得分主题

 楼主| 发表于 2016-1-17 15:42 | 显示全部楼层
是的,看得出,很巧妙。正应一句话:想法对一切都对!!

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-1-17 15:50 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
我的思路是:
分为三个节点:9月1到年底;元旦到腊月15;正月15到7月1日;
但我是阳历和阳历日相比较;阴历日和阴历日相比较,确定起始点;
因为你的比较在同一个层面上,所以,思路更清晰,代码也更简洁。
以后多向你学习。

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-1-18 16:46 | 显示全部楼层
将上面的研讨的结果,奉献给大家,并藉此对一指禅62等E有提供的版主表示感谢!!

TA的精华主题

TA的得分主题

发表于 2016-1-18 18:30 | 显示全部楼层
本帖最后由 一指禅62 于 2016-1-18 18:35 编辑
weiyingde 发表于 2016-1-17 10:24
一指禅62友,format函数得出的结果真是很怪,讨教一下其特点。到底是string,还是Date呢?如果不是的话, ...

查了点资料,是这么说的:变体型(Variant)数据是VBA中最灵活的数据类型,可存储各种类型的数据,包括各种标准数据类型和特定值(Empty、Null、Error)。VBA自动识别保存数据的类型。
我理解,在没有指定其数据类型的情况下,Format(Year(Date) & "/5/1", "yyyy-mm-dd") 函数返回的是字符串型,DateSerial(Year(Now()), 5, 1) 函数返回的是日期型。

但是,一旦指定数据类型,它就会返回相应的类型。

如下例:
  1. Sub 测试()
  2.     Dim t As String
  3.     t = DateSerial(Year(Now()), 5, 1)
  4.     MsgBox TypeName(t)
  5. End Sub
复制代码



TA的精华主题

TA的得分主题

 楼主| 发表于 2016-1-18 20:12 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
format可真行呀,简直就是VBA函数中的变色龙,有意思,有意思!!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2025-12-25 06:14 , Processed in 0.031080 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表