ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[原创] 时间段组的矢量运算,自定义函数

[复制链接]

TA的精华主题

TA的得分主题

发表于 2013-1-23 21:44 | 显示全部楼层 |阅读模式
本帖已被收录到知识树中,索引项:自定义函数开发
本帖最后由 yjh_27 于 2013-4-13 02:24 编辑

时间段组的矢量运算,自定义函数

TimeAdd
加法
函数功能:叠加两组时间段,得到一组新时间段;以数组的方式返还结果
TimeAdd(arrTime1,arrTime2,mode)

TimeMinus
减法

函数功能:从一组时间段中取出另一组时间段后,得到一组新时间段;以数组的方式返回结果
TimeMinus(arrTime1,arrTime2,mode)

TimeIntersect
交集

函数功能:求两组时间段的共有部分(交集),产生一组新时间段;以数组的方式返回结果
TimeIntersect(arrTime1,arrTime2)

TimeAdjacent
临集(邻集)

函数功能:在arrTime2中选出所有临近(相邻)arrTime1的时间段,组成新时间段数组;以数组的方式返还结果
TimeAdjacent(arrTime1,arrTime2,mode)
增加模式选择
mode = 0 仅非交集
mode = 1 仅交集
mode = 2 全部



TimeQuantity
时间差之和

函数功能:求一组时间段每段时间差的和
TimeQuantity(arrTime,mode)
mode 为"s"时,以秒为单位返回差值的和
     为"m"时,以分钟为单位返回差值的和
     为"h"时,以小时为单位返回差值的和
     为"hm"时,以h:mm返回差值的和
     为"ms"时,以mm:ss返回差值的和
     为"hms"时,以h:mm:ss返回差值的和


2013.4.12  增加  V1.3
TimeWork
工作时间

函数功能:求一组时间段内工作时间
TimeWork(arrTime1,arrTime2,mode)
arrTime2(n,3): 星期几工作  0  :每天
                                           空 :每天
                                           1  :星期一     以“,”相隔
                                           2  :星期二
                                           7  :星期日
                                          
                                           +   :调休(休息变工作)
                                            -   :调休(工作变休息)

mode 为""时,产生一组新时间段;以数组的方式返回结果
mode 为"s"时,以秒为单位返回差值的和
     为"m"时,以分钟为单位返回差值的和
     为"h"时,以小时为单位返回差值的和
     为"hm"时,以h:mm返回差值的和
     为"ms"时,以mm:ss返回差值的和
     为"hms"时,以h:mm:ss返回差值的和

只需下载最新版本,其余记录改进过程


补充内容 (2013-4-13 16:44):
请下 11L 新版(修正工作时间过0点错误)。

补充内容 (2013-4-29 14:14):
增加完工时间CompletionTime,见12L。
TimeWork  改为 WorkingHours

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

24.62 KB, 下载次数: 117

记录改进过程,可不下载。

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

26.55 KB, 下载次数: 100

更新2013.02.25

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

35.53 KB, 下载次数: 266

最新

判断时间段星期几的个数_自定义函数.rar

13.5 KB, 下载次数: 105

参见9L

评分

6

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-1-23 22:00 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2013-1-23 22:07 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
这是O(N)的原地排序法呀!{:soso_e114:}
[code=vb]Function FastSort(a)
'快速排序法
M = 1
For i = LBound(a, 1) To UBound(a, 1) - 1
    If a(i, 1) <= a(i + 1, 1) Then
        If i > M Then
            M = i
        Else
            i = M
        End If
        GoTo kk:
    Else
        For j = 1 To UBound(a, 2)
            x = a(i, j)
            a(i, j) = a(i + 1, j)
            a(i + 1, j) = x
        Next
        If i <> 1 Then i = i - 2
    End If
kk:
Next i
FastSort = a
End Function[/code]

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-1-23 22:10 | 显示全部楼层
lee1892 发表于 2013-1-23 22:07
这是O(N)的原地排序法呀!

拿来主义,只对开始时间排序,够用。

TA的精华主题

TA的得分主题

发表于 2013-1-23 22:20 | 显示全部楼层
yjh_27 发表于 2013-1-23 22:10
拿来主义,只对开始时间排序,够用。

跟你开个玩笑的,哎~

话说你这个排序代码哪找的?冒泡排序都能写的这么花哨啊,呵呵~
而且貌似你没改好哦~

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-1-23 22:47 | 显示全部楼层
lee1892 发表于 2013-1-23 22:20
跟你开个玩笑的,哎~

