ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[讨论] 自定义函数--提取单元格内多个被分开的数字

  [复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-6-18 08:51 | 显示全部楼层
Sub 双字节转单()
Dim i As Byte
Application.ScreenUpdating = False
For i = 0 To 9
ActiveSheet.Cells.Replace StrConv(i, vbWide), i
Next
ActiveSheet.Cells.Replace ".", "."
Application.ScreenUpdating = True
End Sub
http://club.excelhome.net/thread-250303-1-1.html

评分

3

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-6-27 09:13 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

【原创】求工作日数

Function zyr(Optional dat = "", Optional w = 5) '本月总工作日数
If Len(dat) Then st = dat Else st = Date
by_1 = DateSerial(Year(st), Month(st), 1)
byend = DateSerial(Year(st), Month(st) + 1, 0)
For i = by_1 To byend
    If Weekday(i, 2) < w + 1 Then x = x + 1
Next
zyr = x
End Function

Function dyr(Optional dat = "", Optional w = 5) '本月到当前日期工作日数
If Len(dat) Then st = dat Else st = Date
by_1 = DateSerial(Year(st), Month(st), 1)
byend = st
For i = by_1 To byend
    If Weekday(i, 2) < w + 1 Then x = x + 1
Next
dyr = x
End Function

Function sd2ed(sd, ed, Optional w = 5) '2个日期之间工作日数
For i = sd To ed
    If Weekday(i, 2) < w + 1 Then x = x + 1
Next
sd2ed = x
End Function

评分

2

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-6-28 06:29 | 显示全部楼层
Function NETWORKDAYS_1(sd, ed, Optional arr = 0, Optional w = 5) '2个日期之间工作日数-节假日
On Error Resume Next
For i = sd To ed
    If Weekday(i, 2) < w + 1 Then x = x + 1
Next
If arr.Count = 0 Then NETWORKDAYS_1 = x: Exit Function
For i = 1 To arr.Count
   If arr(i, 1) <= ed And arr(i, 1) >= sd Then x = x - 1
Next
NETWORKDAYS_1 = x
End Function

评分

3

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-6-28 06:53 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

【原创】NETWORKDAYS 函数 加强版

本帖最后由 YZC51 于 2019-6-28 12:13 编辑

原创
Function NETWORKDAYS_2(sd, ed, Optional arr = 0, Optional brr = 0, Optional w = 5) '2个日期之间工作日数-节假日+调休日
    'sd     参数    开始日期
    'ed     参数    结束日期
    'arr    参数    法定假日单元格区域
    'brr    参数    假日调休单元格区域
    'w      参数    每周工作日数
    On Error Resume Next
    For i = sd To ed
        If Weekday(i, 2) < w + 1 Then x = x + 1
    Next
   
    If brr.Count = 0 Then GoTo aa
    For i = 1 To brr.Count
       If brr(i, 1) <= ed And brr(i, 1) >= sd Then x = x + 1
    Next
   
aa:
    If arr.Count = 0 Then NETWORKDAYS_2 = x: Exit Function
    For i = 1 To arr.Count
       If arr(i, 1) <= ed And arr(i, 1) >= sd Then x = x - 1
    Next
    NETWORKDAYS_2 = x
End Function

评分

3

查看全部评分

TA的精华主题

TA的得分主题

发表于 2019-6-28 07:10 | 显示全部楼层
YZC51 发表于 2019-6-28 06:53
原创
Function NETWORKDAYS_2(sd, ed, Optional arr = 0, Optional brr = 0, Optional w = 5) '2个日期之 ...

大神啊!赠人玫瑰手留余香!正在拜读老师大作中!

TA的精华主题

TA的得分主题

发表于 2019-6-28 07:13 | 显示全部楼层
YZC51 发表于 2019-6-18 08:51
Sub 双字节转单()
Dim i As Byte
Application.ScreenUpdating = False

老师:恳请您看看  http://club.excelhome.net/thread-1485412-1-1.html帖子里,怎样添加--当数据源为空格时,对应的结果也必须显示为空白的代码?

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-6-29 01:03 | 显示全部楼层

【原创】模仿NETWORKDAYS.INTL函数的增强简约版

本帖最后由 YZC51 于 2019-7-5 18:36 编辑

NETWORKDAYS.INTL函数的增强版
Function NETWORKDAYS2INTL(start_date, end_date, Optional weekend = 1, Optional holidays = 0, Optional BreakOff = 0) '2个日期之间工作日数-节假日+调休日
    'NETWORKDAYS.INTL(start_date, end_date, [weekend], [holidays],[BreakOff])
    'start_date     参数    开始日期
    'end_date       参数    结束日期
    'weekend        参数    每周工作日数
    'holidays       参数    法定假日单元格区域
    'BreakOff       参数    假日调休单元格区域
    '周末数     周末日
    '0          整周都是工作日
    '1 或省略    星期六、星期日
    '2          星期日、星期一
    '3          星期一、星期二
    '4          星期二、星期三
    '5          星期三、星期四
    '6          星期四、星期五
    '7          星期五、星期六

    '11         仅星期日
    '12         仅星期一
    '13         仅星期二
    '14         仅星期三
    '15         仅星期四
    '16         仅星期五
    '17         仅星期六

    On Error Resume Next
    If weekend = 0 Then NETWORKDAYS2INTL = end_date - start_date: Exit Function
    Z = weekend Mod 10: x = 0
    If Z > 7 Then NETWORKDAYS2INTL = "#N/A": Exit Function
    If end_date > start_date Then yzc = 1 Else yzc = -1 '***
    w = Z: w2 = (Z + 5 Mod 7) + 1: x = 0
    If Len(weekend) = 1 Then
        If end_date = start_date And (Weekday(start_date, 1) <> w And Weekday(start_date, 1) <> w2) Then x = 0: GoTo bb '***2
        For i = start_date + 1 To end_date Step yzc
            If Weekday(i, 1) <> w And Weekday(i, 1) <> w2 Then x = x + yzc
        Next
    Else
        For i = start_date To end_date Step yzc
            If Weekday(i, 2) <> w Then x = x + yzc
        Next
    End If
    If BreakOff.Count = 0 Then GoTo aa
    For i = 1 To BreakOff.Count
        If BreakOff(i, 1) >= start_date And BreakOff(i, 1) <= end_date Then x = x + yzc
    Next
aa:
    If holidays.Count = 0 Then NETWORKDAYS2INTL = x: Exit Function
    For i = 1 To holidays.Count
        If holidays(i, 1) > start_date And holidays(i, 1) <= end_date Then
            If Len(weekend) = 1 Then
                If Weekday(holidays(i, 1), 1) <> w Then x = x - yzc
                If Weekday(holidays(i, 1), 1) = w2 Then x = x + yzc            Else
                If Weekday(holidays(i, 1), 1) <> w Then x = x - yzc
            End If
        End If
    Next
bb:
    NETWORKDAYS2INTL = x
End Function

评分

3

查看全部评分

TA的精华主题

TA的得分主题

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

【原创】模仿WORKDAY.INTL函数的增强简约版

本帖最后由 YZC51 于 2019-7-5 13:52 编辑


Function WORKDAY2INTL(start_date, days, Optional weekend = 1, Optional holidays = 0, Optional BreakOff = 0)
   'Function WORKDAY2INTL(start_date, days, [weekend], [holidays], [BreakOff])
    'start_date     参数    开始日期
    'days           参数    工作日天数
    'weekend        参数    每周工作日数
    'holidays       参数    法定假日单元格区域
    'BreakOff       参数    假日调休单元格区域
    '周末数     周末日
    '0          整周都是工作日
    '1或省略    星期六、星期日
    '2          星期日、星期一
    '3          星期一、星期二
    '4          星期二、星期三
    '5          星期三、星期四
    '6          星期四、星期五
    '7          星期五、星期六
   
    '11         仅星期日
    '12         仅星期一
    '13         仅星期二
    '14         仅星期三
    '15         仅星期四
    '16         仅星期五
    '17         仅星期六

    On Error Resume Next
    Z = weekend Mod 10: x = 0: xx = 0
    If Z > 7 Then WORKDAY2INTL = "#N/A": Exit Function
    If weekend = 0 Then WORKDAY2INTL = start_date + days: Exit Function
    If end_date + days > start_date Then yzc = 1 Else yzc = -1 '***

    For i = days To days * 7 Step 1
        x = NETWORKDAYS2INTL(start_date, start_date + i, weekend, holidays, BreakOff)
        If x = days Then xx = i: Exit For
    Next
    WORKDAY2INTL = start_date + xx
End Function

评分

3

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-7-5 11:29 | 显示全部楼层
本帖最后由 YZC51 于 2019-7-5 18:39 编辑

上面两个自定义函数的示例文件。
NETWORKDAYS.INTL函数的语法结构-V2.rar (71.04 KB, 下载次数: 181)

评分

3

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-7-5 23:19 | 显示全部楼层
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'选中跳转到最后格
    col = Target.Column
    r = Cells(Rows.Count, col).End(xlUp).Row + 1
    If r < 5 Then r = 5
    Cells(r, col).Select
End Sub

评分

2

查看全部评分

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

本版积分规则

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

GMT+8, 2024-11-16 00:52 , Processed in 1.053760 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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