为每个打开的工作簿执行功能

Posted

技术标签:

【中文标题】为每个打开的工作簿执行功能【英文标题】:Perform Function for Every Open Workbook 【发布时间】:2019-05-08 20:01:12 【问题描述】:

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

运行时出现下标超出范围错误:

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.”的工作表,所以首先测试激活的工作簿是否首先具有该工作表名称的最佳实践是什么,否则继续下一个工作簿?谢谢!

更新

这对我有用,但其他响应也可以。谢谢大家!

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

【问题讨论】:

Test or check if sheet exists的可能重复 不是你的答案,而是w.Activate,尝试使用With w,并使用. 表示法来支持资格。 与@BigBen 的链接相关,您可以使用简化的方法,例如If IsError(Evaluate("'Fire EXT.'!A1")) Then,然后再对您的工作簿执行操作 【参考方案1】:

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

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
.......................

【讨论】:

【参考方案2】:

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

    如果工作表名称为“FIRE EXT”,您将收到错误消息。 (带句点)在您正在使用的工作簿上不存在。您正在循环所有工作簿,如果您有一个没有该工作表的工作簿,则会出错。 最好在使用工作表名称时使用Sheets,在使用工作表编号时最好使用WorksheetsSheets("SheetName")Worksheets(1)

    通过在代码中使用分配的工作簿变量来避免使用激活/选择,即“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"
    .........
    

【讨论】:

以上是关于为每个打开的工作簿执行功能的主要内容,如果未能解决你的问题,请参考以下文章

EXCEL基础内容学习笔记Excel文档的基本组成与功能介绍

excel中如何批量把一个工作簿当中的每个工作表名称复制出来

从 VBA 打开工作簿并禁用 Workbook_Open() 代码?

我可以在打开的工作簿上编译 VBA 吗?

Excel VBA计数和存储所有打开的工作簿列表

excel工作簿出现“此工作簿包含一个或多个可能不安全的外部源的链接”,请问怎么取消这烦人的提示?