使用Excel VBA激活工作表

我在文件夹中有一个“Workbook A”文件。 每两周发送一次更新的版本给我。 我想从另一个工作簿“工作簿B”打开此工作簿,同时删除“工作簿A”中的空白行。

打开和删除操作将通过使用macros来进行。

这是迄今为止我的代码。

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作为其名称的一部分,后跟一个date。 例如Worksheet_A 11-2-15

在我的代码中,我已经将variablessheet_name分配给Worksheet_A

 sheet_name = "Worksheet_A" 

并进一步下降,我用过

 .Sheets(sheet_name).Activate 

激活工作表。 我觉得下面有一个问题:

 sheet_name = "Worksheet_A" 

由于sheet_name不完全是Worksheet_A,因此它只包含Worksheet_A作为其名称的一部分。

这是造成问题。工作簿A打开,但删除空行不会发生。
进一步显示错误消息。

运行时错误9:下标超出范围。

如何修改我的代码,以便工作表被激活并执行macros操作?

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很有趣,讨论了如何避免select/激活/活动来进一步改进您的编码。 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 

工作表是.select,工作簿是.activate。

尝试

 .Sheets(sheet_name).Select 

而不是一次删除一行,我会build议你build立一个string或范围,只是在最后做一个批量删除。 下面是一个例子,让你在路上:

 Sub delete_rows() Dim MyRows As String For i = 27 To 1 Step -1 If WorksheetFunction.CountA(ActiveSheet.Rows(i)) = 0 Then MyRows = MyRows & "$" & i & ":$" & i & "," 'wb.ActiveSheet.Rows(i).EntireRow.Delete End If Next i MyRows = Left(MyRows, Len(MyRows) - 1) Range(MyRows).Delete End Sub