Код VBA больше не распознает лист после добавления второго листа - PullRequest
0 голосов
/ 04 июля 2019

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

Это делается с помощью APIметод get, который извлекает данные каждые 10 минут, а затем получает разницу между отметкой времени данных и функцией Now ().Если он превышает 10 минут, он получает 0 или если он находится под ним, получает 1 в столбце H. Мой код используется для перемещения этих значений из столбца H в правый столбец, связанный с правильным периодом времени.А затем в верхней части часа переместите то, что он называет «HourScore», в столбец правильных часов, который затем используется для расчета «DayScore», который представляет собой просто процент точных сообщений, которые он сообщил за весь день.

Все отлично работало, когда я отслеживал только одну организацию;теперь я отслеживаю два, и он перестал работать после того, как я добавил второй лист для другой утилиты.

Я пробовал несколько разных способов заставить ссылку на объект работать, но у меня нет большого опыта работы с VBA, поэтому я не могу точно определить точную проблему.

Я также пытался разделить их на разные рабочие книги, но они оба постоянно работают на виртуальном сервере, и я продолжал получать ошибки.Этот код выглядел очень похоже на то, что показано ниже, но каждая функция If была разделена.

Sub Minute_Save()
' Refresh Queries
ActiveWorkbook.RefreshAll

' Creates a variable array from the pge_minscore Column
Dim pge_ws As Worksheet
Dim pge_minscore As Range
Dim pge_hourscore As Range

Dim sge_ws As Worksheet
Dim sce_minscore As Range
Dim sce_hourscore As Range

Set pge_ws = Worksheets("PGE")
Set pge_minscore = Range([E2], [E:E].Find("*", [E1], , , xlByRows, xlPrevious))

Set sce_ws = Worksheets("SCE")
Set sce_minscore = Range([E2], [E:E].Find("*", [E1], , , xlByRows, xlPrevious))

' Copy Data Refresh into MinuteTable for MinuteScore
If Minute(Now()) < 10 Then
    pge_ws.Range([H2], [H:H].Find("*", [H1], , , xlByRows, xlPrevious)).Resize(pge_minscore.Rows.Count, pge_minscore.Columns.Count).Cells.Value = pge_minscore.Cells.Value
    sce_ws.Range([H2], [H:H].Find("*", [H1], , , xlByRows, xlPrevious)).Resize(pge_minscore.Rows.Count, pge_minscore.Columns.Count).Cells.Value = pge_minscore.Cells.Value

ElseIf Minute(Now()) >= 10 And Minute(Now()) < 20 Then
    pge_ws.Range([I2], [I:I].Find("*", [I1], , , xlByRows, xlPrevious)).Resize(pge_minscore.Rows.Count, pge_minscore.Columns.Count).Cells.Value = pge_minscore.Cells.Value
    sce_ws.Range([I2], [I:I].Find("*", [I1], , , xlByRows, xlPrevious)).Resize(pge_minscore.Rows.Count, pge_minscore.Columns.Count).Cells.Value = pge_minscore.Cells.Value

ElseIf Minute(Now()) >= 20 And Minute(Now()) < 30 Then
    pge_ws.Range([J2], [J:J].Find("*", [J1], , , xlByRows, xlPrevious)).Resize(pge_minscore.Rows.Count, pge_minscore.Columns.Count).Cells.Value = pge_minscore.Cells.Value
    sce_ws.Range([J2], [J:J].Find("*", [J1], , , xlByRows, xlPrevious)).Resize(pge_minscore.Rows.Count, pge_minscore.Columns.Count).Cells.Value = pge_minscore.Cells.Value

ElseIf Minute(Now()) >= 30 And Minute(Now()) < 40 Then
    pge_ws.Range([K2], [K:K].Find("*", [K1], , , xlByRows, xlPrevious)).Resize(pge_minscore.Rows.Count, pge_minscore.Columns.Count).Cells.Value = pge_minscore.Cells.Value
    sce_ws.Range([K2], [K:K].Find("*", [K1], , , xlByRows, xlPrevious)).Cells.Value = sce_minscore.Cells.Value

ElseIf Minute(Now()) >= 40 And Minute(Now()) < 50 Then
    pge_ws.Range([L2], [L:L].Find("*", [L1], , , xlByRows, xlPrevious)).Resize(pge_minscore.Rows.Count, pge_minscore.Columns.Count).Cells.Value = pge_minscore.Cells.Value
    sce_ws.Range([L2], [L:L].Find("*", [L1], , , xlByRows, xlPrevious)).Resize(sce_minscore.Rows.Count, sce_minscore.Columns.Count).Cells.Value = sce_minscore.Cells.Value

