2014-10-29 90 views
3

這是VBA宏在Excel 2013Excel的VBA宏:在「所需的對象」,「對於每個...在...」循環

我通過細胞循環在表1中,色柱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文章,所以請讓我知道我是否做錯了什麼。

+0

是'For Each c In Sheets(「Tagging」).' Range。(「B6:B500」)。Cells''中需要的'.Cells'。 – CallumDA 2014-10-29 10:49:56

+0

E中的公式,代碼可以消失......'= IFERROR(VLOOKUP(B2,'Automatic Categories'!A2:B500,2,FALSE),「」)'會做你的代碼在做什麼 – SeanC 2014-10-29 15:58:15

回答

3

這裏的錯誤是If Not c.Value Is Nothing被檢查是否包含在小區C的值是一個對象,而該對象沒有被實例化。

由於單元格的值是一個基本類型(一個真正的變體),那麼正確的校驗使用或者是

If c.Value <> vbNullString

If IsEmpty(c)

您以後使用的Is Nothing ,在If Not searchRng Is Nothing是正確的,因爲這是檢查Range對象是否包含Nothing

+1

我真的覺得' IsEmpty'是這裏的一種方式,但值得注意的是'IsEmpty(c)'僅僅是因爲Range的默認屬性是值。真正發生的是'IsEmpty(c.Value)'。 – RubberDuck 2014-10-29 12:07:41

+0

感謝您的解釋,現在全部排序!顯然最內線(實際填充的線)中的「Set」是不必要的/不適當的。 – emberfiend 2014-10-29 13:13:29

+0

啊,之前沒有發現 - 是的,'Set'用於分配對象變量,但不是基元類型。這些等價物是可選的'Let'關鍵字。 – citizenkong 2014-10-29 13:15:08

1

c.value引用單元格中的值(文本,數字,日期)。這永遠不會是一個對象。檢查細胞(即使只用空格)的價值的一種方式是

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

細胞不返回對象,而是一個Variant值的Value。只有物體可以用Nothing進行測試。只要寫

If c.Value <> ""