使用Excel VBA将给定日期范围内的工作日存储在脚本字典中

时间:2018-12-28 14:34:37

标签: excel vba excel-vba

我提供了两个输入参数。开始和结束。这些日期的格式为mm / dd / yyyy。

我想将此日期范围(包括开始和结束日期)之间的工作日存储到字典中。我有以下代码。

我收到编译错误:ByRef参数类型不匹配

我不知道开始存储的类型是什么。也许是弦吗?在excel输入表中,尽管我将其格式化为日期dd / mm / yyyy。

我有两个问题:

  1. 如何键入强制转换startd才能使用IsWeekend函数?
  2. 为我提供的原始行有For n = startd To endd: WDdict(n) = 1: Next。如何阅读这一衬里语法?我不知道WDdict(n) = 1:在这里做什么。有人可以解释吗?

    startd = Sheet1.Range("startd")
    ...
    ...    
    
    Dim WDdict As New Scripting.dictionary
    For n = startd To endd: iff IsWeekend(startd) = True, WDdict(n) = 1:  Next
    
    ....
    ....
    
    Public Function IsWeekend(InputDate As Date) As Boolean
    Select Case Weekday(InputDate)
        Case vbSaturday, vbSunday
            IsWeekend = True
        Case Else
            IsWeekend = False
    End Select
    End Function
    

1 个答案:

答案 0 :(得分:0)

因此,我在这里看到了两个问题,并提出了一些建议,以使代码更清晰,更易于排除故障。

1)使用Option Explicit并强制变量具有强类型。这将帮助您了解正在传递给函数的内容。

2)您使用的for循环语法有点混乱。我会使用更标准的屏蔽功能。

3)在循环中,您始终在检查startd是否是周末。这将始终返回与startd相同的答案,因为您在循环时没有更改。 (n将会改变)

对您的代码在做什么进行一些猜测,我提出了以下解决方案:

Option Explicit
 Sub ClientCode()
    Dim startD As Date
    Dim endD As Date
    Dim dict As Dictionary
    Dim n As Date

    Set dict = New Dictionary
    startD = CDate(Sheet1.Range("startd"))
    endD = CDate(Sheet1.Range("endd"))

    For n = startD To endD
        If IsWeekend(n) Then
        dict(n) = 1
        End If
    Next n
End Sub

Public Function IsWeekend(InputDate As Date) As Boolean
Select Case Weekday(InputDate)
    Case vbSaturday, vbSunday
        IsWeekend = True
    Case Else
        IsWeekend = False
End Select
End Function

在我的sheet1上有两个命名范围,它们的作用类似于输入单元格。它将加载包含周末日期的键值的字典。您仅将数字1分配为字典中的值的事实可能表明您可以使用简单的VBA.Collection对象而不是字典。但是,也许您对字典的实际使用隐藏在示例的...中。