2016-04-14 4 views
1

Буду признателен за вашу помощь с макросом, который я пытаюсь создать.Looping через различные листы

У меня есть файл xls с кучей листов, некоторые из которых называются «1», «2», «3» и так далее. Я хотел бы создать макрос, который зацикливается только через эти «числовые» рабочие листы, следовательно, НЕ согласно индексу, как в приведенном ниже коде. (Лист «1» не является первым листом в книге). Перед циклом мне нужно определить диапазон ячеек и листы.

Ниже приведена моя (неправильная) попытка.

Sub Refresh() 

Dim i As Integer 
Dim rng As Range 
Set rng = Range("A10:TZ180") 

For i = 1 To 30 

    Sheets(i).Activate 
    rng.Select  
    rng.ClearContents 
    Application.Run macro:="xxx" 

Next i 

End Sub 
+0

Итак ... что ваш вопрос? – Taosique

+0

Ваша переменная 'rng' используется неправильно. После того, как вы назначили диапазон, он не изменяется только потому, что вы активируете другой лист. –

+0

Попытка использовать 'rng.select' после активации другого листа даст ошибку:« Невозможно выбрать метод класса Range ». Это связано с тем, что вы не можете выбрать диапазон на неактивном листе. Поэтому перед тем, как использовать это, вам необходимо назначить диапазон для каждого отдельного листа. Ваш 'Set rng = Range (" A10: TZ180 ")' должен быть после 'Таблицы (i) .Activate', после чего он установит диапазон на активный лист. –

ответ

5
dim w as worksheet 
for each w in activeworkbook.worksheets 
    if isnumeric(w.name) then 
    w.range("A10:TZ180").clearcontents 
    xxx() 
    end if 
next 
+0

Это определенно делает трюк. У меня было подобное решение, но я не думал использовать isNumeric - хорошо. –

+0

Спасибо за ваши данные. Это похоже не работает. Приложение (последняя строка в цикле) пробегает указанный диапазон. Я попытался отредактировать код, но он все еще не работает. Кроме того, я хотел бы определить диапазон и листы перед циклом. – korone

+0

@korone Вы не можете определить диапазон перед циклом, потому что хотите работать с диапазоном в каждом листе. Поэтому каждый лист имеет различный диапазон, хотя и имеет тот же адрес. –

0

Если макрос «ххх()» требует выбранного диапазона нужно просто добавить оператор выбора. (Заимствуя GSerg)

Dim w As Worksheet 
For Each w In ActiveWorkbook.Worksheets 
    If IsNumeric(w.Name) Then 
    w.Range("A10:TZ180").ClearContents 
    w.Range("A10:TZ180").Select 
    Application.Run macro:="xxx" 
    End If 
Next 

Чтобы очистить ваше недопонимание о назначении диапазона видим следующее:

Sub Refresh() 
    Dim ws As Worksheet 
    Dim rng As Range 
    Dim i As Integer 

    For Each ws In ActiveWorkbook.Worksheets 
     If IsNumeric(ws.Name) Then 

      'you must activate the worksheet before selecting a range on it 
      ws.Activate 

      'note the qualifier: ws.range() 
      Set rng = ws.Range("A10:TZ180") 

      'since the range is on the active sheet, we can select it 
      rng.Select 
      rng.ClearContents 
      Application.Run macro:="xxx" 
     End If 
    Next 

End Sub 

Sub test2() 
    Dim ws As Worksheet 
    Dim rg As Range 

    Dim arrSheets As Variant 
    arrSheets = Array("Sheet1", "Sheet2", "Sheet3") 

    Dim x As Long 
    For x = LBound(arrSheets) To UBound(arrSheets) 
     Set ws = Worksheets(arrSheets(x)) 
     ws.Activate 

     '... 

    Next 
End Sub 

Sub test3() 
    Dim ws As Worksheet 

    Dim x As Long 
    For x = 1 To 20 
     Set ws = Worksheets(CStr(x)) 
     ws.Activate 

     '... 

    Next 
End Sub 
+0

спасибо, код работает! Однако, как я уже сказал, я хотел бы предварительно определить список «числовых» листов, по которым я хочу запустить цикл (скажем, от 1 до 20, например). Поскольку код теперь, цикл будет работать по всем листам с номером-именем. – korone

0

попробовать этот

Sub main() 
Dim shtNames As Variant, shtName As Variant 

shtNames = Array(1, 2, 3, 4) '<== put your actual sheets "number name" 

For Each shtName In shtNames 
    With Worksheets(CStr(shtName)) 
     .Range("A10:TZ180").ClearContents 
     .Range("A10:TZ180").Select 
     Application.Run macro:="MacroToRun" 
    End With 
Next shtName 

End Sub 


Sub MacroToRun() 

MsgBox "hello from cells '" & Selection.Address & "' in sheet '" & ActiveCell.Parent.Name & "'" 
End Sub 
Смежные вопросы