2016-08-05 2 views
0

블룸버그 공식을 사용하여 스프레드 시트를 통해 보간 된 국채 수익률을 끌어 내려고했습니다. D2 셀의 날짜가 M4 : M2612에서 향후 10 년 동안 매일 보간 된 수익을 변경해야합니다.날짜 사이의 반복되는 루프에 코드가 걸림

스프레드 시트는 스프레드 시트에있는 표의 이러한 보간 된 출력량을 계산합니다.

Bloomberg 헬프 데스크와 이야기 한 후 다음 날짜를 변경하기 전에 코드를로드 할 수 있도록 Application.OnTime을 사용하려고합니다. 코드는 모든 날짜를 통해 무한 루프에서 실행되었습니다 (아직 수율 데이터를 제대로로드하지 않고 있음). 나는 "If Day = EndDate then Exit For"를 추가했는데 이제는 루프에 포함 된 처음 두 날짜 사이의 무한 루프에서 실행됩니다.

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") 

다음 서브를 실행 업데이트하는 코드를 실행하므로이 괜찮습니다. 블룸버그 일부는 나에게 다소 새로운 것이지만, 일부 Google은 나에게 대답을 얻었다.

자, 두 번째 하위. 첫 번째 루프가 반복되지 않았기 때문에 위반자가 여기 있습니다. VBA 이미이 이름을 가진 뭔가가 있기 때문에 여기까지

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가 언급 한 바와 같이, 일을 사용하지 않는 것입니다.

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 

2 초에 다시의 경우 오류

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

모든 선택된 셀

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

위해 다음 코드를 코드를 시작 수행하고이 코드를 종료합니다. 그리고 여기에 루프가 있습니다! 오류가 있으면 2 초 후에 다시 시작됩니다. 두 번째 날짜가 바로 완전성

End If 

Next c 

sht2.Range("A1:A2609").Offset(1, 1).Value = sht1.Range("M4:M2612").Value 
Next Day 
End Sub 

에 대한 코드를 오티 "#N/A Invalid Parameter:Interpolation Values"

나머지를 반환합니다 때문에 처음 두 날짜에 무한 루프에 도착 그리고 그것 뿐이다. 때때로 처음부터 코드를 다시 읽어야합니다. 코드에 대한 이해가없는 사람에게 코드가하는 모든 것을 설명한다고 상상해보십시오.

앞서 언급했듯이 범위를 동적으로 가져 오는 것이 좋습니다. 따라서 사양이 변경되면 코드가 준비되고 팅커 필요가 없습니다.

나는 이것이 오래된 질문이라는 것을 알고 있지만, 누군가 내가 여기에서 비틀 거리면, 여기에 설명이 있습니다.