使用范围变量时未定义 Excel vba 变量
Posted
技术标签:
【中文标题】使用范围变量时未定义 Excel vba 变量【英文标题】:Excel vba variable not defined when using range variable 【发布时间】:2017-07-06 07:04:33 【问题描述】:我有函数 testFunc
将Range
作为参数,循环遍历其单元格并对其进行编辑。我有子 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 defined
For 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 变量的主要内容,如果未能解决你的问题,请参考以下文章
Excel VBA:粘贴到范围时未正确解释 ActiveCell