Попытки выполнить вычисления с использованием Offset приводят к ошибкам (vba for excel) - PullRequest
0 голосов
/ 26 сентября 2019

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

Столбец A -> дата

Столбец B -> час

Столбец C до lastColumn -> data

Один из столбцов имеет название «интенсивность».В конце я хочу добавить столбец, в котором будет храниться сумма значений «интенсивности» с 00:00 до 23:00, в строке, где час «00:00», и другой столбец, который даст мне значение встрока «05:00» вычитается из значения в строке «22:00».Это моя попытка:

Sub intensity_computations()

Dim k, l, intensity_column As Integer
Dim lastCol, lastRow As Long
Dim rng, start As Range

'I define the variables of the number of the last column and the last row:
lastCol = Cells(1, 1).End(xlToRight).Column
lastRow = Cells(1, 1).End(xlDown).Row

'I find the column number that corresponds to the column "intensity"
For k = lastCol To 1 Step -1
    If Not Cells(1, k).Find("intensity") Is Nothing Then
       intensity_column = k
    End If
Next k

'I create the column with the summed hourly values written at the the rows with hour "00:00:00"
For l = 2 To lastRow
    If Cells(l, 2).Value = "00:00:00" Then
        start_cell = Cells(l, intensity_column)
        rng = Range(start_cell, start_cell.Offset(23, 0))
        Cells(l, lastCol + 1) = Application.Sum(rng)
    End If
Next l

'I create the column with the subtracted value of hour "22:00" from the value of hour "05:00", which should be written at row with hour "00:00"
For l = 2 To lastRow
    If Cells(l, 2).Value = "00:00:00" Then
        Cells(l, lastCol + 2).Value = Cells(l, lastCol + 2).Offset(5, -2) - Cells(l, lastCol + 2).Offset(22, -2)
    End If
Next l

End Sub

К сожалению, я получаю ошибки, такие как «требуется объект» или «несоответствие», в зависимости от того, помещен ли первый цикл For до или после второго цикла For.

Кто-нибудь может помочь с этим?

1 Ответ

0 голосов
/ 27 сентября 2019

Ради того, чтобы закрыть эту проблему, я выяснил, что было не так, и выкладываю это, чтобы помочь другим помнить, что, когда ваш код кажется нормальным, возможно, что-то не так, данные, которые вы обрабатываете.

В моем случае части исходного набора данных отсутствовали, и, как следствие, вычисления не будут выполняться из-за ОШИБОК.

Я должен был добавить в свой IF-блок On error Resume Next, хотя я думал, что этобыло бы лучше хранить значения ячеек в переменных.Это продолжало мой код.Я читал, что это не лучшая практика для обработки ошибок в VBA, но в настоящее время это работает.

Затем мне пришлось Set диапазон и start_cell, как упомянуто @SJR, а также добавить.value до Application.Sum.Таким образом, мои изменения кода отражены здесь:

For l = 2 To lastRow
    If Cells(l, 2).Value = "00:00:00" Then
        Set start_cell = Cells(l, intensity_column) 'I added "Set"
        Set rng = Range(start_cell, start_cell.Offset(23, 0)) 'I added "Set"
        Cells(l, lastCol + 1).Value = Application.Sum(rng) 'I added ".Value"
    End If
Next l

'I create the column with the subtracted value of hour "22:00" from the value of hour "05:00", which should be written at row with hour "00:00"

Dim sm5, sm22 As Variant 'I created two more variables

For l = 2 To lastRow
    If Cells(l, 2).Value = "00:00:00" Then
        On Error Resume Next 'I added a command how to handle the Error due to unclean data
        sm5 = Cells(l, lastCol-1).Offset(5, -2)
        sm22 = Cells(l, lastCol-1).Offset(22, -2)
        ActiveSheet.Cells(l, lastCol + 2).Value = sm5 - sm22
    End If
Next l
...