VBA计算周末天数

2024-04-22

我正在寻找方法计算两个日期之间周末(周六和周日)的天数使用VBA。

我已经在网上搜索过,但都显示了如何计算工作日(有些使用 DateDiff,有些使用 Networkdays),但没有周末的日子,而且我已经成功地在工作日执行此操作。

例子 :

从日期 3/10/2015 到 9/10/2015,应该返回 2 天(星期六和星期日,而不是 5 天(星期一、星期二、星期三、星期四、星期五)。

>>

我尝试根据@R3uK风格更改代码,但答案很“奇怪”,我不明白为什么结果会这样。这是代码:

Sub DateWeekDiff()
Sheets("Duplicate Removed").Activate
Dim Date1 As Date, Date2 As Date, StartDate As Date, EndDate As Date
Dim WeekendDays As Long, CountWeekendDays As Long, i As Long
Dim lrow As Long
Dim PRow As Long
Dim CurrentSheet As Worksheet
Set CurrentSheet = Excel.ActiveSheet
FRow = CurrentSheet.UsedRange.Cells(1).Row
lrow = CurrentSheet.UsedRange.Rows(CurrentSheet.UsedRange.Rows.count).Row
WeekendDays = 0

For PRow = lrow To 2 Step -1
'If CurrentSheet.Cells(PRow, "AD").Value <> "" And CurrentSheet.Cells(PRow, "T").Value <> "" Then _
'    CurrentSheet.Cells(PRow, "AP").Value = Abs(DateDiff("d", (CurrentSheet.Cells(PRow, "AD").Value), (CurrentSheet.Cells(PRow, "T").Value)))

For i = 0 To DateDiff("d", CurrentSheet.Cells(PRow, "AD").Value, CurrentSheet.Cells(PRow, "T").Value)
    Select Case Weekday(DateAdd("d", i, CurrentSheet.Cells(PRow, "AD").Value))
        Case 1, 7
            WeekendDays = WeekendDays + 1
    End Select
Next i
    CountWeekendDays = WeekendDays
    CurrentSheet.Cells(PRow, "AL").Value = CountWeekendDays
Next PRow
End Sub

结果变为(例如)AD = 26/1/2015 5:00:00 PM 和 T = 13/1/2015 8:05:00 AM 等于 AL = 807878。 循环也很慢(有一段时间没有响应)。


我的计算周末天数的函数版本:

Public Function CountWeekendDays(Date1 As Date, Date2 As Date) As Long
    Dim weekDifference As Integer
    Dim weekday1 As Byte
    Dim weekday2 As Byte
    '------------------------------------------------------------------

    weekDifference = VBA.DateDiff("w", Date1, Date2)
    weekday1 = VBA.Weekday(Date1, vbMonday)
    weekday2 = VBA.Weekday(Date2, vbMonday)

    CountWeekendDays2 = VBA.Abs(VBA.DateDiff("w", Date1, Date2) * 2)

    If Date1 < Date2 Then
        CountWeekendDays2 = CountWeekendDays2 + VBA.IIf(weekday1 < 6, 2, 8 - weekday1) + _
                                                VBA.IIf(weekday2 < 6, 0, weekday2 - 5)
        If weekday2 >= weekday1 Then CountWeekendDays2 = CountWeekendDays2 - 2
    Else
        CountWeekendDays2 = CountWeekendDays2 + VBA.IIf(weekday2 < 6, 2, 8 - weekday2) + _
                                                VBA.IIf(weekday1 < 6, 0, weekday1 - 5)
        If weekday1 >= weekday2 Then CountWeekendDays2 = CountWeekendDays2 - 2
    End If

End Function

该函数仅使用算术运算,因此它比使用循环的函数快得多。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

VBA计算周末天数 的相关文章

  • 如何在vba中刷新/加载Excel中的RTD Bloomberg函数(BDH)

    我想知道 VBA 代码中是否有办法强制 Bloomberg 函数 在电子表格中 更新其值 任何 BDH 函数 目标开发人员面临类似问题 拥有彭博终端 我尝试过什么 Application RTD RefreshData Applicatio
  • 如何使用单元格内的十六进制颜色值突出显示单元格?

    我有一个符号和匹配的十六进制颜色的电子表格 我想用单元格内的十六进制颜色填充单元格本身 或其旁边的单元格 我读过一些有关 条件格式 的内容 我认为这就是实现的方法 我怎样才能达到我想要的结果 条件格式无法实现所有颜色 假设 Row1 包含数
  • 使用R中的XLSX包在Excel中打印data.frame时出错

    数据框是可见的 没有任何错误 但是 当使用 XLSX 包的 write xlsx 函数打印相同内容时 会出现错误 Error in jcall cell V setCellValue value method setCellValue wi
  • Excel:如何通过VBA搜索电子表格1值是否存在于电子表格2中

    在电子表格 1 中 B 列包含值 即 V 9999 我正在尝试查看电子表格 2 的 B 列中是否存在这些值 我遇到的问题是 每次更新电子表格时数据都会发生变化 并且 B 列中的每行之间并不总是 1 1 匹配 例如 V 9999 可能存在于电
  • SQL 获取当月前 3 个月的第一天

    我正在尝试选择当前日期前 3 个月的第一天 例如 如果当前日期是 2015 11 08 我的结果是 2015 08 01 我希望采用 yyyy mm dd 格式 我一开始就尝试过这个 但没有运气 SELECT DATEADD dd DAY
  • 在 MS Excel 中为字符分配一个值并执行字符串(具有字符)的数学函数(+、-、*、/)

    我想根据给定字符串 ABCDEF 的预分配值对其进行求和 即首先我想为每个字符分配值 然后计算具有预先分配的字符的字符串的总值 excel中可以实现这个功能吗 例如 在下面 A 2 B 5 C 8 D 1 E 1 F 2 sum of AB
  • 在 Excel VBA 中使用 getElementsByClassName

    下面是我正在使用的代码 但我收到此错误 对象不支持此属性或方法 使用时getElementsByClassName 我正在使用的新 2 变量没有被填充 请帮助我 如果我做错了 请告诉我 Sub PopulateTasks Variable
  • Excel Power Query:如何将巨大的表格逆透视并转置为可读格式以进行分析

    I have this table that looks similar to this 我想将其改造为如下所示 这个想法是对表进行逆透视 或转置 以便可以将其输入到其他 BI 工具中 并且可以读取以进行分析 我有大约 20 个这样的表 有
  • 每次更改工作表时运行宏

    我对宏还很陌生 每次更新 更改或其他任何操作时 我都需要在工作表上运行一些代码 这是我需要运行的代码 我怎样才能做到这一点 Sub UnMergeFill Dim cell As Range joinedCells As Range For
  • Excel 文件的正确内容类型是什么? [复制]

    这个问题在这里已经有答案了 我希望网站上的 Excel 文件在单击时在 Excel 中打开 而不是保存在桌面上 或者嵌入在浏览器中打开等 现在显然 这一切都取决于如何为每个用户配置所有内容 但最好的内容类型是什么以及其他设置以在大多数情况下
  • 在react中读取excel文件

    我正在尝试读取 excel 文件并使用 XLSX 将其转换为 JSON 格式 但无法做到这一点 当文件位于本地计算机上时 任何人都可以建议转换方法吗 通过输入选择您本地机器的 Excel 表 在那之后 您的 Excel 数据将显示为 JSO
  • 在最后(或第四次)出现“.”时分割字符串分隔符

    我喜欢按如下方式分隔字符串 给定以下字符串 Column 1 10 80 111 199 1345 127 0 0 1 3279 我想在最后一个 之后分隔数字 这将得到以下输出 Column 1 Column 2 10 1 12 5 134
  • VBA - 从 Internet Explorer 的框架通知栏中选择另存为

    我正在尝试通过以下方式下载另存为的文件框架通知栏的互联网浏览器 然而 经过大量搜索后 我只找到了点击解决方案save在框架通知栏上 到目前为止 我一直在尝试另存为示例站点上的文件 http www tvsubtitles net subti
  • 如何在vba中向形状添加点或节点?

    I am trying to add points or nodes to a shape so instead of having 4 points I can have more 这是我添加形状的代码 Set shap2 w Shape
  • 检索形状的名称

    在 Excel 中 左上角有 名称框 但我找不到在 Word 中检索形状名称的方法 我怎么做 MS Word 中有两种形状 InlineShapes and Shapes 使用一些 VBA 代码检查形状对象的名称非常容易 选择形状 按 Al
  • 将 vbCrLf 应用于文本框的内容

    我在 Excel vba 项目中有一个用户窗体 在设计时它是空的 在表单初始化事件中 我有以下代码 Private Sub UserForm Initialize txtSQL value SELECT MyName ColY vbCrLf
  • VBA - 循环遍历表单上的控件并读取值

    我想循环遍历表单上的控件并读取值 但是 Value 和 Checked 属性不可用 我的问题是 当我循环访问控件 在本例中为复选框 时 如何读取它们的值 Dim Ctrl as Control For Each Ctrl In frmMai
  • 使用 python (openpyxl) 从 Excel 中删除网格线

    我正在尝试从使用 openpyxl 创建的 Excel 工作表中删除网格线 但它不起作用 我正在这样做 wb Workbook ws wb get active sheet ws show gridlines False print ws
  • 如何在 Excel 的 VBA 中求负数的立方根?

    我正在尝试在 Excel 的 VBA 中计算负数的立方根 在 Excel 工作表中取负数的立方根效果很好 2 1 3 1 25992 然而 相同的概念被编码到 VBA 中 2 1 3 gives a VALUE 将值返回到工作表时出错 我怀
  • Apache POI - JAVA - 迭代 Excel 中的列

    这里是java新手 我正在编写一个代码 该代码读取 Excel 文件 查看列中的单元格 然后编写如下表所示的内容 我有一个 Excel 文件 如下所示 col1 col2 col3 col4 row1 2 3 1 1 w row2 3 2

随机推荐