Страница: 1 | 2 |
Вопрос: Динамическое суммирование
Добавлено: 24.11.08 13:07
Автор вопроса: Iren | ICQ: 496876583
Добрый день! Помогите пожалуйста, как подсчитать динамически сумму столбца, с помощью End(xlDown)?
динамически - это значит, что столбец может иметь разное число строк и по ним должна проставляться сумма
Ответы
Всего ответов: 17
Номер ответа: 1
Автор ответа:
AngryBadger
Вопросов: 33
Ответов: 245
Профиль | | #1
Добавлено: 24.11.08 15:38
Не знаю насколько это правильно, но я бы сделал так.
Sub Doit()
Cells(ActiveCell.End(xlDown).Row + 1, ActiveCell.Column).Select
Dim iEndRow As Integer
iEndRow = ActiveCell.Row - 1
Dim iActiveRow As Integer
iActiveRow = 1
Dim iNextRow As Integer
iNextRow = iActiveRow + 1
Dim iSumm1 As Integer
Dim iSumm2 As Integer
iSumm2 = 0
Do While iActiveRow <> iEndRow
iSumm1 = iSumm2 + Cells(iActiveRow, 1) + Cells(iNextRow, 1)
iActiveRow = iActiveRow + 1
iNextRow = iActiveRow + 1
iSumm2 = iSumm1 - Cells(iActiveRow, 1)
Loop
MsgBox "Сумма: " & iSumm1
End Sub
Номер ответа: 2
Автор ответа:
Nytrogen
Вопросов: 18
Ответов: 186
Профиль | | #2
Добавлено: 24.11.08 15:55
Михаил, мы не ищем лёгких путей
Номер ответа: 3
Автор ответа:
AngryBadger
Вопросов: 33
Ответов: 245
Профиль | | #3
Добавлено: 24.11.08 16:08
Недостаток знаний, ведет к таким окольным путям
Но в итоге все работает
Кстати, посоветуйте что-нибудь почитать на тему VBA, или скиньте на mikhail.barsukov <СОБАКА> mail <ТОЧКА> ru
Заранее спасибо.
Номер ответа: 4
Автор ответа:
Iren
ICQ: 496876583
Вопросов: 11
Ответов: 25
Профиль | | #4
Добавлено: 25.11.08 12:35
вот мой код...
Dim wb As Excel.Workbook
Dim ws As Excel.Worksheet
wb = app.Workbooks.Add
ws = wb.Worksheets(1)
.....
Dim dr As OracleDataReader
dr = commDASIM.ExecuteReader
Dim i, k As Integer
Dim firstCell As Excel.Range
Dim theRange As Excel.Range
Dim theSum As Double
firstCell = ws.Range("Лист1!H6"
theRange = ws.Range(firstCell.Range("H6", firstCell.End(xlDown))
theSum = app.WorksheetFunction.Sum(theRange)
k = 1
i = 6
While dr.Read
ws.Cells(i, 1) = k
ws.Cells(i, 2) = dr("field1"
ws.Cells(i, 3) = dr("field2"
ws.Cells(i, 4) = dr("field3"
ws.Cells(i, 5) = dr("field4"
ws.Cells(i, 6) = dr("field5"
ws.Cells(i, 7) = dr("field6"
ws.Cells(i, 8) = dr("field7"
If Not (dr.IsDBNull(6)) Then
If dr(6) >= 15 Then
ws.Cells(i, 9) = 1
ws.Cells(i, 10) = Round((dr(6) * 5 / 100), 2)
Else
ws.Cells(i, 11) = "No date"
End If
End If
i = i + 1
k = k + 1
ws.Cells(i, 8) = theSum
ws.Range(ws.Cells(5, 1), ws.Cells(i, 11)).Borders.LineStyle = xlEdgeLeft
End While
dr.Close()
app.Visible = True
Вроде все правильно, но почему то он не считает.
Номер ответа: 5
Автор ответа:
AngryBadger
Вопросов: 33
Ответов: 245
Профиль | | #5
Добавлено: 25.11.08 13:06
Set firstCell = ws.Range("Лист1!H6"
Set theRange = ws.Range(firstCell.Range("H6", firstCell.End(xlDown))
Номер ответа: 6
Автор ответа:
Arseny
ICQ: 298826769
Вопросов: 53
Ответов: 1732
Профиль | | #6
Добавлено: 25.11.08 13:30
как вы хитро так, с прищуром, кодите...
Номер ответа: 7
Автор ответа:
Nytrogen
Вопросов: 18
Ответов: 186
Профиль | | #7
Добавлено: 25.11.08 16:52
Iren & Михаил: один пишет глупость, другой - подтверждает.
firstCell.Range("A1" - это ссылка на первую ячейку диапазона, а не на конкретную ячейку. Написал я это чисто для наглядности и из-за некоторых соображений программирования. Если Вас это так смущает, то уберите:
Номер ответа: 8
Автор ответа:
AngryBadger
Вопросов: 33
Ответов: 245
Профиль | | #8
Добавлено: 25.11.08 17:56
Не вижу ни какой разницы, потому что "H6" и есть первая ячейка считаемого диапазона. Что firstCell напиши, что "H6" - одно и то же.
Номер ответа: 9
Автор ответа:
AngryBadger
Вопросов: 33
Ответов: 245
Профиль | | #9
Добавлено: 25.11.08 17:56
Не вижу ни какой разницы, потому что "H6" и есть первая ячейка считаемого диапазона. Что firstCell напиши, что "H6" - одно и то же.
Номер ответа: 10
Автор ответа:
Nytrogen
Вопросов: 18
Ответов: 186
Профиль | | #10
Добавлено: 25.11.08 18:36
firstCell.Range("H6" - это по-вашему ячейка H6? Верно, только относительно первой ячейки диапазона firstCell, то бишь $O$11. Запустите вот такую процедурку и сами поймёте:
Номер ответа: 11
Автор ответа:
AngryBadger
Вопросов: 33
Ответов: 245
Профиль | | #11
Добавлено: 26.11.08 10:07
Черт, только что понял, что пишу )) Я имел в виду))
source]Set theRange = ws.Range("H6", firstCell.End(xlDown))[
[/source]
Сорри за приперательства)
Номер ответа: 12
Автор ответа:
AngryBadger
Вопросов: 33
Ответов: 245
Профиль | | #12
Добавлено: 26.11.08 10:08
Set theRange = ws.Range("H6", firstCell.End(xlDown))
Номер ответа: 13
Автор ответа:
Arseny
ICQ: 298826769
Вопросов: 53
Ответов: 1732
Профиль | | #13
Добавлено: 26.11.08 11:26
приперательства
"е" и "и" местами поменяй.
Номер ответа: 14
Автор ответа:
Iren
ICQ: 496876583
Вопросов: 11
Ответов: 25
Профиль | | #14
Добавлено: 26.11.08 12:58
После того как я подсчет суммы включила в цикл, код заработал, но при условии, что в поле Field6 нет пустых значений. А если в этом поле появляются пустые ячейки, то он выдает сумму равную нулю. С чем это связано?
dr = commDASIM.ExecuteReader
Dim i, k As Integer
Dim firstCell1 As Excel.Range
Dim theRange1 As Excel.Range
Dim theSum1 As Double
k = 1
i = 6
While dr.Read
ws.Cells(i, 1) = k
ws.Cells(i, 2) = dr("name_r"
ws.Cells(i, 3) = dr("name"
ws.Cells(i, 4) = dr("msisdn"
ws.Cells(i, 5) = dr("icc"
ws.Cells(i, 6) = dr("sign_date"
ws.Cells(i, 7) = dr("date_first_call"
ws.Cells(i, 8) = dr("summa_balance"
If Not (dr.IsDBNull(6)) Then
If dr(6) >= 15 Then
ws.Cells(i, 9) = 1
ws.Cells(i, 10) = Round((dr(6) * 5 / 100), 2)
Else
ws.Cells(i, 11) = "Сумма наговоренных разговоров менее 15$"
End If
End If
i = i + 1
k = k + 1
firstCell1 = ws.Range("Лист1!H6"
theRange1 = ws.Range(firstCell1, firstCell1.End(xlDown))
theSum1 = app.WorksheetFunction.Sum(theRange1)
ws.Cells(i, 8) = theSum1
ws.Range(ws.Cells(5, 1), ws.Cells(i, 11)).Borders.LineStyle = xlEdgeLeft
End While
Номер ответа: 15
Автор ответа:
Nytrogen
Вопросов: 18
Ответов: 186
Профиль | | #15
Добавлено: 26.11.08 17:40
Естественно, в переменную theRange заносится ссылка на диапазон из одной колонки от firstCell1 до последней заполненной ячейки. Но Вы же сами хотели использовать End(xlDown):
Если у Вас появляются "дырки", то ищите нижнюю заполненную ячейку снизу листа: