Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.04.2009, 17:04   #1
ruavia3
Форумчанин
 
Регистрация: 13.03.2009
Сообщений: 253
Лампочка Цикл для суммирования

Как написать цикл, который суммировал бы в столбце B ячейки из соответствующих строк столбцов C, D, F.
А останавливался, когда в столбце A натыкался на слово summ?

Последний раз редактировалось ruavia3; 21.04.2009 в 14:22.
ruavia3 вне форума Ответить с цитированием
Старый 20.04.2009, 17:32   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,858
По умолчанию

Код:
Sub test()
    For Each cell In ActiveSheet.UsedRange.Columns(1).Cells
        If cell Like "*summ*" Then Exit For
        cell.Next.FormulaR1C1 = "=RC[1]+RC[2]+RC[3]"
    Next
End Sub
EducatedFool вне форума Ответить с цитированием
Старый 20.04.2009, 17:39   #3
ruavia3
Форумчанин
 
Регистрация: 13.03.2009
Сообщений: 253
По умолчанию

Все работает, только не останавливается. Может потому что summ стоит в столбце A?

Последний раз редактировалось ruavia3; 20.04.2009 в 17:47.
ruavia3 вне форума Ответить с цитированием
Старый 21.04.2009, 11:28   #4
ruavia3
Форумчанин
 
Регистрация: 13.03.2009
Сообщений: 253
По умолчанию

Как сделать, чтобы он останавливался?
ruavia3 вне форума Ответить с цитированием
Старый 21.04.2009, 15:17   #5
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,858
По умолчанию

Цитата:
Как сделать, чтобы он останавливался?
Прикрепить пример файла.


Код проверял - он работает, как Вы и просили.
Цикл останавливается, если в ячейке столбца А присутствует подстрока "summ".
Я ошибся только в формуле - вместо RC[3] надо поставить RC[4]

Цитата:
Суммировать нужно с 3 ячейки, не затирая названия столбцов.
Этого я, конечно, не учёл, поскольку в исходном задании об этом не было ни слова.

Но в остальном-то мой код правильно работает в прикреплённом вами файле - прописывает формулы в строки 2 ... 96
С чего Вы взяли, что он не останавливается?

Последний раз редактировалось EducatedFool; 21.04.2009 в 21:14.
EducatedFool вне форума Ответить с цитированием
Старый 21.04.2009, 15:44   #6
ruavia3
Форумчанин
 
Регистрация: 13.03.2009
Сообщений: 253
По умолчанию

Необходимо, в столбце B суммировать столбцы С, D, E.
Остановить цикл, когда в столбце A будет значение summ* Но значение ячейки всегда меняется, поэтому summ - это 4 символа слева.
Суммировать нужно с 3 ячейки, не затирая названия столбцов.
Вложения
Тип файла: rar Book1.rar (4.7 Кб, 11 просмотров)
ruavia3 вне форума Ответить с цитированием
Старый 21.04.2009, 21:00   #7
HighStar
 
Регистрация: 13.04.2009
Сообщений: 5
По умолчанию

ruavia3, приведеный Вами пример я обработал следующим образом -
Код:
Sub test()
Dim R As Long
For R = 3 To 65536
  If Left$(Cells(R, 1), 4) = "summ" Then Exit For
  Cells(R, 2).FormulaR1C1 = "=RC[1]+RC[2]+RC[3]"
Next R
End Sub
Вроде бы всё получилось. Код ламерский - зато дешево и сердито.
HighStar вне форума Ответить с цитированием
Старый 22.04.2009, 05:32   #8
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Более рационально (и примерно в 100 раз быстрее) так:
Код:
Sub Main()
    Dim i As Long, a, b()
    Application.ScreenUpdating = False
    i = ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count - 1
    a = Range([A3], Cells(i, "E")).Value: ReDim b(1 To UBound(a, 1), 1 To 1)
    For i = 1 To UBound(a, 1)
        If a(i, 1) Like "summ*" Then Exit For
        b(i, 1) = a(i, 3) + a(i, 4) + a(i, 5)
    Next
    Range([B3], Cells(UBound(b, 1) + 2, "B")).Value = b
End Sub
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Старый 22.04.2009, 08:56   #9
ruavia3
Форумчанин
 
Регистрация: 13.03.2009
Сообщений: 253
По умолчанию

SAS888, спасибо)) а в этом случае он остановится, когда 4 символа слева будет "summ" или значение ячейки целиком равно "summ"?
ruavia3 вне форума Ответить с цитированием
Старый 22.04.2009, 09:08   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

SAS888, Вы меня, малограмотного извините, но я хотел бы уточнить один момент...
я подозреваю, что это просто небольшая описка (или просто опущено из-за быстроты написания кода):
тип переменной a сознательно объявляется как вариант?
и дополнительный вопрос, а какой тип у переменной b ?

________________________________
Цитата:
Сообщение от ruavia3
а в этом случае он остановится, когда 4 символа слева будет "summ"
Именно так! (Like ищет совпадение, а * означает, что после summ совпадением будут считаться символы в ячейке)...

Последний раз редактировалось Serge_Bliznykov; 22.04.2009 в 09:11.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
макрос для суммирования jisu Microsoft Office Excel 5 30.03.2009 23:21
цикл для ttimer Evgenii Общие вопросы Delphi 10 08.02.2009 14:03
Цикл с предусловием. ( цикл while) Цикл с постусловием. (цикл repeat ... until) Mr.User Помощь студентам 9 23.11.2007 01:34