2016-02-29 1162 views
1

此代碼嘗試刪除包含與陣列(列表)中的「文本」匹配的標題行的列。VBA數組刪除整列

代碼成功刪除基於第1個數組值「標題文本1」的列。

該問題發生在A.EntireColumn.Delete的循環第二次通過期間。當我打印vItem時,它顯示預期的「標題文本2」值,這是數組中正確的項目。

VBA錯誤 - 運行時錯誤「91」

對象變量或帶塊變量未設置

Sub ArrayLoop() 
Dim ColumnsToRemove As Variant 
Dim vItem As Variant 
Dim A As Range 

ColumnsToRemove = Array("Header Text 1", "Header Text 2", "Header Text 3") 

For Each vItem In ColumnsToRemove 

    Set A = Rows(1).Find(What:=(ColumnsToRemove), LookIn:=xlValues, lookat:=xlPart) 
    Debug.Print vItem 
    A.EntireColumn.Delete 

Next 
End Sub 
+1

你需要搜索VITEM我覺得 –

回答

3

你需要尋找vItem,你需要檢查增加看看它是否在嘗試刪除它所在的列之前找到它。

Sub ArrayLoop() 
Dim ColumnsToRemove As Variant 
Dim vItem As Variant 
Dim A As Range 

ColumnsToRemove = Array("Header Text 1", "Header Text 2", "Header Text 3") 

For Each vItem In ColumnsToRemove 

    Set A = Rows(1).Find(What:=vItem, LookIn:=xlValues, _ 
          lookat:=xlPart) 

    Debug.Print vItem, Not A Is Nothing 

    If Not A Is Nothing Then A.EntireColumn.Delete 

Next 
End Sub 
+0

只是好奇,如果你知道有什麼好處或缺點,與數組,在使用'爲陣列中的每個x'而不是使用l-和ubound,在我的答案?或者它是一樣的嗎? – BruceWayne

+1

@BruceWayne - 不確定是否重要:我在這裏使用了'For Each',因爲這是OP使用的。編輯:你不能使用每個如果你想更新循環中的數組成員。儘管這裏不適用。 –

+0

感謝您更新數組的說明,是的,我想你自從OP以來就這麼做了。乾杯! – BruceWayne

1
Sub ArraybLoop() 
Dim ColumnsToRemove() As Variant 
Dim vItem As Variant 
Dim A As Range 
Dim i As Long 
Dim Sht As Worksheet 

Set Sht = ActiveWorkbook.Sheets("Sheet1") 

ColumnsToRemove = Array("Header Text 1", "Header Text 2", "Header Text 3") 


    For i = LBound(ColumnsToRemove) To UBound(ColumnsToRemove) Step 1 
     vItem = Application.Match(ColumnsToRemove(i), Sht.Rows(1), 0) 

     Debug.Print vItem 

     If IsNumeric(vItem) Then Sht.Columns(vItem).Delete 
    Next i 

End Sub 

Upper and Lower Bounds

Understanding Arrays

+1

我喜歡這個 - 使用Match匹配不需要檢查是否沒有匹配,對嗎?因爲'vItem'是數字的,你必須有一個匹配,對吧?聰明!我的方式是羅嗦一點:/ – BruceWayne

1

通過索引的一種方式,以循環是使用uboundlbound

Sub ArrayLoop() 
Dim ColumnsToRemove As Variant 
Dim vItem As Variant 
Dim A As Range 
Dim i As Long 

ColumnsToRemove = Array("Header Text 1", "Header Text 2", "Header Text 3") 


For i = LBound(ColumnsToRemove) To UBound(ColumnsToRemove) 
    Set A = Rows(1).Find(what:=ColumnsToRemove(i), LookIn:=xlValues, lookat:=xlPart) 
    Debug.Print ColumnsToRemove(i) ' not sure what `vItem` was intended to be 
If A Is Nothing Then 
    Debug.Print "Nothing found" 
ElseIf Not A Is Nothing Then 
    A.EntireColumn.Delete 
End If 
Next i 

End Sub 
+1

不錯,看起來像我們在同一時間發佈 – 0m3r