在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 SheetRange ,是对象。 因此,将它们分配给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)分配给单元格。 将.Valueclosures,分配应该更好。 您遇到的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是一个现有的对象