Dim works As Worksheet
Set works = ThisWorkbook.Sheets("Sheet1")
Dim txt As Variant
myrange = works.Range("C1:C9")
For Each txt In myrange
If InStr(1, txt, "£", vbTextCompare) > 0 Then
Debug.Print txt.Value '<..Object required err
Debug.Print works.Range("C" & txt).Value '<..Object required err
Debug.Print works.Cells(txt, 1).Value '<..Object required err
Debug.Print txt.Offset(0, 1).Value '<..Object required err
End If
Next txt
我试图获取包含“£”的单元格的值,然后将其删除。在任何情况下我都会得到`对象定义的错误。我尝试了3种不同的选项,但仍然出现错误。我是VBA的新手,还在学习。我该如何解决这个问题,为什么我会收到错误?
一个问题是线myrange = works.Range("C1:C9")
。它之前应该有Set
,如:
Set myrange = works.Range("C1:C9")
这样,您可以确保进行引用分配,而不是赋值。没有它,你告诉VBA你希望单元格的值放在变量中。有了它,你告诉VBA你希望你的变量指向那个范围。
由于你没有明确地将myrange
声明为Range
对象,因此VBA隐式地将其声明为Variant
并将其视为String
。所以,在循环中,txt
也是一个String
,而不是你所期望的Range
。因此你的错误。
如果你在开始时有Dim myrange As Range
,那么没有Set
的任务就会失败,你就会立即修复它。
但是有一个简单的习惯可以防止这种错误:在模块的顶部插入Option Explicit
。这样,你必须明确声明所有变量,这意味着VBA不会假设它们是Variant
。
你甚至可以通过检查Tools > Options
中的相关选项来自动完成。