概括。如果在指定的列中找到特定的子字串,我正在嘗試遍歷表并洗掉每一行。我特別卡在找到目標文本的代碼行上,我知道這是不正確的,但找不到我想要實作的正確語法:If tbl.DataBodyRange(rw, 10).Find(myString )
我搜索了許多網站和 YouTube 視頻,其中有一些可以找到確切的值,但我找不到像我要解決的問題那樣的問題。
我的代碼:
Sub removeTax()
Dim tbl As ListObject
Set tbl = ThisWorkbook.Sheets("Master").ListObjects("tblMaster")
Dim myString As String
myString = "Tax"
Dim rw
For rw = tbl.DataBodyRange.Rows.Count To 1 Step -1
If tbl.DataBodyRange(rw, 10).Find(myString) Then
tbl.ListRows.Delete
End If
Next
End Sub
非常感謝您提供的任何幫助。
uj5u.com熱心網友回復:
洗掉 Excel 表的條件行 ( ListObject)
- 作為替代方案,這使用了一種使用
AutoFilterand的方法SpecialCells。
用法
Sub RemoveTax()
Const CritColumn As Long = 10
Const CritString As String = "*Tax*" ' contains
Dim tbl As ListObject
Set tbl = ThisWorkbook.Worksheets("Master").ListObjects("tblMaster")
DeleteTableCriteriaRows tbl, CritColumn, CritString
End Sub
方法
Sub DeleteTableCriteriaRows( _
ByVal Table As ListObject, _
ByVal CriteriaColumn As String, _
ByVal CriteriaString As String)
With Table
If .ShowAutoFilter Then
If .AutoFilter.FilterMode Then .AutoFilter.ShowAllData
Else
.ShowAutoFilter = True
End If
.Range.AutoFilter CriteriaColumn, CriteriaString
Dim rg As Range
On Error Resume Next
Set rg = .DataBodyRange.SpecialCells(xlCellTypeVisible)
On Error GoTo 0
.AutoFilter.ShowAllData
If Not rg Is Nothing Then rg.Delete xlShiftUp
End With
End Sub
uj5u.com熱心網友回復:
我已經更正了您的方法,它檢查 myString 是否是第 10 列中值的子字串
With tbl.DataBodyRange.Columns(10)
For rw = .Rows.Count To 1 Step -1
If InStr(1, .Cells(rw).Value2, myString) > 0 Then
tbl.ListRows(rw).Delete
End If
Next rw
End With
請記住,在對其進行任何操作之前,您應該檢查 if tbl.DataBodyRangeis not ,因為洗掉表的所有行都等于NothingDataBodyRangeNothing
我決定做一個更有效的解決方案,更符合我的喜好
Sub RemoveTaxQuicker()
Const myString = "Tax"
Dim tbl As ListObject
Set tbl = ThisWorkbook.Sheets("Master").ListObjects("tblMaster")
If tbl.DataBodyRange Is Nothing Then: Exit Sub
Dim rowsRangeString As String
Dim i As Long
Dim C10 As Variant
C10 = tbl.DataBodyRange.Columns(10).Value2
Dim rng As Range
If IsArray(C10) Then
Set rng = Nothing
For i = LBound(C10) To UBound(C10)
If InStr(1, C10(i, 1), myString) > 0 Then
If rng Is Nothing Then
Set rng = tbl.DataBodyRange.Cells(i, 1)
Else
Set rng = Union(rng, tbl.DataBodyRange.Cells(i, 1))
End If
End If
Next i
If Not rng Is Nothing Then
rng.Delete xlUp
End If
ElseIf InStr(1, C10, myString) > 0 Then
tbl.ListRows(1).Delete
End If
End Sub
您應該使用@VBasic2008 方法,我已經在 500k 行上對其進行了測驗,大約需要 10 秒左右。而且我也必須測驗我的(痛苦的長),花了大約 5 分鐘。:)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/515444.html
標籤:擅长vba
上一篇:谷歌表格:從文本中決議日期
