Excel VBA宏:“For Each ... In ...”循环中的“Object required”

时间:2014-10-29 10:46:12

标签: excel vba excel-vba

这是Excel 2013中的VBA宏。

我循环播放Sheet 1,Col B中的单元格。对于每个单元格,我想要取其值并在Sheet 2,Col A中搜索。如果找到了,我想要获取Sheet 2,Col B中的相应值,并将其放在Sheet 1,Col E。

中的相应行中

这些表:

Tagging                 Automatic Categories
B     E                 A     B
hat                     cake  Delicious cake.
cake
arm

应该成为:

Tagging                 Automatic Categories
B     E                 A     B
hat                     cake  Delicious cake.
cake  Delicious cake.
arm

代码:

Sub AutoCategorize()
Dim c As Range
Dim searchRng As Range
For Each c In Sheets("Tagging").Range("B6:B500").Cells ' loop through cells to do the lookup based on
    If Not c.Value Is Nothing Then ' if there is something in the cell
        If c.Offset(0, 3).Value Is Nothing Then ' make sure the cell to fill is empty
            With Sheets("Automatic Categories").Range("A2:A500") ' using the cells we're looking up in...
                Set searchRng = .Find(What:=c.Value) ' find it
                If Not searchRng Is Nothing Then ' make sure we've found a thing
                    If Not searchRng.Offset(0, 1).Value Is Nothing Then ' make sure it has a corresponding entry
                        Set c.Offset(0, 3).Value = searchRng.Offset(0, 1).Value ' fill it in
                    End If
                End If
            End With
        End If
    End If
Next
End Sub

我认为,我的问题在于我对Excel-VBA如何构建数据的理解。不幸的是,MSDN在这方面确实无益,而且我只是设法将很多事情从实验中解决了。

当我运行代码时,我得到了

Run-time error '424': Object required

并且调试器突出显示

If Not c.Value Is Nothing Then

任何人都可以了解导致错误的原因吗?我非常确定我的逻辑是可以的,但正如我所说,我不是100%关于如何引用单元格/数据结构如何工作。

我是VB和Excel宏的新手,如果有更好的结构化方法,请大声喊叫。这也是我的第一篇StackOverflow帖子,如果我做错了,请告诉我。

3 个答案:

答案 0 :(得分:4)

此处的错误是If Not c.Value Is Nothing正在检查单元格c中包含的值是否为对象,并且该对象尚未实例化。

由于单元格值是基本类型(实际上是变体),因此要使用的正确检查是

If c.Value <> vbNullString

If IsEmpty(c)

稍后在Is Nothing中使用If Not searchRng Is Nothing是正确的,因为这会检查Range对象是否包含Nothing

答案 1 :(得分:1)

c.value是指单元格中的值(文本,数字,日期)。这永远不会是一个对象。检查单元格值(即使只有空格)的一种方法是

If Length(Trim(c.Value)) > 0 Then ...

答案 2 :(得分:0)

单元格的Value不返回对象,而是返回Variant值。只能使用Nothing测试对象。只需写下

If c.Value <> ""