2016-08-05 74 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 

就是這樣。有時你必須從頭開始重新讀取你的代碼。試想一下,你正在向代碼不理解的人解釋你的代碼所做的一切。

正如我所說,我建議動態獲取的範圍,因此,如果規範改變,你的代碼是準備好了,也沒有必要進行修補。

我知道這是一個老問題,但如果有人像我一樣在這裏絆倒,這裏是一個解釋。