VBA: выполнение кода на выбранной вкладке Excel и последовательно на всех вкладках справа - PullRequest
0 голосов
/ 19 января 2019

Я установил макрос VBA, который последовательно выполняет операцию VBA в каждой электронной таблице данного файла Excel.Учитывая, что в файле много листов, что иногда приводит к перебоям с сервером, мне приходится время от времени перезапускать запрос.

Итак, возникает вопрос: я пытаюсь изменить кодэлемент ниже таким образом, что макрос VBA начинает работать на выбранном в настоящее время листе / вкладке.Затем он последовательно охватывает все оставшиеся листы / вкладки справа от активного листа, но не те, которые слева уже заполнены.

Приведенный ниже код перезапускает каждый прогон макроса с самого первоголист / вкладка файла, который не нужен.Есть какой-нибудь умный твик к коду?

  Dim xsheet As Worksheet
  For Each xsheet In ThisWorkbook.Worksheets
  xsheet.Select

Ответы [ 3 ]

0 голосов
/ 19 января 2019

Вы можете сделать это таким образом, но имейте в виду, что, как правило, не рекомендуется размещать код на активном листе или активных ячейках, так как они могут быть легко изменены и ваш код может работать некорректно.

Лучший метод будетхранить (кодировать) имена листов, обработанных в другом месте, и проходить по ним, исключая эти имена.

Sub x()

Dim i As Long

For i = ActiveSheet.Index To Worksheets.Count
    MsgBox Worksheets(i).Name
Next i

End Sub
0 голосов
/ 20 января 2019

Существует три коллекции листов: Worksheets, Charts и DialogSheets.Свойство Index этих коллекций возвращает индекс коллекции Sheets, а не фактический индекс в коллекции для конкретных листов.

Скажем, у вас есть четыре листа:

  1. Рабочий лист(«Лист1»)
  2. Рабочий лист («Лист2»)
  3. Диаграмма («Диаграмма1»)
  4. Рабочий лист («Лист3»).

В этом случае Worksheets("Sheet3").Index возвращает 4, когда реальный индекс равен 3.Нижняя строка никогда не полагается на Index свойство коллекции, относящейся к листу, когда дело доходит до обработки всех листов.

Чтобы решить вашу проблему, вам просто нужно использовать Sheets collection:

Sub FFF()
    Dim x%, sheet As Variant
    For x = ActiveSheet.Index + 1 To Sheets.Count
        Set sheet = Sheets(x)
        '// Do something with sheet
    Next
End Sub
0 голосов
/ 19 января 2019

Продолжить через рабочие листы

Если вы хотите продолжить с ActiveSheet, просто удалите «+ 1».

Предупреждение : эти коды действительны, если у вас только есть рабочих листов в рабочей книге, а не диаграммы, диалоговые окна или что-либо еще.
Я почти всегда использую только рабочие листы в своих книгах, поэтому я никогда не узнал о проблеме Index , на которую JohnyL ссылается в на его ответ на этот вопрос .

Идея

Sub ContinueThroughWorksheets()
    Dim i As Long
    With ThisWorkbook
        For i = .ActiveSheet.Index + 1 To .Worksheets.Count
            Debug.Print .Worksheets(i).Name
        Next
    End With
End Sub

Реализация

Sub ContinueThroughWorksheets2()
    Dim i As Long
    Dim j As Long
    With ThisWorkbook
       Select Case .ActiveSheet.Index
           Case 1
               j = 1
           Case .Worksheets.Count
               Exit Sub
           Case Else
               j = .ActiveSheet.Index + 1
       End Select
       For i = j To .Worksheets.Count
          Debug.Print .Worksheets(i).Name
       Next
    End With
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...