我正在尝试创建一个子程序来执行分析。
UPDATE :子生成的错误如下:运行时错误'424' - 需要对象
有两个声明的范围。我想从结果范围中随机绘制三个值,执行返回分析,并将此结果传递给结果范围的一个单元格。然后我想重复这个,直到用随机抽取分析填充第二个更大的范围。这是我到目前为止的代码:
Sub boostrap()
Dim returns As Variant
Dim Results As Variant
Dim n As Integer
Dim m As Integer
Dim ret As Variant
Dim firstrow As Variant, lastrow As Variant
Dim annualised_return As Variant
Dim i As Long, j As Long
returns = Range("returns")
Results = Range("Results")
n = Range("returns").count
m = Range("Results").count
lastrow = Range("returns").End(xlDown).Row
firstrow = Range("returns").Row
For j = 1 To m
ReDim draw(1 To 3) 'to create a draw reference number from the second range
draw(1) = Application.WorksheetFunction.RandBetween(firstrow, lastrow)
draw(2) = Application.WorksheetFunction.RandBetween(firstrow, lastrow)
draw(3) = Application.WorksheetFunction.RandBetween(firstrow, lastrow)
ReDim ret(1 To 3)
ret(1) = returns(draw(1).Value)
ret(2) = returns(draw(2).Value)
ret(3) = returns(draw(3).Value)
Results(j) = (((1 + ret(1)) * (1 + ret(2)) * (1 + ret(3))) ^ (1 / 3) - 1)
Next j
End Sub
单步执行sub,错误似乎源于我尝试将绘图中的数字作为结果范围的引用传递。即如果绘制产生#22,那么我想选择第22行中的值放置在结果数组中,然后我将分析(以及其他两个绘制)以填充结果范围的每个单元格。 / p>
任何人都可以提供有关如何解决此问题的帮助吗? 非常感谢
答案 0 :(得分:3)
您的代码存在一些问题,如果您在代码模块的顶部使用了Option Explicit
,则可能会遇到一些问题。
首先,错误是由声明引起的:
returns(draw(1).Value)
draw
未在任何地方声明,因此默认情况下类型为Variant
;致电Variant, Integer
后RandBetween()
。因此,它没有.Value
属性(或任何方法或属性),因此调用draw(1).Value会引发错误。您应该将draw
声明为Integer
数组:
Dim draw() As Integer 'or
Dim draw(1 To 3) As Integer 'Better if always (1 To 3), then you don't need to ReDim
然后你不需要.Value
,只需使用:
ret(1) = returns(draw(1),1)
请注意,returns
是一个2D Variant数组,因为您为其分配了Range
个值。执行Variant = Range().Value
时,即使Range
只有一个单元格,它也会创建一个二维数组。
其次,如果您想使用Results
变量将数据输出到工作表,则需要将其声明为Range
变量并将其Set
声明,例如
Dim Results As Range
Set Results = myWorkbook.myWorksheet.Range("Results")
我添加了myWorkbook
和myWorksheet
,因为您还应该完全限定引用,以避免错误。
第三,这一行:
Results(j) = annualised_return = (((1 + ret(1)) * (1 + ret(2)) * (1 + ret(3))) ^ (1 / 3) - 1)
将测试annualised_return
是否等于(((1 + ret(1)) * (1 + ret(2)) * (1 + ret(3))) ^ (1 / 3) - 1)
,并将Results(j)
设置为等于此测试的True
/ False
结果。我认为这不是你想要的。
最后,一小段一般建议:明确声明所有变量并避免将变量声明为Variant
,除非有充分的理由。例如。 firstrow
和lastrow
都可以是Long
类型。它有助于避免错误,Variant
变量效率较低。