使用excel VBA激活工作表

时间:2015-02-23 04:39:55

标签: excel vba excel-vba excel-2013

我在文件夹中有一个“工作簿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:下标超出范围。

如何修改代码以激活工作表并执行宏操作?

2 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:3)

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

尝试

.Sheets(sheet_name).Select

我不会一次删除一行,而是建议您构建一个字符串或范围,最后只进行一次批量删除。以下是一个让您顺利前往的示例:

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