为每个打开的工作簿执行函数
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
.......................
我想输入评论,但评论太长了。
- 如果您正在使用的工作簿中不存在 Sheet 名称 "FIRE EXT."(带句点),您将收到错误消息。您正在循环所有工作簿,如果您有一个没有 sheet 的工作簿,它将出错。
- 在使用 Sheet 名称时最好坚持使用
Sheets
,在使用 Sheet 号码时最好坚持使用 Worksheets
。 Sheets("SheetName")
对比 Worksheets(1)
通过使用分配的工作簿变量避免使用 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"
.........
我正在创建一个带有命令按钮的空白工作簿,单击该按钮后,我希望它对当前打开的每个打开的工作簿执行操作(因为我将有其他非空白的工作簿,我希望它执行操作)。
当我 运行:
时出现下标超出范围错误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
.......................
我想输入评论,但评论太长了。
- 如果您正在使用的工作簿中不存在 Sheet 名称 "FIRE EXT."(带句点),您将收到错误消息。您正在循环所有工作簿,如果您有一个没有 sheet 的工作簿,它将出错。
- 在使用 Sheet 名称时最好坚持使用
Sheets
,在使用 Sheet 号码时最好坚持使用Worksheets
。Sheets("SheetName")
对比Worksheets(1)
通过使用分配的工作簿变量避免使用 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" .........