ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 8611|回复: 50

[分享] 时间段组的矢量运算,自定义函数的思路~

[复制链接]

TA的精华主题

TA的得分主题

发表于 2013-1-21 17:45 | 显示全部楼层 |阅读模式
本帖最后由 whatyang 于 2013-1-22 16:19 编辑

时间段组的矢量运算,自定义函数的设定见附件
时间段矢量运算_求自定义函数.rar (4.21 KB, 下载次数: 48) (原来问题附件,已解决好的附件,可在楼下找)

感谢 香川群子 老师提供思路!
计算原理很简单,不是采用人类的复杂思维方式,而是直接使用机器的简单逻辑思维方式:
1. 1天24小时即 24*60=1440分钟,那么定义数组tms(1440)就能记录全部24小时的每一分钟了。
2. 把时间段组1的时间读入数组tms,有效的每1分钟都记录为状态1。
3. 把时间段组2的时间读入数组tms,有效的每1分钟都记录为状态1。
4. 遍历记录分钟状态的数组tms,取出有效时间段的起、始时刻,另存入数组TimeResult()。
5. 最后输出全部结果。


同谢 lee1892 老师提供的连续性对比算法!
(恩,因为我自己水平有限,看代码只明白大体意思,就不多嘴了,各位大大直接看楼下lee1892 老师的发贴吧,呵呵)

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-1-21 19:00 | 显示全部楼层
可能还要写个判断 时间段组 间关系的子函数~但是我只会写 2个单个时间段 的关系比较,2组时间段的关系函数也不会写 >_<~~~
下面是我写的2个单时间段的比较函数      想求一个能判断2组时间段关系比较的自定义函数


Function TimeRelationship(arrTime1, arrTime2) As String    '判断2个单时间段之间的关系
    Dim StarTime1 As Date, EndTime1 As Date, StarTime2 As Date, EndTime2 As Date
    StarTime1 = arrTime1(1, 1)
    EndTime1 = arrTime1(1, 2)
    StarTime2 = arrTime2(1, 1)
    EndTime2 = arrTime2(1, 2)
   
    If StarTime2 > EndTime1 Or StarTime1 > EndTime2 Then
       TimeRelationship = "vbAway"       '相离  Away
    ElseIf StarTime1 = EndTime2 Or StarTime2 = EndTime1 Then
       TimeRelationship = "vbAdjacent"   '相临  Adjacent
    ElseIf StarTime1 <= StarTime2 And EndTime1 >= EndTime2 Then
       TimeRelationship = "vbContain"    '包含  Contain
    Else
       TimeRelationship = "vbIntersect"  '相交  Intersect
    End If
   
End Function

TA的精华主题

TA的得分主题

发表于 2013-1-21 20:19 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
Function Timex(rng1 As Range, rng2 As Range, Optional n As Long = 0) As String
Dim ar(), br()
ar = rng1
br = rng2
If ar(1, 2) < br(1, 1) Or ar(1, 1) > br(1, 2) Then
   If n = 0 Then Timex = "相离"
   If n = 1 Then Timex = Format(ar(1, 2), "hh:mm:ss") & "~" & Format(br(1, 1), "hh:mm:ss")
   If n = 2 Then Timex = Format((br(1, 1) - ar(1, 2)), "hh:mm:ss")
   If n = 3 Then Timex = Format((br(1, 1) - ar(1, 2)) * 86400, "0")
ElseIf ar(1, 2) = br(1, 1) Or ar(1, 1) = br(1, 2) Then
   If n = 0 Then Timex = "相临"
   If n = 1 Or n = 2 Or n = 3 Then Timex = "-"
Else
   If n = 0 Then Timex = "相交"
   If n = 1 Then Timex = Format(br(1, 1), "hh:mm:ss") & "~" & Format(ar(1, 2), "hh:mm:ss")
   If n = 2 Then Timex = Format(ar(1, 2) - br(1, 1), "hh:mm:ss")
   If n = 3 Then Timex = Format((ar(1, 2) - br(1, 1)) * 86400, "0")
End If
End Function

TA的精华主题