话说你这个排序代码哪找的?冒泡排序都能写的这么花哨啊,呵呵~

http://club.excelhome.net/thread-543994-1-1.html

有问题直说无妨。无理论基础,有些只能使用。

TA的精华主题

TA的得分主题

发表于 2013-1-23 23:22 | 显示全部楼层
yjh_27 发表于 2013-1-23 22:47
http://club.excelhome.net/thread-543994-1-1.html

有问题直说无妨。无理论基础,有些只能使用。

你自己体会吧:
代码:
Sub test()
    Dim i&, aRnd!(), arr, t#, nCount&
    ReDim aRnd(1 To 10 ^ 3)
    Randomize
    For i = 1 To UBound(aRnd)
        aRnd(i) = Rnd
    Next
    arr = aRnd
    t = Timer
    Call Fake(arr)
    Debug.Print "Fake used: " & Round(Timer - t, 2) & " seconds." & vbCrLf
    For i = 1 To UBound(arr) - 1
        If arr(i) > arr(i + 1) Then Debug.Print "Fake is WRONG!": Exit For
    Next
    arr = aRnd
    t = Timer
    Call Bubble(arr)
    Debug.Print "Bubble used: " & Round(Timer - t, 2) & " seconds." & vbCrLf
    For i = 1 To UBound(arr) - 1
        If arr(i) > arr(i + 1) Then Debug.Print "Bubble is WRONG!": Exit For
    Next
    arr = aRnd
    t = Timer
    Call QuickSort(arr, LBound(arr), UBound(arr), nCount)
    Debug.Print "QuickSort swap times: " & nCount
    Debug.Print "QuickSort used: " & Round(Timer - t, 2) & " seconds." & vbCrLf
    For i = 1 To UBound(arr) - 1
        If arr(i) > arr(i + 1) Then Debug.Print "QuickSort is WRONG!": Exit For
    Next
End Sub

Sub Fake(arr)
    Dim m&, i&, swap, nCount&
    m = LBound(arr)
    For i = LBound(arr) To UBound(arr) - 1
        If arr(i) <= arr(i + 1) Then
            If i > m Then m = i Else i = m
        Else
            swap = arr(i): arr(i) = arr(i + 1): arr(i + 1) = swap
            nCount = nCount + 1
            If i > LBound(arr) Then i = i - 2
        End If
    Next
    Debug.Print "Fake swap times: " & nCount
End Sub

Sub Bubble(arr)
    Dim i&, j&, swap, nCount&
    For i = LBound(arr) To UBound(arr) - 1
        For j = i + 1 To UBound(arr)
            If arr(i) > arr(j) Then
                swap = arr(i): arr(i) = arr(j): arr(j) = swap
                nCount = nCount + 1
            End If
        Next
    Next
    Debug.Print "Bubble swap times:" & nCount
End Sub

Sub QuickSort(arr, nLeft&, nRight&, nCount&)
    Dim i&, j&, swap, key
    If nLeft >= nRight Then Exit Sub
    key = arr(nLeft)
    i = nLeft + 1: j = nRight
    Do
        Do While i <= nRight
            If arr(i) > key Then Exit Do
            i = i + 1
        Loop
        Do While j > nLeft
            If arr(j) < key Then Exit Do
            j = j - 1
        Loop
        If i >= j Then Exit Do
        swap = arr(i): arr(i) = arr(j): arr(j) = swap: nCount = nCount + 1
    Loop
    swap = arr(nLeft): arr(nLeft) = arr(j): arr(j) = swap: nCount = nCount + 1
    Call QuickSort(arr, nLeft, j, nCount)
    Call QuickSort(arr, j + 1, nRight, nCount)
End Sub

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-1-27 14:40 | 显示全部楼层
应用:
统计相同或者不同日期的时间的间隔分钟数,其中22点到6点不统计

http://club.excelhome.net/forum. ... page%3D1#pid6686379        10楼

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-3-31 13:35 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-4-13 13:57 | 显示全部楼层
本帖最后由 yjh_27 于 2013-4-13 19:21 编辑

修改过0点时段

补充内容 (2013-5-1 14:54):
请下载 12L 附件

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

35.23 KB, 下载次数: 68

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-19 13:27 , Processed in 0.045801 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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