ElseIf Minute(Now()) >= 50 Then
    pge_ws.Range([M2], [M:M].Find("*", [AC1], , , xlByRows, xlPrevious)).Resize(pge_minscore.Rows.Count, pge_minscore.Columns.Count).Cells.Value = pge_minscore.Cells.Value
    sce_ws.Range([M2], [M:M].Find("*", [M2], , , xlByRows, xlPrevious)).Resize(sce_minscore.Rows.Count, sce_minscore.Columns.Count).Cells.Value = sce_minscore.Cells.Value

    Set sce_hourscore = sce_ws.Range([N2], [N:N].Find("*", [N1], , , xlByRows, xlPrevious))
    Set pge_hourscore = pge_ws.Range([N2], [N:N].Find("*", [N1], , , xlByRows, xlPrevious))

        ' Copy MinuteScore to pge_hourscore
        If Hour(Now()) = 0 Then
            sce_ws.Range([O4], [O:O].Find("*", [O1], , , xlByRows, xlPrevious)).Resize(sce_hourscore.Rows.Count, sce_hourscore.Columns.Count).Cells.Value = sce_hourscore.Cells.Value
            pge_ws.Range([O4], [O:O].Find("*", [O1], , , xlByRows, xlPrevious)).Resize(sce_hourscore.Rows.Count, sce_hourscore.Columns.Count).Cells.Value = sce_hourscore.Cells.Value
      -some more code that is the same as above for more hours-  
       End If
    End If
Application.OnTime Now + TimeValue("00:10:00"), "Minute_Save"
End Sub

Я получаю:

Ошибка времени выполнения '1004': метод 'Range' объекта '_Worksheet 'не удалось

Следуя инструкциям AJD, я изменил приведенный выше код на следующий код:

Set pge_ws = Worksheets("PGE")
Set pge_minscore = pge_ws.Range("H2:H500")

Set sce_ws = Worksheets("SCE")
Set sce_minscore = sce_ws.Range([E2], [E:E].Find("*", [E1], , , xlByRows, xlPrevious))

' Copy Data Refresh into MinuteTable for MinuteScore
If Minute(Now()) < 10 Then
    'pge_ws.Range([H2], [H:H].Find("*", [H1], , , xlByRows, xlPrevious)).Resize(pge_minscore.Rows.Count, pge_minscore.Columns.Count).Cells.Value = pge_minscore.Cells.Value
    'sce_ws.Range([H2], [H:H].Find("*", [H1], , , xlByRows, xlPrevious)).Resize(pge_minscore.Rows.Count, pge_minscore.Columns.Count).Cells.Value = pge_minscore.Cells.Value

    Set startRange = pge_ws.Range("H2")
    Set endRange = pge_ws.Range("H:H").Find("*", [H1], , , xlByRows, xlPrevious)
    pge_ws.Range(startRange, endRange) = pge_minscore.Cells.Value

Это сработало;но я не совсем уверен, почему.Я должен быть в состоянии приспособить то, что дал мне ADJ, для моих целей.Я думаю, что это потому, что я не совсем понимаю разницу между значениями и диапазонами.Очевидно, я знаю, что диапазоны - это набор ячеек, но разве это не значит, что диапазоны - это просто набор значений?В любом случае, это выходит за рамки этого поста, поэтому, благодаря людям, которые помогли, я ценю, что вы нашли время.

Ответы [ 2 ]

1 голос
/ 04 июля 2019

Всегда добавляйте Option Explicit в начало любого модуля. Всегда .

В этом случае он предупредил бы вас о необъявленной переменной sce_ws, на которую вы бы ответили, изменив Dim sge_ws As Worksheet tp Dim sce_ws As Worksheet.

Кроме того, следующая конструкция может иметь проблемы - что, если вы не найдете результат? Кроме того, поскольку вы используете сокращенную запись ([H2]), уверены ли вы, что значение в параметрах является диапазоном, а не значением? Или, возможно, диапазон, который вы считаете, так как он не полностью квалифицирован и может относиться к другому листу.

pge_ws.Range([H2], [H:H].Find("*", [H1], , , xlByRows, xlPrevious))

Чтобы проверить эту теорию, попробуйте:

set startRange = pge_ws.Range("H2")
Set endRange = pge_ws.Range("H:H").Find("*", [H1], , , xlByRows, xlPrevious)
pge_ws.Range(startRange, endRange).Resize ' etc
0 голосов
/ 04 июля 2019

У вас есть

Dim sge_ws As Worksheet

Но здесь вы пытаетесь установить эту переменную на рабочий лист:

Set sce_ws = Worksheets("SCE")

Следовательно, почему вы получаете Run-time error '1004': Method 'Range' of object '_Worksheet' failed

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...