2016-04-23 97 views
1

我想知道为什么我的代码不起作用,当我使用一个变量从表中删除给定的行时,如果我工作正常,如果我把数字放在括号中。代码没有做任何特别的事情。它经历一个周期并找到我想要删除的行,然后返回它的编号。为什么使用变量删除listrows不起作用?

还有就是我有问题行: Inventory.ListRows(Talalat).Delete“,其中库存是一个的ListObject和Talalat是龙

我肯定得到了我想要删除的行代码正确的号码,并运行良好,没有错误消息,但它只是没有做到。但是当我手动将数字插入代码时,它的工作原理很好......任何想法?

PS:如果您想查看整个代码,请查看下面的代码。

Private Sub CommandButton17_Click() 
Dim CounterA As Long 
Dim Talalat As Long 
Dim ANsWR As Integer 
Set invent = Sheets("CORE").ListObjects("Inventory") 
If Not ComboBox4.Value = "" And Not ComboBox4.Value = "<Új tárgy>" Then 
    Talalat = 0 
     For CounterA = 1 To invent.Range.Rows.Count 
      If ComboBox4.Value = invent.Range.Cells(CounterA, 1) Then Talalat = CounterA 
     Next 
     If Talalat > 0 Then 
      ANsWR = MsgBox("Biztosan törli a(z) " & invent.Range.Cells(Talalat, 1) & Chr(13) & "nevű tárgyat az adatbázisból?", vbYesNo, "Tuti?") 
      If ANsWR = vbNo Then 
       Exit Sub 
      Else 
       Sheets("CORE").Unprotect 
       invent.ListRows(Talalat).Delete 'Where the glitch is 
      End If 
     End If 
End If 
End Sub 

回答

1

您是否确定您正在为要删除的行获取正确的编号?尝试添加“-1”后:

If ComboBox4.Value = invent.Range.Cells(CounterA, 1) Then Talalat = CounterA 
+0

我应该坐下的F ***下来休息时,我累了。这是问题所在。非常感谢! 我检查过程前后的listrows数量,发现它减少了,所以肯定有一行被删除。 再次感谢! – Goston

1

您的表中有一个标题?假设答案是“是”,下面解释了为什么你应该使用.DataBodyRange而不是.Range

下面是一些测试代码,类似于你...

Sub myTest() 
Dim iLoop As Long 
Dim theRow As Long 
Dim userAns As Integer 
Dim myList As ListObject 
    Set myList = Sheets("Sheet5").ListObjects("Table1") 
    theRow = 0 
    For iLoop = 1 To myList.Range.Rows.Count 
     If IsDate(myList.Range.Cells(iLoop, 1)) And myList.Range.Cells(iLoop, 1) > Now() Then 
      theRow = iLoop 
      Exit For 
     End If 
    Next iLoop 

    If theRow > 0 Then 
     userAns = MsgBox("Found " & myList.Range.Cells(theRow, 1) & " on Row " & theRow & ". Should I delete?", vbYesNo) 
     If userAns = vbNo Then 
      Exit Sub 
     Else 
      myList.ListRows(theRow).Delete 
     End If 
    End If 
End Sub 

运行针对下面的表这种代码,头似乎提供正确的号码。说“是”的对话框时,A列中第一个日期是大于现在是行18

enter image description here

然而,我们看到它实际上删除行19

enter image description here

以下代码相同,但所有myList.Range实例已更改为myList.DataBodyRange。此外,IsDate(myList.DataBodyRange.Cells(iLoop, 1))被删除,因为环路将不检查头了...

Sub myTest() 
Dim iLoop As Long 
Dim theRow As Long 
Dim userAns As Integer 
Dim myList As ListObject 
    Set myList = Sheets("Sheet5").ListObjects("Table1") 
    theRow = 0 
    For iLoop = 1 To myList.DataBodyRange.Rows.Count 
     If IsDate(myList.DataBodyRange.Cells(iLoop, 1)) And myList.DataBodyRange.Cells(iLoop, 1) > Now() Then 
      theRow = iLoop 
      Exit For 
     End If 
    Next iLoop 

    If theRow > 0 Then 
     userAns = MsgBox("Found " & myList.DataBodyRange.Cells(theRow, 1) & " on Row " & theRow & ". Should I delete?", vbYesNo) 
     If userAns = vbNo Then 
      Exit Sub 
     Else 
      myList.ListRows(theRow).Delete 
     End If 
    End If 
End Sub 

当它被用来对付同一个表,它说,第一数据之后,现在是列17这是第17行的数据,不包括标题。

enter image description here

当您单击Yes,然后正确的行被删除...

​​

+0

谢谢您的详细信息!它使得了解问题变得容易多了! – Goston

0

我们鼓励的问​​题删除ListRows设为,当有对的ListObject定义自动筛选。 我们能够通过删除行之前去除过滤器来解决这个问题:

myList.AutoFilter.ShowAllData 
myList.ListRows(theRow).Delete