【问题标题】:Dimensioning a variable inside a loop标注循环内的变量
【发布时间】:2016-10-24 19:21:18
【问题描述】:

我很难在循环中确定关键变量的尺寸 - 当我使用绝对单元格引用(即 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

【问题讨论】:

  • “失败”是什么意思?你有错误吗?如果是这样,错误是什么,它会抛出哪一行?如果不是,请描述预期的行为以及您的代码是如何“未能”做到这一点的。
  • 一般 VBA 技巧。你有一个With 块,但你实际上并没有使用它。
  • 我能问一下为什么你在循环中标注它而不是在其他变量的开头?
  • @tompreston 宣布接近首次使用是一件的事情。处于循环中是无关紧要的。它只有一次尺寸。
  • 一个版本使用ActiveSheet 另一个指定工作簿。您可能认为它们引用的是相同的,但 Sheets("X") 可能不是您的 ActiveSheet

标签: excel vba


【解决方案1】:

问题显然在于抛出错误时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) 中的值超出了数组的范围。


通读 cmets,有很多事情需要揭穿:

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

【讨论】:

  • 什么是ARRAYX的上限中哪一部分不清楚?
  • 这没有任何区别。重要的是价值,而不是它的来源。添加错误处理并验证ij 的值抛出错误时,更重要的是该单元格的值 - 即学习调试代码.而且“越界”不是“溢出”,如果您遇到“溢出”,那么您就溢出了 Integer 类型,其值很可能大于 32,767。所以,不是“溢出”,“越界”。当人们不看您的屏幕时,正确的术语有助于正确理解。
  • 奇怪,@DanS,你来这里寻求关于如何使你的代码工作的建议,然后当有人给你一个建议时(我会冒险说这是你的问题的根源),你告诉他们这是错误的,但从未尝试实施向你提出的建议。 Mat's Mug 比我更有耐心……
  • @DanS - 您的解释不可能是正确的。请参阅前面的this comment。您不仅没有在 2 个示例中使用等效代码(如 this comment 所指出的那样),变量 storage 与下标错误无关。除非您放弃知道原因的假设,否则您将无法调试它。
  • @Dan S. 这不是一个很难解决的问题。您从几个高级 VBA 用户那里得到了很好的建议,但您都忽略了它们。他们没有放弃解决你的问题,他们已经放弃了你。重申你的信念不会改变或修复错误。添加错误处理程序,发现 i、j 和 Cells(i,j) 是什么,然后继续。
猜你喜欢
  • 2017-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-10
  • 2011-02-19
  • 1970-01-01
相关资源
最近更新 更多