gpt4 book ai didi

excel - 使用 Excel VBA 激活工作表

转载 作者:行者123 更新时间:2023-12-02 09:28:54 24 4
gpt4 key购买 nike

我的文件夹中有一个文件“工作簿 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 打开,但未删除空白行。
此外,还会显示错误消息。

Run Time Error 9: Subscript out of Range.

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

最佳答案

是否可以通过使用 Like 或 Contain 语句来解决此问题?
从你的评论来看,是的。打开工作簿后,像这样迭代工作表集合:

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

关于excel - 使用 Excel VBA 激活工作表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28666999/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com