我试图通过使用彭博公式的电子表格来提取内插的国库券收益率。单元格D2中的日期必须改变,然后10年内每天的插值收益率将在M4:M2612中填充。
电子表格根据电子表格中的表格计算这些插值的收益。
在与Bloomberg帮助台交谈后,我正在尝试使用Application.OnTime来允许在更改下一个日期之前加载代码。代码在每个日期的无限循环中运行(仍然没有正确加载yield数据)。我添加了“如果Day = EndDate然后退出”,现在它在我的循环中包含的前两个日期之间的无限循环中运行。
它在Excel中的调试中没有错误。有关如何提取此数据的任何建议吗?
我需要这个代码每天拉12年,我使用较小的日期范围来抽样代码。
Public Sub master()
Call Range("A1:A2609").ClearContents
Call Range("M4:M2612").Select
Call Application.Run("RefreshCurrentSelection")
Call Application.OnTime(Now + TimeValue("00:00:02"), "Master2")
End Sub
Sub Master2()
Dim wb As Workbook
Dim sht1 As Worksheet
Dim sht2 As Worksheet
Dim c As Range
Set wb = ThisWorkbook
Set sht1 = wb.Sheets("Sheet1")
Set sht2 = wb.Sheets("Sheet2")
Dim StartDate As Date
Dim EndDate As Date
Dim Day As Date
StartDate = #4/2/2007#
EndDate = #4/6/2007#
For Day = StartDate To EndDate
MsgBox (Day)
If Day = EndDate then Exit For
sht1.Range("D2").Value = Day
For Each c In Selection.Cells
If c.Value = "#N/A Invalid Parameter:Interpolation Values" Then
Call Application.OnTime(Now + TimeValue("00:00:02"), "Master2")
Exit Sub
End If
Next c
sht2.Range("A1:A2609").Offset(1, 1).Value = sht1.Range("M4:M2612").Value
Next Day
End Sub
答案 0 :(得分:0)
我正在寻找别的东西,偶然发现了这个问题,我想我知道为什么这是一个无限循环。
让我们理解代码。这是第一部分:
Public Sub master()
Call Range("A1:A2609").ClearContents
清除范围A1:A2609。会建议动态获取它
Call Range("M4:M2612").Select
选择bloomberg要更新的范围。还尝试将其更改为动态获取。
Call Application.Run("RefreshCurrentSelection")
运行代码以从bloomberg更新
Call Application.OnTime(Now + TimeValue("00:00:02"), "Master2")
在2秒内运行下一个潜艇
End Sub
这里没有锁定循环,所以这没关系。对我来说,bloomberg部分有点新鲜,但有些谷歌给了我答案
现在,第二个子。由于第一个没有循环,罪犯会在这里。
Sub Master2()
Dim wb As Workbook
Dim sht1 As Worksheet
Dim sht2 As Worksheet
Dim c As Range
在此之前,只需定义变量
Set wb = ThisWorkbook
Set sht1 = wb.Sheets("Sheet1")
Set sht2 = wb.Sheets("Sheet2")
这里一切都很好
Dim StartDate As Date
Dim EndDate As Date
Dim Day As Date
正如@Kyle所提到的,避免使用Day,因为vba已经有了这个名字。
StartDate = #4/2/2007#
EndDate = #4/6/2007#
定义变量值,也可以。
For Day = StartDate To EndDate
MsgBox (Day)
用于测试的Msgbox,您可能希望稍后删除它。这将始终每天触发。
If Day = EndDate then Exit For
你不需要这个。您可以将EndDate
变量更改为少一天。
sht1.Range("D2").Value = Day
在D2
上写下这一天。这将始终是它使用的最后一天。
For Each c In Selection.Cells
为每个选定的单元格执行以下代码
If c.Value = "#N/A Invalid Parameter:Interpolation Values" Then
如果是错误
Call Application.OnTime(Now + TimeValue("00:00:02"), "Master2")
Exit Sub
在2秒后再次启动代码并退出此代码。
这是你的循环!如果有错误,它将在2秒后重新开始。
它会在前两个日期出现无限循环,因为第二个日期将返回"#N/A Invalid Parameter:Interpolation Values"
代码的其余部分,仅为了完整性
End If
Next c
sht2.Range("A1:A2609").Offset(1, 1).Value = sht1.Range("M4:M2612").Value
Next Day
End Sub
就是这样。有时您必须从头开始重新阅读代码。试想一下,你正在向不了解代码的人解释你的代码所做的一切。
正如我所提到的,我建议动态获取范围,因此如果规格发生变化,您的代码就可以使用了,而且无需修改。
我知道这是一个老问题,但如果有人像我一样偶然发现这里,这是一个解释。