我的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
答案 0 :(得分:0)
一般来说,我认为有两种可能发生的方式(我包括第二种方法,虽然这不是解决方案,因为它可以帮助遇到类似问题的人)
您已全局声明i
(在子/函数之外),并以某种方式更改它。在这种情况下,我看到发生这种情况的唯一方法是,如果您有一个触发的工作表事件,并使用i
本身执行某些操作。例如,如果您有类似
Private Sub Worksheet_Change(ByVal Target As Range)
For i = 1 To 144
'dosomething
Next i
End Sub
这将导致i
的值跳转到145.当然,解决方案是在本地声明所有变量,除非你确实需要它们是全局的。
您有一个更改i
的子或函数。请注意,如果将i
作为参数传递给函数,则函数可以默认更改i。如果您不想要,请声明如下函数:
Public Function Covariance(ByVal i As Long, ByVal j As Long) As ...
这样只有值,而不是变量本身传递给函数。顺便说一句,如果你以不同的方式命名函数的参数,它就不会有所作为。