2016-04-23 168 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 
相關問題