作者:mobiledu2502917073 | 来源:互联网 | 2023-05-20 19:30
我在文件夹中有一个"工作簿A"文件.每两周都会向我发送一个更新版本.我想从另一个工作簿"工作簿B"打开此工作簿,同时删除"工作簿A"中的空白行.
打开和删除操作将通过使用宏发生.
到目前为止,这是我的代码.
Sub RemoveEmptyRows()
' this macro will remove all rows that contain no data
' ive named 2 variables of data type string
Dim file_name As String
Dim sheet_name As String
file_name = "C:\Users\Desktop\Workstation_A\Workbook_A.xlsm"
'Change to whatever file i want
sheet_name = "Worksheet_A" 'Change to whatever sheet i want
' variables "i" and "LastRow" are needed for the for loop
Dim i As Long
Dim LastRow As Long
' we set wb as a new work book since we have to open it
Dim wb As New Workbook
' To open and activate workbook
' it opens and activates the workbook_A and activates the worksheet_A
Set wb = Application.Workbooks.Open(file_name)
wb.Sheets(sheet_name).Activate
' (xlCellTypeLastCell).Row is used to find the last cell of the last row
' i have also turned off screen updating
LastRow = wb.ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Row
Application.ScreenUpdating = False
' here i am using a step
' the step is negative
' therefore i start from the last row and go to the 1st in steps of 1
For i = LastRow To 1 Step -1
' Count A - Counts the number of cells that are not empty and the
' values within the list of arguments (wb..ActiveSheet.Rows(i))
' Afterwards deleting the rows that are totally blank
If WorksheetFunction.CountA(wb.ActiveSheet.Rows(i)) = 0 Then
wb.ActiveSheet.Rows(i).EntireRow.Delete
End If
Next i
' used to update screen
Application.ScreenUpdating = True
End Sub
工作表名称包含Worksheet_A
其名称的一部分,后跟日期.例如Worksheet_A 11-2-15
.
在我的代码中,我已将变量赋值sheet_name
给Worksheet_A
sheet_name = "Worksheet_A"
我已经习惯了
.Sheets(sheet_name).Activate
激活工作表.我觉得下面有一个问题:
sheet_name = "Worksheet_A"
因为sheet_name
不完全是Worksheet_A它只包含Worksheet_A作为其名称的一部分.
这会导致问题.工作簿A打开但不会删除空白行.
此外,还会显示错误消息.
运行时错误9:下标超出范围.
如何修改我的代码以便激活工作表并执行宏操作?
1> L42..:
is it possible to solve this by using Like or Contain statements?
从您的评论中,是的.打开工作簿后,迭代工作表集合,如下所示:
Dim sh As Worksheet
For Each sh In wb.Sheets
If InStr(sh.Name, "WorkSheet_A") <> 0 Then
sheet_Name = sh.Name: Exit For
End If
Next
或者您可以抓住该对象并直接在其上工作.
Dim sh As Worksheet, mysh As Worksheet
For Each sh In wb.Sheets
If InStr(sh.Name, "WorkSheet_A") <> 0 Then
Set mysh = sh: Exit For
End If
Next
LastRow = mysh.Cells.SpecialCells(xlCellTypeLastCell).Row
'~~> rest of your code here
如果您只有一(1)个工作表,则可以通过索引访问它.
Set mysh = wb.Sheets(1)
您可能会发现此POST很有趣,它讨论了如何避免选择/激活/激活以进一步改进您的编码.HTH.
这是您量身定制的代码:
Sub RemoveEmptyRows()
Dim file_name As String
file_name = "C:\Users\Desktop\Workstation_A\Workbook_A.xlsm"
Dim i As Long
Dim LastRow As Long
Dim wb As Workbook, mysh As Worksheet
Set wb = Application.Workbooks.Open(file_name)
'Above code is same as yours
Set mysh = wb.Sheets(1) 'if only one sheet, use loop otherwise
Application.ScreenUpdating = False
Dim rngtodelete As Range
With mysh
LastRow = .Cells.SpecialCells(xlCellTypeLastCell).Row
'Collect all the range for deletion first
For i = LastRow To 1 Step -1
If WorksheetFunction.CountA(.Rows(i)) = 0 Then
If rngtodelete Is Nothing Then
Set rngtodelete = .Rows(i)
Else
Set rngtodelete = Union(rngtodelete, .Rows(i))
End If
End If
Next i
End With
'Delete in one go
If Not rngtodelete Is Nothing Then rngtodelete.Delete xlUp
Application.ScreenUpdating = True
End Sub