2016-08-05 75 views
0

我试图通过使用彭博公式的电子表格插入国债收益率。单元格D2中的日期必须改变,那么未来10年内每天的内插收益率将填入M4:M2612。代码卡在日期之间的重复循环

电子表格根据电子表格中存在的表格计算这些插值收益率。

在与彭博服务台交流之后,我试图使用Application.OnTime来允许代码在更改下一个日期之前加载。代码在每个日期都以无限循环运行(仍然没有正确加载yield数据)。我添加了“If 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

无法重现。 – bernie

+0

什么是'StartDate =#4/2/2007#'? '''做什么? – BruceWayne

+0

你是什么意思? –

回答

0

我在寻找别的东西,偶然发现了这个问题,我想我明白了为什么这是一个无限循环。

让我们了解代码。这是第一部分:

Public Sub master() 
Call Range("A1:A2609").ClearContents 

这将清除范围A1:A2609。建议动态获取

Call Range("M4:M2612").Select 

选择由bloomberg更新的范围。也尝试将其更改为动态获取。

Call Application.Run("RefreshCurrentSelection") 

运行的代码从彭博

在2秒钟内

End Sub 

没有循环这里锁定更新

Call Application.OnTime(Now + TimeValue("00:00:02"), "Master2") 

运行下一子,所以这是确定的。 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提到的,避免使用一天,因为VBA已经有这个名字的东西。

StartDate = #4/2/2007# 
EndDate = #4/6/2007# 

定义变量值,所以也可以。

For Day = StartDate To EndDate 
MsgBox (Day) 

Msgbox for test,您可能想稍后再删除它。这将每天都会触发。

If Day = EndDate then Exit For 

你不需要这个。您可以将EndDate变量更改为少一天。

sht1.Range("D2").Value = Day 

D2上写上一天。这将始终是它使用的最后一天。

For Each c In Selection.Cells 

在2秒内再次执行以下代码为每个选定的单元

If c.Value = "#N/A Invalid Parameter:Interpolation Values" Then 

如果其错误

Call Application.OnTime(Now + TimeValue("00:00:02"), "Master2") 
Exit Sub 

启动代码和退出该代码。 这就是你的循环!如果有错误,它将在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 

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

正如我所说,我建议动态获取的范围,因此,如果规范改变,你的代码是准备好了,也没有必要进行修补。

我知道这是一个老问题,但如果有人像我一样在这里绊倒,这里是一个解释。