为每个打开的工作簿执行函数

Perform Function for Every Open Workbook

我正在创建一个带有命令按钮的空白工作簿,单击该按钮后,我希望它对当前打开的每个打开的工作簿执行操作(因为我将有其他非空白的工作簿,我希望它执行操作)。

当我 运行:

时出现下标超出范围错误
Sub Button1_Click()
'
' Button1_Click Macro
' Fire Ext. Comments
'
'
Dim w As Workbook

' For every open workbook...
For Each w In Application.Workbooks

    ' Activate the current workbook
    w.Activate

    ' Find the comments column (K12 should be the "Comments" column)
    If Worksheets("FIRE EXT.").Range("K12").Value = "Comments" Then

        ' Then we loop through all cells in the specified range (anything below the header row)
        Dim rng As Range, cell As Range

        ' I'm using a range of 500 to look for values, so if a file has more than 500 rows, you'll have to look at it manually
        Set rng = Range("A1:A500")

        ' No loop to change all comments
        For Each cell In rng
.......................

...在“If Worksheets("FIRE EXT.").Range("K12").Value = "Comments" Then" 行。所以我认为它是从空白工作簿开始的,没有找到名为 "FIRE EXT." 的工作 sheet,所以如果激活的工作簿首先具有 sheet,那么首先测试的最佳做法是什么名称,否则转到下一个工作簿?谢谢!

更新

这是对我有用的方法,但其他响应也会起作用。谢谢大家!

Sub Button1_Click()
'
' Button1_Click Macro
' Fire Ext. Comments
'
'
Dim w As Workbook

' For every open workbook...
For Each w In Application.Workbooks

    ' Don't work on the current/blank workbook
    If w.FullName <> ThisWorkbook.FullName Then

    ' Find the comments column (K12 should be the "Comments" column)
    If w.Sheets("FIRE EXT.").Range("K12").Value = "Comments" Then

        ' Then we loop through all cells in the specified range (anything below the header row)
        Dim rng As Range, cell As Range

        ' I'm using a range of 500 to look for values, so if a file has more than 500 rows, you'll have to look at it manually
        Set rng = w.Worksheets("FIRE EXT.").Range("A13:A500")

        ' No loop to change all comments
        For Each cell In rng

您需要完全限定所有参考资料。您还可以检查以确保它跳过空白工作簿(请参阅我在此更新代码中的评论):

Sub Button1_Click()
'
' Button1_Click Macro
' Fire Ext. Comments
'
'
Dim w As Workbook

' For every open workbook...
For Each w In Application.Workbooks

    If w.FullName <> ThisWorkbook.FullName Then     '<-- TA: Add check to verify you're not working on the blank workbook

        'TA: I removed the .Activate line, that is never necessary.  Instead, fully qualify all your references

        ' Find the comments column (K12 should be the "Comments" column)
        If w.Worksheets("FIRE EXT.").Range("K12").Value = "Comments" Then   '<-- TA: Note that Worksheets is now qualified to w so that it is checking worksheets in the current w workbook

            ' Then we loop through all cells in the specified range (anything below the header row)
            Dim rng As Range, cell As Range

            ' I'm using a range of 500 to look for values, so if a file has more than 500 rows, you'll have to look at it manually
            Set rng = w.Worksheets("FIRE EXT.").Range("A1:A500")    '<-- TA: Note that Range is now qualified to w.Worksheets("FIRE EXT.") (if that isn't the correct sheet name, change this to the correct sheet name)

            ' Now loop to change all comments
            For Each cell In rng
.......................

我想输入评论,但评论太长了。

  1. 如果您正在使用的工作簿中不存在 Sheet 名称 "FIRE EXT."(带句点),您将收到错误消息。您正在循环所有工作簿,如果您有一个没有 sheet 的工作簿,它将出错。
  2. 在使用 Sheet 名称时最好坚持使用 Sheets,在使用 Sheet 号码时最好坚持使用 WorksheetsSheets("SheetName") 对比 Worksheets(1)
  3. 通过使用分配的工作簿变量避免使用 Activate/Select,在您的代码中,即 "w"

    Sub Button1_Click()
    Dim w As Workbook
    
    ' For every open workbook...
    For Each w In Application.Workbooks
    
        ' Find the comments column (K12 should be the "Comments" column)
        If w.Sheets("FIRE EXT.").Range("K12").Value = "Comments" Then
    
            ' Then we loop through all cells in the specified range (anything below the header row)
            Dim rng As Range, cell As Range
    
            ' I'm using a range of 500 to look for values, so if a file has more than 500 rows, you'll have to look at it manually
            Set rng = w.Sheets("FIRE EXT.").Range("A1:A500")
    
            ' Now loop to change all comments
            For Each cell In rng
            ' Now here you dont use "w.Sheets("FIRE EXT.")" because it is already set on `rng'
            ' so you can just use `cell` like cell.value = "Blah"
    .........