For循环

时间:2016-07-12 08:19:31

标签: excel vba excel-vba

我的VBA代码遇到了一个非常奇怪的问题。

虽然我可以说出它为什么不起作用但我无法解决问题。

'ws is the worksheet object I have created during run time. 
ws.Range("A1:AAA9000").Clear
ws.Activate
ws.Select 

'Covariance Matrix

Range("A1").Value = "Covariance Matrix"

For i = 1 To num_assets
    For j = 1 To num_assets

        MsgBox "i = " & i & ", j=" & j
        Cells(1 + i, 1 + j).Value = Covariance(i, j)
    Next j
Next I

到目前为止,这是我的分析。

案例1.如果协方差矩阵填充到运行时之前创建的现有工作表中的单元格,则此代码正常工作。

案例2.如果应用于在运行时动态创建的新工作表中的单元格,则此代码的行为非常奇怪。

在for循环中,i以1开始,然后i突然跳转到145.Excel抛出Subscript out of range错误,因为协方差矩阵只是4 x 4矩阵。并且代码被终止。

“协方差矩阵”标题写入单元格A1,没有任何问题。每当我使用循环用数组或矩阵中的某些值填充某个范围时,类似的问题就会出现。

如果我将整个代码应用于在运行VBA代码之前创建的现有工作表,则不会出现任何问题。

所以结论是它是由使用在运行时动态创建的新工作表引起的。但是,如何修复此代码以便在运行时创建的新工作表中安全运行?

提前感谢您的帮助。

=============================================== =================

在我收到几个问题后,我决定包括如何定义变量。

Public Covariance() As Double
Public i, j, k As Integer
Public num_assets, num_periods As Integer

=============================================== ==================

这是展示如何分配num_assets的另一部分。当我打印num_assets和num_periods时,它们完全正确。

num_assets = dataRange.Columns.Count
num_periods = dataRange.Rows.Count

ReDim Covariance(num_assets, num_assets) As Double

MsgBox "Num Assets " & num_assets & ", Num Periods " & num_periods

1 个答案:

答案 0 :(得分:0)

一般来说,我认为有两种可能发生的方式(我包括第二种方法,虽然这不是解决方案,因为它可以帮助遇到类似问题的人)

  1. 您已全局声明i(在子/函数之外),并以某种方式更改它。在这种情况下,我看到发生这种情况的唯一方法是,如果您有一个触发的工作表事件,并使用i本身执行某些操作。例如,如果您有类似

    的内容
    Private Sub Worksheet_Change(ByVal Target As Range)
        For i = 1 To 144
            'dosomething
        Next i
    End Sub
    

    这将导致i的值跳转到145.当然,解决方案是在本地声明所有变量,除非你确实需要它们是全局的。

  2. 您有一个更改i的子或函数。请注意,如果将i作为参数传递给函数,则函数可以默认更改i。如果您不想要,请声明如下函数:

    Public Function Covariance(ByVal i As Long, ByVal j As Long) As ...
    

    这样只有值,而不是变量本身传递给函数。顺便说一句,如果你以不同的方式命名函数的参数,它就不会有所作为。