代码卡在日期之间的重复循环中

时间:2016-08-05 13:59:19

标签: excel vba excel-vba date bloomberg

我试图通过使用彭博公式的电子表格来提取内插的国库券收益率。单元格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

1 个答案:

答案 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

就是这样。有时您必须从头开始重新阅读代码。试想一下,你正在向不了解代码的人解释你的代码所做的一切。

正如我所提到的,我建议动态获取范围,因此如果规格发生变化,您的代码就可以使用了,而且无需修改。

我知道这是一个老问题,但如果有人像我一样偶然发现这里,这是一个解释。