热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

使用excelVBA激活工作表

如何解决《使用excelVBA激活工作表》经验,为你挑选了1个好方法。

我在文件夹中有一个"工作簿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_nameWorksheet_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


推荐阅读
author-avatar
mobiledu2502917073
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有