Страница: 1 | 2 | 
		
		 
			   
			 
			 
			 
			 
			
 
  
		
     
  
    
Вопрос: Динамическое суммирование
     
    
Добавлено: 24.11.08 13:07
     
      
  
				
			  
					 
			
				 
    
		
       
    
Автор вопроса:  
     Iren | ICQ: 496876583
 Iren | ICQ: 496876583 
      
       
  
Добрый день! Помогите пожалуйста, как подсчитать динамически сумму столбца, с помощью End(xlDown)?
 
    
динамически - это значит, что столбец может иметь разное число строк и по ним должна проставляться сумма
				
		
		
					 
			
				 
  
		
     
  
    
Ответы
     
    
Всего ответов: 17
     
      
  
		
	  
			 
	
		 
    
       
    
Номер ответа: 1 
      
Автор ответа: AngryBadger
 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
 Nytrogen


Вопросов: 18
Ответов: 186
      
 Профиль |  | #2
       
Добавлено:  24.11.08 15:55
       
    
       
  
Михаил, мы не ищем лёгких путей  
     
		
	  
			 
	
		 
    
       
    
Номер ответа: 3 
      
Автор ответа: AngryBadger
 AngryBadger



Вопросов: 33
Ответов: 245
      
 Профиль |  | #3
       
Добавлено:  24.11.08 16:08
       
    
       
  
Недостаток знаний, ведет к таким окольным путям 
     
 
Но в итоге все работает 
Кстати, посоветуйте что-нибудь почитать на тему VBA, или скиньте на mikhail.barsukov <СОБАКА> mail <ТОЧКА> ru
Заранее спасибо.
		
	  
			 
	
		 
    
       
    
Номер ответа: 4 
      
Автор ответа: Iren
 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))
, 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
 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
 Arseny


ICQ: 298826769 
Вопросов: 53
Ответов: 1732
      
 Профиль |  | #6
       
Добавлено:  25.11.08 13:30
       
    
       
  
как вы хитро так, с прищуром, кодите...  
     
		
	  
			 
	
		 
    
       
    
Номер ответа: 7 
      
Автор ответа: Nytrogen
 Nytrogen


Вопросов: 18
Ответов: 186
      
 Профиль |  | #7
       
Добавлено:  25.11.08 16:52
       
    
       
  
Iren & Михаил: один пишет глупость, другой - подтверждает.
 
    
firstCell.Range("A1" - это ссылка на первую ячейку диапазона, а не на конкретную ячейку. Написал я это чисто для наглядности и из-за некоторых соображений программирования. Если Вас это так смущает, то уберите:
 - это ссылка на первую ячейку диапазона, а не на конкретную ячейку. Написал я это чисто для наглядности и из-за некоторых соображений программирования. Если Вас это так смущает, то уберите:  
		
	  
			 
	
		 
    
       
    
Номер ответа: 8 
      
Автор ответа: AngryBadger
 AngryBadger



Вопросов: 33
Ответов: 245
      
 Профиль |  | #8
       
Добавлено:  25.11.08 17:56
       
    
       
  
Не вижу ни какой разницы, потому что "H6" и есть первая ячейка считаемого диапазона. Что firstCell напиши, что "H6" - одно и то же.
 
    
		
	  
			 
	
		 
    
       
    
Номер ответа: 9 
      
Автор ответа: AngryBadger
 AngryBadger



Вопросов: 33
Ответов: 245
      
 Профиль |  | #9
       
Добавлено:  25.11.08 17:56
       
    
       
  
Не вижу ни какой разницы, потому что "H6" и есть первая ячейка считаемого диапазона. Что firstCell напиши, что "H6" - одно и то же.
 
    
		
	  
			 
	
		 
    
       
    
Номер ответа: 10 
      
Автор ответа: Nytrogen
 Nytrogen


Вопросов: 18
Ответов: 186
      
 Профиль |  | #10
       
Добавлено:  25.11.08 18:36
       
    
       
  
 
    
firstCell.Range("H6" - это по-вашему ячейка H6? Верно, только относительно первой ячейки диапазона firstCell, то бишь $O$11. Запустите вот такую процедурку и сами поймёте:
 - это по-вашему ячейка H6? Верно, только относительно первой ячейки диапазона firstCell, то бишь $O$11. Запустите вот такую процедурку и сами поймёте:
		
	  
			 
	
		 
    
       
    
Номер ответа: 11 
      
Автор ответа: AngryBadger
 AngryBadger



Вопросов: 33
Ответов: 245
      
 Профиль |  | #11
       
Добавлено:  26.11.08 10:07
       
    
       
  
Черт, только что понял, что пишу )) Я имел в виду))
 
    
source]Set theRange = ws.Range("H6", firstCell.End(xlDown))[
[/source]
Сорри за приперательства)
		
	  
			 
	
		 
    
       
    
Номер ответа: 12 
      
Автор ответа: AngryBadger
 AngryBadger



Вопросов: 33
Ответов: 245
      
 Профиль |  | #12
       
Добавлено:  26.11.08 10:08
       
    
       
  
Set theRange = ws.Range("H6", firstCell.End(xlDown))
 
    
		
	  
			 
	
		 
    
       
    
Номер ответа: 13 
      
Автор ответа: Arseny
 Arseny


ICQ: 298826769 
Вопросов: 53
Ответов: 1732
      
 Профиль |  | #13
       
Добавлено:  26.11.08 11:26
       
    
       
  
 
    
приперательства 
"е" и "и" местами поменяй.  
		
	  
			 
	
		 
    
       
    
Номер ответа: 14 
      
Автор ответа: Iren
 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
 Nytrogen


Вопросов: 18
Ответов: 186
      
 Профиль |  | #15
       
Добавлено:  26.11.08 17:40
       
    
       
  
 
    
Естественно, в переменную theRange заносится ссылка на диапазон из одной колонки от firstCell1 до последней заполненной ячейки. Но Вы же сами хотели использовать End(xlDown):
Если у Вас появляются "дырки", то ищите нижнюю заполненную ячейку снизу листа: