【问题标题】:Run script on all sheets excel在所有工作表上运行脚本 excel
【发布时间】:2023-03-23 00:18:01
【问题描述】:

我有这个脚本,它搜索一个定义的字符串,如果找到它就删除该列。我想在工作簿中的所有工作表上运行相同的搜索。到目前为止,我已经尝试过这样设置。但它只会在 Active Sheet 上运行。

Sub RunMacroOnAllSheetsToRight()
For i = ActiveSheet.Index To Sheets.Count
    Call MyFunction(i)
Next i
End Sub


Function MyFunction(i)
Dim c As Range
            Dim str As String

            str = "SearchStringHere"

            For Each c In ActiveSheet.UsedRange
               If InStr(c.Value, str) > 0 Then
               c.EntireColumn.Delete Shift:=xlToLeft
               End If
            Next c

End Function

脚本现在循环执行,但出于某种原因仅删除单个列。需要能够匹配和删除每个工作表的多个列。

【问题讨论】:

标签: vba excel


【解决方案1】:

你只需要在你的“函数”中更改ActiveSheet,它会更好!

顺便说一句:您可以有一个带有参数的 Sub(如下所示),并且仅当您有输出结果(您的示例中没有)时才需要一个函数。

2 主要变化: - 添加 Set Ws=Nothing 以释放 Ws - 改变了通过列的增量,因为当删除一个越来越多的列时,你错过了分析下一个列(j+1),现在是列(j)

Sub RunMacroOnAllSheetsToRight()
Application.ScreenUpdating = False
For i = ActiveSheet.Index To Sheets.Count
    Column_Delete i, "SearchStringHere"
Next i
Application.ScreenUpdating = True
End Sub


Sub Column_Delete(ByVal Sheets_Index As Integer, ByVal Str_to_Find As String)

Dim Ws As Worksheet
Set Ws = Worksheets(Sheets_Index)


Dim EndColumn As Integer
EndColumn = Ws.Cells(1, Columns.Count).End(xlToLeft).Column

'descending travel of the columns as we are going to delete some of them
For j = 1 To EndColumn
    If InStr(Ws.Cells(1, EndColumn - j + 1), Str_to_Find) > 0 Then
        Ws.Columns(EndColumn - j + 1).EntireColumn.Delete Shift:=xlToLeft
    End If
Next j

'Don't forget to free Ws (like I did...)
Set Ws = Nothing

End Sub

【讨论】:

  • 这很好用,但只会从每张纸上删除 1 列。如果标识的列多次出现,则必须重新运行脚本。这可以纠正吗?
  • 添加一个布尔值来设置和重置动作的可能性可能会起作用,你需要帮助吗?
  • 拜托!我现在正在学习。或者,我可以通过添加多个搜索字符串来做到这一点。哪个更容易。
  • 我会在不到 24 小时内完成修改,抱歉耽搁了
  • 非常感谢!我可能会尝试用另一个宏循环多次。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多