Ошибка времени выполнения 1004 в цикле for

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

Однако функция рабочего листа вызвала ошибку времени выполнения 1004 "Метод" Диапазон объекта "_Global" не выполнен.

Код был теперь изменен (см. Ответы ниже), который исправил ошибку времени выполнения, но все еще не генерирует желаемый результат. Я сам изменил код, основываясь на последнем ответе, но мне кажется, что мне не хватает последнего, чтобы заставить его работать. Чтобы было понятнее, я прикрепил скриншот того, что код в настоящее время производит:

Две вещи, которые все еще не работают: в столбце B листа я хотел бы показать номера проектов, которые существуют на исходном листе (в этом примере B8 должен иметь значение 1, значение B9 2 и значение B10 3 как Есть три проекта). Затем список сумм в столбце H должен прекратиться, когда больше нет проектов для суммирования, вместо того, чтобы возвращать значение 0.

Чтобы было понятнее, это скриншот того, как выглядит лист конвейера:

Любая помощь, пожалуйста? Новый код ниже:

    Sub Write_Pipeline()
    'Sums up revenue of each project in the Input section to display expected cash flow
    Dim ip As Worksheet, pl As Worksheet, Start As Range, Length As Integer, Cnt As Integer, PH As Integer
    Dim SelectRange As Excel.Range
    Dim SumRange As Excel.Range
    Dim cell As Excel.Range

    Set ip = Worksheets("Input")
    Set pl = Worksheets("Pipeline")
    Set Start = pl.Range("B8")
    Start = 1
    Cnt = 1
    Length = 151
    Set SelectRange = ip.Range("B26:B151")
    Set SumRange = ip.Range("Y26:Y151")

    For Each cell In pl.Range("H8").Resize(Length)
        cell.Value = Application.WorksheetFunction.SumIf(SelectRange, Start, SumRange)
        PH = Start.Value
        Start = Start.Offset(1, 0)
        Start = PH + 1
    Next cell
End Sub

2 ответа

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

Sub Write_Pipeline()
Dim ip As Worksheet, pl As Worksheet, Start As Range, Length As Integer, Cnt As Integer
Dim SelectRange As Excel.Range
Dim SumRange As Excel.Range
Dim cell As Excel.Range

Set ip = Worksheets("Input")
Set pl = Worksheets("Pipeline")
Set Start = pl.Range("B8")
Start = 1
Cnt = 1
Length = 151
Set SelectRange = ip.Range("B26:B151")
Set SumRange = ip.Range("Y26:Y151")

For Each cell In pl.Range("H8").Resize(Length)
    cell.Value = Application.WorksheetFunction.SumIf(SelectRange, Start, SumRange)
Next cell
End Sub

Для дальнейшего использования, обратите внимание, что Range(ActiveCell) пытается обратиться к диапазону, имя или адрес которого находится в ActiveCell. Это потому, что, по крайней мере, в этом случае значение диапазона по умолчанию является его Valueт.е. Range(ActiveCell.Value), Поэтому, если активная ячейка не содержит что-то вроде "A1" или "B22" (или имя диапазона), это вызовет ошибку времени выполнения 1004. И даже если она содержит такое значение, я сомневаюсь, что вам понравится результат:).

Я не вижу, что вам нужно cnt переменная, но я оставил это в коде.

В вашем цикле у вас есть несколько странностей.

Является ли ActiveCell именованным диапазоном? Если это так, то это вводящее в заблуждение имя для именованного диапазона (активное относительно чего?). Если это не так, вы должны заменить его на ActiveCell, Вы можете опустить .Value часть.

Вы хотите использовать ActiveCell.Offset(1, 0).Select переместить активную ячейку на одну строку вниз.

Другие вопросы по тегам