2013-02-03 77 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

相关问题