Выполнить функцию для каждой открытой рабочей книги - PullRequest
0 голосов
/ 08 мая 2019

Я создаю пустую рабочую книгу с командной кнопкой, которую я хочу, чтобы при нажатии она выполняла действия с КАЖДОЙ открытой книгой, открытой в данный момент (так как у меня будут другие непустые книги, для которых я хочу, чтобы она выполняла операции над ).

Я получаю сообщение об ошибке вне диапазона при запуске:

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.», Поэтому лучше сначала проверить, есть ли у активированной рабочей книги имя этого листа, в противном случае перейдите к следующей рабочей книге. ? Спасибо!

UPDATE

Это было то, что сработало для меня, но другие ответы тоже сработали бы. Спасибо всем!

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

Ответы [ 2 ]

2 голосов
/ 08 мая 2019

Вам необходимо полностью квалифицировать все ваши ссылки. Вы также можете поставить галочку, чтобы пропустить пустую книгу (см. Мои комментарии в этом обновленном коде):

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 голос
/ 08 мая 2019

Я хотел напечатать комментарий, но он получился довольно длинным.

  1. Вы получите сообщение об ошибке, если имя листа «FIRE EXT». (с точкой) не существует в рабочей книге, с которой вы работаете. Вы зацикливаете ВСЕ рабочие книги, если у вас есть такая, у которой нет этого листа, она выдаст ошибку.
  2. Лучше придерживаться Sheets при использовании имени листа и Worksheets при использовании номера листа. Sheets("SheetName") против Worksheets(1)
  3. Избегайте использования Активировать / Выбрать, используя назначенную переменную книги, в вашем коде это "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"
    .........
    
...