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
函数中的使用使它看起来像一个Variant 或 Date 类型。在下文中,我将其声明为 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"
其中任何一个都应该将星期日和星期一推迟到上一个星期六。星期二及以后将无人管。
这是我的发票生成器的一个片段,特别是从 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
函数中的使用使它看起来像一个Variant 或 Date 类型。在下文中,我将其声明为 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"
其中任何一个都应该将星期日和星期一推迟到上一个星期六。星期二及以后将无人管。