Application.WorksheetFunction.Sum в цикле - PullRequest
2 голосов
/ 19 января 2012

У меня есть этот код, который извлекает некоторые данные из SQL-запроса и помещает их в таблицу Excel:

   I = 4
 Do While Not rs.EOF
  I = I + 1
  Sheet1.Range("A" & I).Value = rs(0)
  Sheet1.Range("B" & I).Value = rs(1)
  Sheet1.Range("C" & I).Value = rs(2)
  Sheet1.Range("D" & I).Value = rs(3)
  Sheet1.Range("E" & I).Value = rs(4)
  Sheet1.Range("F" & I).Value = rs(5)
  Sheet1.Range("G" & I).Value = rs(6)
  Sheet1.Range("H" & I).Value = rs(7)
  Sheet1.Range("I" & I).Value = rs(8)
  Sheet1.Range("J" & I).Value = rs(9)
  Sheet1.Range("K" & I).Value = rs(10)
  Sheet1.Range("L" & I).Value = rs(11)
  Sheet1.Range("M" & I).Value = rs(12)
  Sheet1.Range("N" & I).Value = rs(13)
  Sheet1.Range("O" & I).Value = rs(14)
  Sheet1.Range("P" & I).Value = rs(15)
  Sheet1.Range("Q" & I).Value = Application.WorksheetFunction.Sum(Sheet1.Range("E" & I), Sheet1.Range("P" & I))
  'Sheet1.Range("Q" & I).Value = Sheet1.Range("E" & I).Value + Sheet1.Range("F" & I).Value + Sheet1.Range("G" & I).Value + Sheet1.Range("H" & I).Value
  rs.MoveNext
 Loop

Теперь я пытаюсь суммировать диапазон столбцов от столбца "E" доcol "P", но это не сработало, оно просто суммирует только те ячейки ("E" & I и "P" & I), а не диапазон.

Любая помощь, пожалуйста?

Ответы [ 2 ]

6 голосов
/ 19 января 2012

Во-первых, вы можете оптимизировать и санировать свой код, используя оператор with:

Санируйте ваш код, используя with

Не делай

Sheet1.Range("A" & I).Value = rs(0)
Sheet1.Range("B" & I).Value = rs(1)
Sheet1.Range("C" & I).Value = rs(2)
...

У

With Sheet1
    .Range("A" & I).Value = rs(0)
    .Range("B" & I).Value = rs(1)
    .Range("C" & I).Value = rs(2)
    ...
End With

Суммирование диапазона вместо элементарных ячеек

Понимание вашего первоначального высказывания

В вашем первоначальном утверждении:

Application.WorksheetFunction.Sum(Sheet1.Range("E" & I), Sheet1.Range("P" & I))

Вы вызываете функцию рабочего листа с несколькими аргументами (как вы это делаете с SUM(E1, P1), но вы хотите суммировать диапазон, т.е. SUM(E1:P1).

Решение вашей проблемы

Лучше попробуй:

Application.WorksheetFunction.Sum(Sheet1.Range("E" & I & ":P" & I))

Обратите внимание, что вы также можете определить свой диапазон следующим образом:

With Sheet1
    Application.WorksheetFunction.Sum(.Range(.Cells(I, "E"), .Cells(I, "P"))
End With

Это последнее может быть очень полезно, потому что вы можете использовать .Cells с буквой или Long для столбца.

3 голосов
/ 19 января 2012

Почему бы не использовать цикл вместо такого длинного кода

Option Explicit

Sub Sample()
    Dim i As Long, j As Long, k As Long

    '~~> Rest of your code

    Do While Not rs.EOF
        i = i + 1
        j = 0
        With Sheets1
            k = 1
            For j = 0 To 15
                .Cells(i, k).Value = rs(j)
                k = k + 1
            Next
            .Range("Q" & i).Value = _
            Application.WorksheetFunction.Sum(.Range("E" & i & ":P" & i))
        End With
        rs.MoveNext
     Loop

     '~~> Rest of your code
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...