这是我的发票生成器的一个片段,特别是抓取来自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
注意:如果这听起来令人困惑,您可以查看我之前关于同一个项目的帖子,该帖子详细介绍了我正在尝试做的事情:
答案 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"
其中任何一个都应该推动周日和周一回到上周六。星期二和之后将一个人留下。