VBA - 日期减去今天起的X天

时间:2015-02-16 23:12:29

标签: ms-word word-vba

这是我的发票生成器的一个片段,特别是抓取来自URL的网页包含汇率日期的汇率的抓取工具SUB。我正在尝试强制它从星期六开始转到URL,如果引用日期(datIzd,从datIzdCtrl内容控件中提取)是星期日或星期一,因为该页面尚未生成。目前星期日和星期一发出“超出范围”错误。

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

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

If Weekday(Now(), vbMonday)

并且玩弄它,但它没有走得太远。

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

这就是我所拥有的。

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

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

VBA extract and parse data from website to Word

1 个答案:

答案 0 :(得分:1)

有些变量 datIzd 的含义有点不清楚。对表单的.Text属性的赋值似乎是 String ,但它稍后在.Format函数中的使用使它看起来像 Variant 日期类型。在下文中,我将其声明为 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对 -1/0 的感知值 True / False ,就像这样。

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

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

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

其中任何一个都应该推动周日和周一回到上周六。星期二和之后将一个人留下。