[英]VBA-Macro efficiency with Bloomberg Data History
我是VBA的新手。 我编写了这段代码,并且可以运行,但是要花很多时间才能运行,而且我感觉到它运行的时间越长,它的运行速度就会越来越慢。
有什么办法可以使这样的事情更有效率吗? 如果有人在这里为我提供一些建议,那将很棒。
Sub Sheets()
Application.ScreenUpdating = False
ActiveWindow.WindowState = xlMinimized
Dim Data As String
Dim i As Long
Dim k As Long
Dim x As Long
Dim y As String
For i = 2 To 255
Sheetname = Worksheets("Input").Cells(i, 1).Value
Worksheets.Add.Name = Sheetname
ActiveSheet.Move After:=Worksheets(ActiveWorkbook.Sheets.Count)
x = 1
For k = 2 To 876
Data = Worksheets("Input").Cells(i, k).Value
y = Cells(1, x).Address(RowAbsolute:=False, ColumnAbsolute:=False)
BloomB = "=BDH(" & y & ",""TURNOVER"",""8/1/2011"",""4/30/2016"",""Dir=V"",""Dts=S"",""Sort=A"",""Quote=C"",""QtTyp=Y"",""Days=T"",""Per=cd"",""DtFmt=D"",""UseDPDF=Y"")"
Worksheets(Sheetname).Cells(1, x) = Data
Worksheets(Sheetname).Cells(2, x) = BloomB
x = x + 2
Next k
Application.Wait (Now + TimeValue("0:00:03"))
Next i
ActiveWindow.WindowState = xlMaximized
Application.ScreenUpdating = True
End Sub
删除Application.Wait (Now + TimeValue("0:00:03"))
。 或者将“ Next i
放在其上方,如下所示:
Next i
Application.Wait (Now + TimeValue("0:00:03"))
您将获得大约43分钟的时间。
如果您仍然喜欢等待的想法,可以将其复杂一些,例如:
If i Mod 50 = 0 Then Application.Wait (Now + TimeValue("0:00:02"))
Next i
因此,它将每第50次迭代等待一次。
难道不是全部转换为沿着A2 =offset(Input!B1,row(),0)
和B2 =BDH(ADDRESS(ROW(),1,4),""TURNOVER.....
如公式只是被向下填充?
除了我对硬编码的评论。 这是一些代码,以防止重复调用静态数据函数
Option Explicit
Sub Test()
Dim rng As Excel.Range
Set rng = Worksheets(1).Cells(1, 1)
rng.Formula = "=SIN(PI()/4)" '* a formula is in fact constant
'* in some instances Evaluate will suffice
Dim vHardcodedFormulaResult As Variant
vHardcodedFormulaResult = Application.Evaluate("SIN(PI()/4)")
rng.Offset(1, 0).Value2 = vHardcodedFormulaResult
'* in other cases Application.Run will be needed and also multi-cell return results
Dim vHardcodedFormulaResult2 As Variant
vHardcodedFormulaResult2 = Application.Run("FakeBDH", "Citi", "FakeParam")
Dim lIndex As Long
lIndex = 0
Dim vLoop As Variant
For Each vLoop In vHardcodedFormulaResult2
rng.Offset(2, lIndex) = vLoop
lIndex = lIndex + 1
Next vLoop
End Sub
Function FakeBDH(ByVal sKey As String, ByVal vParam1) As Variant
FakeBDH = Array(2015, 45000)
End Function
抱歉,您到底要做什么? 您是否需要股票的时间序列数据? 是的,请尝试下面的链接。
http://investexcel.net/multiple-stock-quote-downloader-for-excel/
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.