【问题标题】:running a macro across all opened Excel files在所有打开的 Excel 文件中运行宏
【发布时间】:2020-09-02 10:06:46
【问题描述】:

刚接触 VBA 代码,想弄清楚为什么我的代码不起作用。 我想在所有打开的 Excel 文件中运行一个宏。 一次处理一个文件的宏是:

```
Sub DeleteRow()
Dim R As Range, cellsToDel As String
'looking for cells that contain the word '1. Staff Home'
Set R = ActiveSheet.Range("A:A").Find("1. Staff Home", LookIn:=xlValues)
'if found
Do While Not R Is Nothing
'get cells address to be deleted
cellsToDel = "A1" & ":K" & R.Row - 1
'delete the cells
ActiveSheet.Range(cellsToDel).Delete xlShiftUp
'looking for cells that contain the word '1. Staff Home' again
Set R = ActiveSheet.Range("A:K").Find("1. Staff Home", LookIn:=xlValues)
Loop
End Sub

Sub Unwrap_Text()
'unwrap text in all cells'
ActiveSheet.Range("A:K").WrapText = False
End Sub

但是当我尝试将它包装在一个宏中以在所有打开的工作簿上运行时它不起作用:

```
Sub DoAll()
Dim wb As Workbook
For Each wb In Application.Workbooks
Dim R As Range, cellsToDel As String
'looking for cells that contain the word '1. Staff Home'
Set R = ActiveSheet.Range("A:A").Find("1. Staff Home", LookIn:=xlValues)
'if found
Do While Not R Is Nothing
'get cells address to be deleted
cellsToDel = "A1" & ":K" & R.Row - 1
'delete the cells
ActiveSheet.Range(cellsToDel).Delete xlShiftUp
'looking for cells that contain the word '1. Staff Home' again
Set R = ActiveSheet.Range("A:K").Find("1. Staff Home", LookIn:=xlValues)
Loop
Next wb
End Sub
```

我已经看到可以在目录中的 Excel 文件上运行的宏示例,但是我目录中的文件是我在 Excel 中打开的 .html 文件,并且想要删除一堆导航链接行与我的需求无关。

【问题讨论】:

  • @BigBen 感谢您的回复,这不正是 For Each 正在做的事情吗?
  • 您的 Excel 文件是否只有一个选项卡?
  • @TimWilliams 是的
  • 恕我直言,编写在所有打开的 Excel 文件上运行的代码是很危险的。如果您打开的文件比您想象的要多怎么办?
  • 这应该不是问题@teylyn,因为我将在 Excel 中手动打开 html 文件,所以我会知道打开了什么。

标签: excel vba


【解决方案1】:

如果只有一张:

Sub DoAll()
    
    Dim wb As Workbook, ws As Worksheet
    Dim R As Range, cellsToDel As String
    
    For Each wb In Application.Workbooks
        Set ws = wb.Sheets(1)
        Set R = ws.Range("A:A").Find("1. Staff Home", LookIn:=xlValues)
        Do While Not R Is Nothing
            ws.Range("A1:K" & (R.Row - 1)).Delete xlShiftUp
            Set R = ws.Range("A:K").Find("1. Staff Home", LookIn:=xlValues) 'A:A ?
        Loop
    Next wb
    
End Sub

请注意,您发布的两条Find() 行正在查看不同的范围。这是故意的吗?

【讨论】:

  • 感谢蒂姆,但这会返回 438 错误。是的,那个 Set R 应该是 ws.Range("A:A")
  • 错误在哪一行?
  • 抱歉,它没有返回行号。它只是说:运行时错误438:对象不支持此属性或方法
  • 我的错字 - 有 wb.Range 而不是 ws.Range