在Excel中引用单元格和工作表
我有一个我根本不理解的问题:
i = 150 If ActiveWorkbook.Worksheets("foobar").Cells(i, 3).Value Like "*:*" Then MsgBox "I found a colon!" End If
正如你可能猜到的那样,foobar表单在位置(150,3)处有一个包含冒号的单元格,因此显示了消息框。
现在我想要这样做:
i = 150 Cell = ActiveWorkbook.Worksheets("foobar").Cells(i, 3).Value 'fails right here If Cell Like "*:*" Then MsgBox "I found a colon!" End If
这里给我一个错误:“Object variable or With block variable not set。实际上是说:
Sheet = ActiveWorkbook.Worksheets("foobar")
给出了类似的信息。 为什么? 我究竟做错了什么? 我只想要这个对象的引用,或者至less是一个引用。
底线:
- 处理对象时 ,使用
Set
。 - 在处理原始数据(整数,长整数,string*,variables*)时,不要使用它。
Workbook
Sheet
, Range
,是对象。 因此,将它们分配给variables时需要使用Set
。
Range.Value
返回一个Variant(可以是一个long,一个string等)。所以,你不能使用Set
。
==========================
现在,关于你的错误信息…我会说,也许之前在你的代码中, Cell
被声明为对象 。 尝试使用另一个variables名称,或者检查Cellvariablestypes。
要检查这个,右键点击它,然后点击“定义”。 它声明为Variant
可能会解决问题(但请注意它可能导致的副作用)。
==========================
*我知道这些types不是“原始的”; 为了解释的清洁,我在这里作为一个例子。
当你分配一个对象的线
Sheet = ActiveWorkbook.Worksheets("foobar")
应该读
Set Sheet = ActiveWorkbook.Worksheets("foobar")
在你的线上
Cell = ActiveWorkbook.Worksheets("foobar").Cells(i, 3).Value
您正试图将单元格的值(可能是string)分配给单元格。 将.Value
closures,分配应该更好。 您遇到的Excel消息并不是最好的:有时您在分配错误types的variables时得到它。
但是, If Cell Like
可能无法正常工作。 (提示: .Value
必须移动,而不是删除。)
我只是尝试了下面的代码,它可能在你的代码中工作,确保ActiveWorkBook实际上是你想要的Active Work book(如果你正在使用多个工作簿)
Sub test() i = 3 If ActiveWorkbook.Worksheets("Sheet1").Cells(i, 2).Value Like ":" Then MsgBox "I found a colon!" Else MsgBox "didn't find a colon!" End If Cell = ActiveWorkbook.Worksheets("Sheet1").Cells(i, 2).Value 'fails right here If Cell Like ":" Then MsgBox "I found a colon!" End If End Sub
使用Dim MyCell as Variant
(或string),因为Cell是一个现有的对象