在循环内标注变量的大小

时间:2016-10-24 19:21:19

标签: excel vba

我难以在循环中标注一个关键变量 - 当我使用绝对单元格引用(即A1)时它很好,但是当我标注相对值(即(i,j))它失败时 - 即使我可以把这个值称为单元格没问题。

任何想法都非常感激...... 干杯 丹

示例:

有效:

Sub Test(ARRAYX)

Dim i As Integer, j As Integer
With Workbooks("X.xlsb").Sheets("X")

    i = 50 'rows
    Do Until i = 51
        For j = 30 To 650 Step 30    'cols

            Dim NUM as integer

            NUM = activesheet.range("A1")  
            Workbooks("X.xlsb").Sheets("X").Cells(i - 48, j).value = ARRAYX(NUM, 2)
        Next j
        i = i + 1
    Loop
 End With
 End Sub

不起作用:

Sub Test(ARRAYX)

Dim i As Integer, j As Integer
With Workbooks("X.xlsb").Sheets("X")

    i = 50 'rows
    Do Until i = 51
        For j = 30 To 650 Step 30    'cols

            Dim NUM as integer

            NUM = Workbooks("X.xlsb").Sheets("X").Cells(i, j).value  
            Workbooks("X.xlsb").Sheets("X").Cells(i - 48, j).value = ARRAYX(NUM, 2)

         Next j
        i = i + 1
    Loop
 End With
 End Sub

1 个答案:

答案 0 :(得分:4)

当抛出错误时,问题显然与NUM的值无关; NUM超出了ARRAYX的范围。

根据您的发现添加错误处理和调试:

    On Error GoTo ErrHandler

    'your code

    Exit Sub
ErrHandler:
    MsgBox "Max legal value for 'NUM' is:" & UBound(ARRAYX,1) & vbNewLine _
         & "The value of 'NUM' is: " & NUM & vbNewLine _
         & "Taken from cell (" & i & "," & j & ")" & vbNewLine _
         & "Fix the data in the worksheet and try again."

它适用于A1,因为单元格A1中的值是ARRAYX数组的合法索引。它以(i,j)失败,因为单元格(i,j)中的值超出了数组的边界。

阅读评论,需要揭穿一些事情:

  • Cells("A1")不是绝对引用Cells("$A$1")是。 “绝对引用”是指表达单元格地址的方式;绝对列($A)和绝对行($1)。无论您是否使用绝对单元格引用都没有任何区别。
  • VBA中可能的最小范围是过程级别,这意味着变量可以在过程体中的任何位置声明。 Dim语句不可执行:VBA在该过程中运行单行之前为过程的声明分配内存空间。由于这个原因,逐步执行代码(在调试时 F8 )会跳过Dim语句(您不能在Dim语句中中断)。过程内的代码块不是范围:在IfWithDo内或其他任何可能的代码块中声明的变量与在此处声明的任何变量的范围相同。一个程序的顶部。