Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - VBA

Страница: 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
Михаил, мы не ищем лёгких путей ;)
  1. Sub AutoSum()
  2.   Dim firstCell As Range
  3.   Dim theRange As Range
  4.   Dim theSum As Long
  5.  
  6.   Set firstCell = Range("Sheet1!A1")
  7.   Set theRange = Range(firstCell.Range("A1"), firstCell.End(xlDown))
  8.   theSum = Application.WorksheetFunction.Sum(theRange)
  9.  
  10.   MsgBox "The sum of the range " & theRange.Address(False, False) & " is " & theSum
  11. End Sub

Ответить

Номер ответа: 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 app As New Excel.Application
            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
как вы хитро так, с прищуром, кодите... :-D

Ответить

Номер ответа: 7
Автор ответа:
 Nytrogen



Вопросов: 18
Ответов: 186
 Профиль | | #7 Добавлено: 25.11.08 16:52
Iren & Михаил: один пишет глупость, другой - подтверждает.
firstCell.Range("A1";) - это ссылка на первую ячейку диапазона, а не на конкретную ячейку. Написал я это чисто для наглядности и из-за некоторых соображений программирования. Если Вас это так смущает, то уберите: ;)
  1. Set firstCell = Range("Sheet1!H6")
  2. Set theRange = Range(firstCell, firstCell.End(xlDown))

Ответить

Номер ответа: 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
Михаил: Set theRange = ws.Range(firstCell.Range("H6", firstCell.End(xlDown))

firstCell.Range("H6";) - это по-вашему ячейка H6? Верно, только относительно первой ячейки диапазона firstCell, то бишь $O$11. Запустите вот такую процедурку и сами поймёте:
  1. Sub Test()
  2.   Range("H6").Range("H6").Select
  3. End Sub

Ответить

Номер ответа: 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
Nytrogen пишет:
приперательства

"е" и "и" местами поменяй. :-D

Ответить

Номер ответа: 14
Автор ответа:
 Iren



ICQ: 496876583 

Вопросов: 11
Ответов: 25
 Профиль | | #14 Добавлено: 26.11.08 12:58
После того как я подсчет суммы включила в цикл, код заработал, но при условии, что в поле Field6 нет пустых значений. А если в этом поле появляются пустые ячейки, то он выдает сумму равную нулю. С чем это связано?
      Dim dr As OracleDataReader
            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
Iren: код заработал, но при условии, что в поле Field6 нет пустых значений

Естественно, в переменную theRange заносится ссылка на диапазон из одной колонки от firstCell1 до последней заполненной ячейки. Но Вы же сами хотели использовать End(xlDown):
Iren: Помогите пожалуйста, как подсчитать динамически сумму столбца, с помощью End(xlDown)

Если у Вас появляются "дырки", то ищите нижнюю заполненную ячейку снизу листа:
  1. Set theRange1 = Range(firstCell1, firstCell1.Worksheet.Cells(Application.Rows.Count, firstCell1.Column).End(xlUp))

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам