VBA - 从今天开始减去 X 天的日期

VBA - date minus X days from today

这是我的发票生成器的一个片段,特别是从 URL 包含汇率日期的网页获取汇率的爬虫 SUB。如果引用日期(datIzd,从 datIzdCtrl 内容控件中提取)是星期日或星期一,我正在尝试强制它从星期六开始到 URL,因为那几天尚未生成页面。目前周日和周一发出"out of range"错误。

也许更好的方法是让日期继续往前 1 天,直到它到达一个存在的页面(并在 MsgBox 中通知它往前走了多远),因为同样的事情适用于假期 - 银行不'发布新的汇率,所以最后一个工作日的汇率是相关的。

谁能告诉我这是怎么做到的?我尝试使用

If Weekday(Now(), vbMonday)

玩弄它,但没走多远。

另外我知道在代码中我似乎不必要地多次重新格式化日期,但这是必须的,因为美国和克罗地亚的日期格式不一样,而且它们必须在各自的页面上正确显示发票,并在两次转换之间针对 URL 个名称重新计算。

这是我的。

Dim splData As Variant

Enum READYSTATE
    READYSTATE_UNINITIALIZED = 0
    READYSTATE_LOADING = 1
    READYSTATE_LOADED = 2
    READYSTATE_INTERACTIVE = 3
    READYSTATE_COMPLETE = 4
End Enum

Sub Crawler()

    Dim url As String, datIzd As Date, xmlHTTP As MSXML2.ServerXMLHTTP60
    Dim getData As String

    Set xmlHTTP = New MSXML2.ServerXMLHTTP60

    ActiveDocument.SelectContentControlsByTitle("datIzCtrl")(1).Range.ParentContentControl.DateDisplayFormat = "MM-DD-YYYY"

    datIzd = ActiveDocument.SelectContentControlsByTitle("datIzCtrl")(1).Range.Text

    With xmlHTTP
        url = "http://www.hnb.hr/tecajn/f" & Format(datIzd, "ddmmyy") & ".dat"
        .Open "GET", url, False
        .setRequestHeader "Content-Type", "text/xml"
        .send
        getData = .responseText
    End With

    repData = Replace(getData, "       ", vbCrLf)
    repData = Replace(getData, "      ", vbCrLf)
    splData = Split(repData, vbCrLf)

    If OptionPredracun.Value = True Or OptionRacunPredujam.Value = True Or OptionRacunUkupniIznosHR.Value = True Then
        ActiveDocument.SelectContentControlsByTitle("datIzCtrl")(1).Range.ParentContentControl.DateDisplayFormat = "DD. MMMM YYYY."
    Else
        ActiveDocument.SelectContentControlsByTitle("datIzCtrl")(1).Range.ParentContentControl.DateDisplayFormat = "MMMM DD, YYYY"
    End If


End Sub

注意:如果这听起来令人困惑,您可以查看我之前关于同一个项目的 post,其中更详细地介绍了我正在尝试做的事情:

有点不清楚datIzd是什么类型的变量。对表单 .Text 属性 的赋值似乎是一个 String 但它后来在 .Format 函数中的使用使它看起来像一个VariantDate 类型。在下文中,我将其声明为 Date 类型并使用 DateValue(另一个选项是 CDate)将内容控件的文本转换为实际日期.

dim datIzd as date
datIzd = DateValue(ActiveDocument.SelectContentControlsByTitle("datIzCtrl")(1).Range.Text)

一旦您在 datIzd 中有了实际日期,您应该能够确定它的 Weekday 并从日期中减去工作日(如果是星期日或星期一)。默认的 vbSunday 可能是最好的,因为它使星期日成为 1,星期一成为 2.

if Weekday(datIzd) < 3 then
  datIzd = datIzd - Weekday(datIzd)
end if

使用 VBA 对 True/False[=40 的感知值 -1/0 的更简化版本=] 像这样。

datIzd = datIzd + ((Weekday(datIzd) < 3) * Weekday(datIzd))

这一切都应该在 datIzd 用于创建 URL 字符串之前完成,

url = "http://www.hnb.hr/tecajn/f" & Format(datIzd, "ddmmyy") & ".dat"

其中任何一个都应该将星期日和星期一推迟到上一个星期六。星期二及以后将无人管。