使用随机数绘制来重新填充数组以进行分析

时间:2017-04-07 10:40:43

标签: arrays excel-vba random vba excel

我正在尝试创建一个子程序来执行分析。

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>

任何人都可以提供有关如何解决此问题的帮助吗? 非常感谢

1 个答案:

答案 0 :(得分:3)

您的代码存在一些问题,如果您在代码模块的顶部使用了Option Explicit,则可能会遇到一些问题。

首先,错误是由声明引起的:

returns(draw(1).Value)

draw未在任何地方声明,因此默认情况下类型为Variant;致电Variant, IntegerRandBetween()。因此,它没有.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")

我添加了myWorkbookmyWorksheet,因为您还应该完全限定引用,以避免错误。

第三,这一行:

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,除非有充分的理由。例如。 firstrowlastrow都可以是Long类型。它有助于避免错误,Variant变量效率较低。