【问题标题】:Code stuck in a repeated loop between dates代码卡在日期之间的重复循环中
【发布时间】:2016-08-05 13:59:18
【问题描述】:

我正在尝试使用彭博公式通过电子表格提取内插国债收益率。单元格 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

【问题讨论】:

  • StartDate = #4/2/2007# 是什么? # 是做什么的?
  • 这(2 秒)延迟的两个主机(master、master2)之间的控制转移应该实现什么?
  • # 符号允许您在使用循环时使用日期范围
  • 运行 Bloomberg 主动控件时必须有一个“master”子,否则它们的公式无法识别,延迟是让具有静态数据的单元格在复制数据之前更新。
  • 我不知道这在这种情况下会导致问题,但我建议不要使用Day 作为变量,因为VBA 中有Day() 函数。

标签: vba excel date bloomberg


【解决方案1】:

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

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

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

这里没有锁定循环,所以没关系。彭博社的部分对我来说有点新,但一些谷歌给了我答案

现在,第二个潜艇。由于第一个没有循环,所以违规者会在这里。

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

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

正如我所提到的,我建议动态获取范围,因此如果规范发生变化,您的代码已经准备就绪,无需修改。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-20
    • 2020-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-27
    • 1970-01-01
    • 2012-09-02
    相关资源
    最近更新 更多