使用范围变量时未定义 Excel vba 变量

Posted

技术标签:

【中文标题】使用范围变量时未定义 Excel vba 变量【英文标题】:Excel vba variable not defined when using range variable 【发布时间】:2017-07-06 07:04:33 【问题描述】:

我有函数 testFuncRange 作为参数,循环遍历其单元格并对其进行编辑。我有子 testSub 可以测试 两种情况:首先是当我将 当前工作簿的范围 传递给 testFunc通过:1。变量Range 2. 作为参数testFunct(...Range("A1:A16"))

第二种情况是当我打开另一个工作簿并执行相同操作时 - 将其中一个 worksheets 范围传递给 testFunc 直接或通过变量

Function testFunc(aCol As Range)
    Dim i As Integer
    i = 0
    For Each cell In aCol
        MsgBox (cell.Value)
        cell.Value = i
        i = i + 1
    Next

    testFunc = i
End Function


Sub testSub()
    Dim origWorkbook As Workbook
    Set origWorkbook = ActiveWorkbook

    Dim aRange As Range
    Set aRange = ThisWorkbook.Sheets("sheet 1").Range("A1:A16")

    Dim dataWorkbook As Workbook
    Set dataWorkbook = Application.Workbooks.Open("Y:\vba\test_reserves\test_data\0503317-3_FO_001-2582480.XLS")
    Dim incomesNamesRange As Range
    Set incomesNamesRange = dataWorkbook.Worksheets("sheet 1").Range("A1:A20")
   ' origWorkbook.Worksheets("sheet 1").Cells(1, 5) = testFunc(dataWorkbook.Sheets("1").Range("A1:A20"))

     origWorkbook.Worksheets("Ëèñò2").Cells(1, 50) = testFunc(incomesNamesRange)


  '  testFunc aRange
  'origWorkbook.Worksheets("sheet 1").Cells(1, 5) = testFunc(aRange) '<---good
 ' origWorkbook.Worksheets("sheet 1").Cells(1, 5) = testFunc(ThisWorkbook.Sheets("sheet 1").Range("A1:A16"))
End Sub

问题是,正如我用 cmets 指出的那样,当我打开一个外部工作簿并将其范围传递给一个变量时,它会给出错误 variable not definedFor Each cell In aCol`,而所有其他情况(包括传递范围变量当前的工作簿)工作正常。

需要 testFunc 保持Function,因为它是来自更大程序的一些代码的简化示例,需要从函数中获取返回值。我还需要将 Range 存储在 变量 中,以最大限度地减少执行时间。

编辑:正如 cmets 中所指出的,我将 Cells(1,5) 替换为 origWorkbook.Worksheet("shee t1").Cells(1,5) 并修复了变量名,但原来的错误改为 variable not defined。我编辑了问题的标题和正文。

【问题讨论】:

Workbook 对象没有Cells 属性,因此origWorkbook.Cells(1, 50) 无效。您需要指定Cells.指的是哪个工作表。 如果您在顶部添加Option Explict,所有问题都将得到解决 ^^ 是啊,那也是!! (@ShaiRado 不是所有问题 - Workbook.Cells 仍然会出错。) 重新编辑问题:请参阅 Shai Rado 的评论 - 使用 Option Explicit 将向您显示错误的原因。一旦你看到它,你只需不到一秒钟的时间就可以修复它。 添加了Option Explicit,您现在应该定义所有变量 - 例如Dim cell As Range。这是一种很好的做法,尽管它需要做更多的工作。 【参考方案1】:

工作表的默认名称中不应包含空格。

Set incomesNamesRange = dataWorkbook.Worksheets("sheet 1").Range("A1:A20")

将其更改为:

    Set incomesNamesRange = dataWorkbook.Worksheets("Sheet1").Range("A1:A20")

看看能不能解决问题。

【讨论】:

以上是关于使用范围变量时未定义 Excel vba 变量的主要内容,如果未能解决你的问题,请参考以下文章

VBA:按变量选择范围

Excel VBA:粘贴到范围时未正确解释 ActiveCell

如何测试 Excel VBA 范围变量以引用整列..?

将命名范围值分配给变量(Excel VBA) - 新手

为啥在尝试读取记录集字段时未定义访问 vba 抛出子或函数?

EXCEL-vba-变量