Использование модулей для запуска всех листов в книге-VBA

Для проекта, над которым я работал, я, наконец, завершил код, используемый для анализа квартального графика, и теперь я пытаюсь проанализировать все четыре листа в книге (каждый лист представляет собой отдельный квартал).

Возникает ошибка «Ошибка времени выполнения 1004 диапазон метода object _global failed»

В настоящее время я использую модуль для запуска кода для всех четырех листов. Мой код выглядит следующим образом:

sub scheduleAnalyzer()

Dim ws_count As Integer
Dim I As Integer

ws_count = ActiveWorkbook.Worksheets.Count

For I = 1 To ws_count 

    'then my code which analyzes the schedule and prints results on a new sheet

Next I

End Sub

Я впервые использую модуль для запуска кода. Ошибка возникает в следующем месте:

Dim month1 As Range
Dim month2 As Range
Dim month3 As Range
Dim month1_start As String
Dim month1_end As String
Dim month2_start As String
Dim month2_end As String
Dim month3_start As String
Dim month3_end As String  

month1_start = "B6"
monthRow = 6
dayRow = 7

For k = 2 To maxCol
    If Cells(monthRow, k).Interior.color = colorArray(10) And Cells(monthRow, k + 1).Interior.color = colorArray(11) Then
        month1_end = Cells(monthRow, k).Address
        month2_start = Cells(monthRow, k + 1).Address
    ElseIf Cells(monthRow, k).Interior.color = colorArray(11) And Cells(monthRow, k + 1).Interior.color = colorArray(10) Then
        month2_end = Cells(monthRow, k).Address
        month3_start = Cells(monthRow, k + 1).Address
    ElseIf Cells(monthRow, k).Interior.color = colorArray(10) And Cells(monthRow, k + 1).Interior.color = colorArray(9) Then
        month3_end = Cells(monthRow, k).Address
    End If
Next k

month1 = Range(month1_start, month1_end) '<--------------- run-time error 1004 method range of object _global failed
month2 = Range(month2_start, month2_end)
month3 = Range(month3_start, month3_end)

Я знаю, что этот код работает, когда я просто бегу для одного конкретного листа. Это лучший способ запустить его через всю книгу? Если да, то как я могу исправить эту ошибку? Я попытался использовать оператор With с » ActiveWorkbook.Worksheets () » но я не могу назвать единственный ws, чтобы поставить в скобки, так как я хочу, чтобы он работал во всех четырех из них.

1 ответ

  1. Насколько я могу сказать, вы определенно получите ошибку из-за того, что не используете Setдля установки своих Rangeпеременных, но это будет ошибка «объектная переменная или с блочной переменной не задана».

    Метод «выбор объекта _global» ошибка Вы были вероятно, потому, что month1_end не были установлены, что может быть потому, что ваш код никогда не задает переменной maxCol (и, следовательно, ваш For k = цикл никогда не выполняется), или можно задать maxCol в коде, который не отвечал на ваш вопрос в этом случае month1_end , возможно, не были установлены правильно, так как это не обработка листа, который вам нужен.

    Следующий код должен, надеюсь, обойти некоторые из этих ошибок и дать вам структуру, на которой вы можете построить свой цикл:

    sub scheduleAnalyzer()
    
        Dim ws As Worksheet
        Dim month1 As Range
        Dim month2 As Range
        Dim month3 As Range
        Dim month1_start As String
        Dim month1_end As String
        Dim month2_start As String
        Dim month2_end As String
        Dim month3_start As String
        Dim month3_end As String  
        'monthRow is not defined in original code
        Dim monthRow As Long
        'dayRow is not defined in original code
        Dim dayRow As Long
        'k is not defined in original code
        Dim k As Long
        'maxCol isn't defined or assigned a value in original code
        Dim maxCol As Long
        maxCol = 36 ' <-- purely random number - please assign it how you were assigning it when code was working
    
        For Each ws in ActiveWorkbook.Worksheets
    
            With ws
    
                month1_start = "B6"
                monthRow = 6
                dayRow = 7
    
                For k = 2 To maxCol
                    If .Cells(monthRow, k).Interior.color = colorArray(10) And .Cells(monthRow, k + 1).Interior.color = colorArray(11) Then
                        month1_end = .Cells(monthRow, k).Address
                        month2_start = .Cells(monthRow, k + 1).Address
                    ElseIf .Cells(monthRow, k).Interior.color = colorArray(11) And .Cells(monthRow, k + 1).Interior.color = colorArray(10) Then
                        month2_end = .Cells(monthRow, k).Address
                        month3_start = .Cells(monthRow, k + 1).Address
                    ElseIf .Cells(monthRow, k).Interior.color = colorArray(10) And .Cells(monthRow, k + 1).Interior.color = colorArray(9) Then
                        month3_end = .Cells(monthRow, k).Address
                    End If
                Next k
    
                Set month1 = .Range(month1_start, month1_end)
                Set month2 = .Range(month2_start, month2_end)
                Set month3 = .Range(month3_start, month3_end)
    
            End With
    
        Next
    
    End Sub
    

    Изменить следующие комментарии:

    Минималистский подход, позволяющий существующему подразделу scheduleAnalyzer (который, как предполагается, в настоящее время работает на одном активном листе ) обрабатывать каждый лист в книге, был бы:

    Sub RunAllScheduleAnalyzer
        Dim ws As Worksheet
        For Each ws in Worksheets
            ws.Activate
            scheduleAnalyzer
        Next
    End Sub
    

    Я не рекомендую это как что-то иное, чем краткосрочный обходной путь — использование ActivateSelect), чтобы определить, какие ячейки будут обрабатываться приложением VBA, является чем-то, чего следует избегать, если это вообще возможно, так как это приводит к слишком многим», но этот код обычно работает !?!?»тип проблем.