2013-02-03 93 views
0

Sooo,我有一個很好的小程序,它可以刪除表中的所有行,但只有一行。VBA子程序在第二次運行時返回錯誤

Sub ClearFormTableRows(sourceRange, countRange) 
Dim rowsCount As Integer, rowRangeName As Object 
rowsCount = Application.WorksheetFunction.CountA(countRange) 
With sourceRange 

    Do Until rowsCount = 1 

     .ListObject.ListRows(2).Delete 
     rowsCount = rowsCount - 1 
     If rowsCount = 1 Then Exit Do 
    Loop 

End With 
End Sub 

直到今天它工作。但是在調用它的主例程中,我添加了另一個調用,對於不同的表格使用相同的語法,現在它不會執行任何操作,會導致錯誤9子例程超出範圍。 它突出顯示的是這一個:.ListObject.ListRows(2).Delete
但是,如果我註釋掉任何一個調用,哪個都沒關係,它會在該表上正確執行。但要求它既做,也不做。

我在做什麼錯了?

+1

P所有相關的代碼。 –

+0

你的意思是「下標超出範圍」?最有可能的是,excel抱怨你的列表對象沒有第二行,所以你如何分配你的'rowsCount'變量有一個問題。 –

回答

1

試試這種方法:我刪除了rowRangeName object,因爲它在您的問題中沒有用於給定的片段。

Sub ClearFormTableRows(ByRef sourceRange as Range, ByRef countRange As Range) 
    Dim rowsCount As Integer 
    Dim objListObj As ListObject 
    Dim objListRows As ListRows 

    Set objListObj = sourceRange.ListObjects(1) 
    Set objListRows = objListObj.ListRows 
    rowsCount = Application.WorksheetFunction.CountA(countRange) 

    While rowsCount > 1 
    '-- just a re-confirmation, you can remove first if condition if you want. 
    If (rowsCount > 1) And (rowsCount < objListRows.Count - 1) Then 
     objListRows(rowsCount).Delete 
     rowsCount = rowsCount - 1 
    End If 
    Wend 
    End Sub 

參考:

PS:可能沒有關係,但請要麼ByRefByVal顯式聲明參數:

Sub ClearFormTableRows(ByRef sourceRange As Range, ByRef countRange As Range) :)

+0

這很好,謝謝你的幫助。特別感謝這些鏈接,以便我能夠理解發生了什麼。 – SpeedCrazy

+0

很高興你的工作':D' – bonCodigo

相關問題