TA的得分主题

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

时间段矢量运算_求自定义函数.rar

11.11 KB, 下载次数: 31

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-1-21 20:30 | 显示全部楼层
yaozong 发表于 2013-1-21 20:21
参考附件....

非常感谢,但是您这个是2时间段,不是2时间段,一组时间段可能有N个时间段组成的~

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-1-21 21:15 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
顶一下~字数补丁~

TA的精华主题

TA的得分主题

发表于 2013-1-21 21:56 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
你要想学MsgBox这种vbYes、vbNo之类的表达方式,不是你这么玩得。
这个叫枚举类型,真实的值通常是整形。
参考一下我的主题贴,关于开关参数的那个。

点评

呵呵,这个回帖是串帖了。本应回复:【Msgbox的第二参数问题?】这个帖子的吧。  发表于 2013-1-22 15:57

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-1-21 22:02 | 显示全部楼层
lee1892 发表于 2013-1-21 21:56
你要想学MsgBox这种vbYes、vbNo之类的表达方式,不是你这么玩得。
这个叫枚举类型,真实的值通常是整形。
...

感谢,不过我的主要问题不是这个。。。

TA的精华主题

TA的得分主题

发表于 2013-1-22 01:04 | 显示全部楼层
加法的函数和宏运用给你弄出来了,请看附件。


加法函数已经写好,使用方法很简单:
1. 选择输出结果区域的第一个单元格,如D32
2. 鼠标右键,出现对话框两次,分别选择要处理的【时间段组1】区域和【时间段组2】区域
3. 宏会自动计算并输出正确结果

时间段自定义函数1.rar

12.95 KB, 下载次数: 39

TA的精华主题

TA的得分主题

发表于 2013-1-22 01:10 | 显示全部楼层
计算原理很简单,不是采用人类的复杂思维方式,而是直接使用机器的简单逻辑思维方式:

1. 1天24小时即 24*60=1440分钟,那么定义数组tms(1440)就能记录全部24小时的每一分钟了。
2. 把时间段组1的时间读入数组tms,有效的每1分钟都记录为状态1。
3. 把时间段组2的时间读入数组tms,有效的每1分钟都记录为状态1。
4. 遍历记录分钟状态的数组tms,取出有效时间段的起、始时刻,另存入数组TimeResult()。
5. 最后输出全部结果。
  1. Function TimeAdd(arrTime1, arrTime2, Optional mode = 0)
  2.     ReDim tms(1440)
  3.     n1 = arrTime1.Rows.Count
  4.     For i = 1 To n1
  5.         t1 = arrTime1(i, 1) * 1440
  6.         t2 = arrTime1(i, 2) * 1440
  7.         For j = t1 To t2
  8.             tms(j) = 1
  9.         Next
  10.     Next
  11.     n2 = arrTime2.Rows.Count
  12.     For i = 1 To n2
  13.         t1 = arrTime2(i, 1) * 1440
  14.         t2 = arrTime2(i, 2) * 1440
  15.         For j = t1 To t2
  16.             If tms(j) = 1 And mode = 1 Then
  17.                 TimeAdd = "#VALUE!": Exit Function
  18.             Else
  19.                 tms(j) = 1
  20.             End If
  21.         Next
  22.     Next
  23.     ReDim TimeResult(1 To 2, 1 To n1 + n2)
  24.     t = 0
  25.     For i = 1 To 1440
  26.         If tms(i) = 1 Then
  27.             If t = 0 Then
  28.                 k = k + 1
  29.                 TimeResult(1, k) = Format(i / 1440, "hh:mm")
  30.                 t = 1
  31.             End If
  32.         Else
  33.             If t = 1 Then
  34.                 TimeResult(2, k) = Format((i - 1) / 1440, "hh:mm")
  35.                 t = 0
  36.             End If
  37.         End If
  38.     Next
  39.     ReDim Preserve TimeResult(1 To 2, 1 To k)
  40.     TimeAdd = Application.Transpose(TimeResult)
  41. End Function
复制代码
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-19 15:22 , Processed in 0.053541 second(s), 15 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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