我有以下内容,由几个查询组成,我想按顺序运行它们,但当我到达最后一个查询时,它似乎无法删除(尽管单独的删除操作可以正常工作),有人能帮忙解决吗?
期望行为: 获取多个工作表上的数据 然后冻结第一行 然后将其格式化为表格 然后调整大小、居中并换行文本 然后搜索所有工作表并删除任何包含单词“completed”的行。
具体问题: 似乎没有执行最后一步(删除所有包含单词“completed”的行) 实际上,它在 rDelete.EntireRow.Delete 行上出错,声明“范围错误”
最短的重现代码: 我认为以下是最短的代码,除了仅保留最后一个宏之外,但我不确定这样做是否会在尝试重现结果时创建其他错误。
希望这符合Mat's Mug的下面评论,并符合最小、完整和可验证的示例要求。
期望行为: 获取多个工作表上的数据 然后冻结第一行 然后将其格式化为表格 然后调整大小、居中并换行文本 然后搜索所有工作表并删除任何包含单词“completed”的行。
具体问题: 似乎没有执行最后一步(删除所有包含单词“completed”的行) 实际上,它在 rDelete.EntireRow.Delete 行上出错,声明“范围错误”
最短的重现代码: 我认为以下是最短的代码,除了仅保留最后一个宏之外,但我不确定这样做是否会在尝试重现结果时创建其他错误。
希望这符合Mat's Mug的下面评论,并符合最小、完整和可验证的示例要求。
Sub TEST()
'
' Freeze_Panes Macro
'
' This one Freezes Row 1 (under Header)
Dim s As Worksheet
Dim c As Worksheet
' store current sheet
Set c = ActiveSheet
' Stop flickering...
Application.ScreenUpdating = False
' Loop throught the sheets
For Each s In ActiveWorkbook.Worksheets
' Have to activate - SplitColumn and SplitRow are properties of ActiveSheet
s.Activate
With ActiveWindow
.SplitColumn = 0
.SplitRow = 1
' .SplitRow = 2 'Depending on if it has a header maybe?
.FreezePanes = True
End With
Next
' Back to original sheet
c.Activate
Application.ScreenUpdating = True
Set s = Nothing
Set c = Nothing
Call Format_As_Table
End Sub
Private Sub Format_As_Table()
'
' Format_As_Table Macro
'
' Declaration
Dim Tbl As ListObject
Dim Rng As Range
Dim sh As Worksheet
Application.ScreenUpdating = False
' Loop Through All Sheets and Format All Data as Table, then Orient as Landscape
For Each sh In ActiveWorkbook.Sheets
With sh
Set Rng = .Range(.Range("A1"), .Range("A1").SpecialCells(xlLastCell))
Set Tbl = .ListObjects.Add(xlSrcRange, Rng, , xlYes)
Tbl.TableStyle = "TableStyleMedium15"
.PageSetup.Orientation = xlLandscape
End With
Next sh
Application.ScreenUpdating = False
Call Resize_Columns_And_Rows_No_Header
End Sub
Private Sub Resize_Columns_And_Rows_No_Header()
'
'Resize_Columns_And_Rows Macro
'
'Declaration
Dim wkSt As String
Dim wkBk As Worksheet
Dim temp As Variant
Dim lastCol As Long
wkSt = ActiveSheet.Name
' This Loops Through All Sheets
For Each wkBk In ActiveWorkbook.Worksheets
On Error Resume Next
wkBk.Activate
lastCol = wkBk.Cells(1, Columns.Count).End(xlToLeft).Column
'This is only needed if you are wrapping the text
wkBk.Rows.WrapText = True
'This is to center align all rows
'wkBk.Rows.VerticalAlignment = xlCenter
wkBk.Rows.HorizontalAlignment = xlCenter
'Resize Columns due to size
wkBk.Columns("F:F").ColumnWidth = 50
wkBk.Columns("G:G").ColumnWidth = 50
' Resize Rows
wkBk.Rows.EntireRow.AutoFit
' Resize Columns
wkBk.Columns.EntireColumn.AutoFit
Next wkBk
Sheets(wkSt).Select
Call TestDeleteRows
End Sub
Private Sub TestDeleteRows()
Dim rFind As Range
Dim rDelete As Range
Dim strSearch As String
Dim sFirstAddress As String
Dim sh As Worksheet
strSearch = "Completed"
Set rDelete = Nothing
Application.ScreenUpdating = False
For Each sh In ActiveWorkbook.Sheets
With sh.Columns("A:AO")
Set rFind = .Find(strSearch, LookIn:=xlValues, LookAt:=xlPart, SearchDirection:=xlNext, MatchCase:=False)
If Not rFind Is Nothing Then
sFirstAddress = rFind.Address
Do
If rDelete Is Nothing Then
Set rDelete = rFind
Else
Set rDelete = Application.Union(rDelete, rFind)
End If
Set rFind = .FindNext(rFind)
Loop While Not rFind Is Nothing And rFind.Address <> sFirstAddress
rDelete.EntireRow.Delete
Set rDelete = Nothing
End If
End With
Next sh
Application.ScreenUpdating = False
End Sub