Страницы: 1
RSS
Макрос для вставки формулы суммирования произвольного диапазона
 
Уважаемые форумчане, добрый вечер!

Потихоньку жажда знаний стала одолевать лень, и я занялся освоением макросов и языка VBA, пока что на сугубо дилетантском уровне - по уже готовым примерам в сети, и разбору кода записанного через макрорекодер. Скажу честно, понимаю я пока немного, но твёрдо намерен освоить это дело хоть на каком то уровне.

Собственно, застопорился, на элементарном примере, задача - через VBA-код реализовать ТО ЖЕ САМОЕ ЧТО ДЕЛАЕТ сочетание клавиш Alt+
т.е. сложение всех чисел в столбце находящихся выше выделенной ячейки  (в эту самую ячейку надо поместить сумму этих чисел).
По условию:
1. Числа могут идти в любом столбце (A, B, ...), из какого столбца суммируем определяем по выделенной в данный момент ячейке, выше которой, как предполагается находятся числа для суммирования, которые в столбце идут без пропусков,
2. Числа могут начинаться с произвольной строчки т.е. не обязательно сверху листа
3. Их может быть от 1 до N в пределах системных ограничений Эксель
4. Над первым числом может идти поле заголовка (таблицы) типа "Продажи", "Прибыль" и.т.д., либо его может не быть т.е. просто сверху вниз в столбце идут числа
5. Формула суммы чисел вписывается в первую пустую ячейку под ними, куда предварительно ставим курсов до запуска макроса.

Суть вопроса:
Макрорекордер при записи макроса сгенерил следующий код:
Код
Sub Macro23()
    ActiveCell.FormulaR1C1 = "=SUM(R[-22]C:R[-1]C)"
    ActiveCell.Offset(1, 0).Range("A1").Select
End Sub

Этот пример прекрасно сработал для одного конкретного диапазона, на котором я собственно записывал макрос, но если чисел в столбце, больше\меньше, чем в этом примере, то разумеется, корректно складывать не будет, это вижу даже я т.к. он вставляет формулу суммы через относительные ссылки в ячейку и при этом жёстко фиксирует диапазон, подлежащий сложению.
Проблема в том, что когда записываешь макрос, он не понимает что ты через Alt+ или функцией СУММ и Ctrl+стрелкой хочешь захватить весь диапазон чисел для суммирования (сколько бы их ни было в конкретном случае) и тупо подсчитывает сколько конкретно строчек просуммировалось для текущего случая и фиксирует это в макросе!
Умом понимаю, что надо как то найти и запомнить в переменной положение самой верхней и самой нижней цифры диапазона суммирования (т.е. их адреса ячеек) и уже дальше эти переменные вставлять в ту формулу суммы, которую через макрос вводим в нужную ячейку, но как это сделать, увы, не знаю! :(

Кто знает, подскажите, как это сделать, пожалуйста. Возможно код должен быть гораздо сложнее, чем это...

Знаю, что это ерунда, а не задача, но я пока пробую самое простое, по отрывочным сведениям в сети, совершенно не разобрался с выделением диапазонов\ячеек и доступом к их свойствам...

И, кстати, был бы очень благодарен, если бы Вы могли посоветовать полноценную, не совсем для "чайников", но при этом хотя бы в меру короткую и доходчивую книгу по макросам\VBA для изучения с обилием примеров.
Уокенбах, конечно, крутой, но пока в нём найдёшь нужный раздел, это пипец... ))
Лет 10 назад занимался программированием в универе (Паскаль, С\С++, Java), но с тех пор от этого полностью отошёл и много чего забыл очевидно, так что в коде в принципе смогу разобраться, но на сложном материале скорее всего буду тупить...
 
Можно пробежаться циклом, суммируя числа в ячейках, а можно и так:
Код
Sub TestSum()
    ActiveCell = Application.WorksheetFunction.Sum(Range(ActiveCell.Offset(-1, 0), Cells(2, ActiveCell.Column)))
End Sub
 
Юрий М, спасибо за пример, но хотелось бы, чтобы он не только результат суммирования показывал в ячейке как значение, но формулу туда вставлял, выделяя нужный диапазон!
 
Зачем формулу, да ещё и выделять? Какова цель выделения?
 
Юрий М, нет нет, не правильно поняли, выделять ничего не надо, просто чтобы в ячейке было не значение, а формула типа СУММ(диапазон ячеек сверху) равная тому же значению, которое получается через Ваш код.
 
Это я неправильно понял? А кто просил ВЫДЕЛИТЬ диапазон?
Цитата
realalexandro написал: выделяя нужный диапазон
Да зачем формула, когда УЖЕ есть макрос?
 
Цитата
Юрий М написал:
Это я неправильно понял? А кто просил ВЫДЕЛИТЬ диапазон?
Это в том смысле, чтобы в формулу попал т.е. подставился весь диапазон, я выразился не точно.
Цитата
Да зачем формула, когда УЖЕ есть макрос?
Затем, что если значения в столбце будут меняться, формула пересчитает автоматически, а значение само не поменяется, пока 2й раз макрос не запустишь!
 
Цитата
realalexandro написал:
значение само не поменяется, пока 2й раз макрос не запустишь!
Уверены? Есть ведь событийные процедуры ))
 
Юрий М, не уверен, но проверил Ваш код. Он правильно считает сумму по столбцу, но при изменении значений автоматом сумма не меняется.
Про событийные процедуры ничего не знаю к сожалению. В смысле знания VBA, если Вы олимпийский пловец, то я, считайте впервые только намочил ногу, причём левую, причём только краешек )) Так что не пугайте меня такими терминами ))
На практике, Вы уж мне поверьте, если в ячейке нет формулы, большинство пользователей даже не поймёт, что эта ячейка представляет собой сумму, - решат, что одно из значений в столбце, просто большое, поэтому ненаглядно!
Может быть как то можно всё таки вставку формулы через макрос сделать, "захватив" нужный диапазон чисел?!
 
realalexandro, а так?
Код
Sub Macro23()
    ActiveCell.FormulaR1C1 = "=SUM(R1C:R[-1]C)"
'    ActiveCell.Offset(1, 0).Range("A1").Select 'необязательно
End Sub
 
Казанский, ага, это уже ближе в смысле формулы, спасибо за пример!
Суммирует и формулу ставит, только немного неправильно, что "захватывает" суммой все ячейки с первой ячейки столбца сверху страницы, а не только там где числа.
Тут если, столбец чисел, которые нужно просуммировать находится вверху, либо даже заголовок это столбца в верхней ячейке, то всё ок работает, но вот если там другие числовые данные выше или таблица отдельная (бывает, что на одном листе несколько таблиц находится сверху вниз), то, конечно некорректно получится.

А нельзя ли через RC адресацию как то выразить адрес не просто первой ячейки сверху в данном столбце, а именно первой ячейке в которой есть число?! Ну может как то циклом найти первое число и запомнить номер строки, где оно есть, а затем вставить в эту формулу суммы вместе RC или как то по другому?
Изменено: realalexandro - 24.12.2016 01:13:08
 
realalexandro, аналог Ctrl+вверх
Код
Sub Macro24()
Dim x
  x = ActiveCell.Offset(-1).End(xlUp).Row
  ActiveCell.FormulaR1C1 = "=SUM(R" & x & "C:R[-1]C)"
End Sub
Примерный аналог Alt+
Код
Sub Macro25()
Dim x, y
  y = ActiveCell.Column
  For x = ActiveCell.Row - 1 To 1 Step -1
    If IsEmpty(Cells(x, y)) Or Not IsNumeric(Cells(x, y)) Then Exit For
  Next
  If x < ActiveCell.Row - 1 Then
    ActiveCell.FormulaR1C1 = "=SUM(R" & x + 1 & "C:R[-1]C)"
  Else
    MsgBox "Нечего складывать", vbExclamation
  End If
End Sub
 
Казанский, Спасибо Огромное, последний вариант, то что надо!
Сразу видно Мастера своего дела :)
Посоветуйте, пожалуйста,  учебник по VBA для начинающего!

Хотел бы уточнить:
Цитата
Then Exit For
Это видимо оператор выхода из цикла когда находит первую пустую, либо нечисловую ячейку при просмотре по строчкам вверх (и номер строки при этом сохраняется в переменную x)?

И вот эту конструкцию совсем не понял:
Код
"=SUM(R" & x + 1 & "C:R[-1]C)"

1. я думал там должны быть ещё скобки по синтаксису для левой границы сложения "=SUM(R[" & x + 1 &"] "&C:R[-1]C)"? Но почему то и так работает без скобок?
2. "C:R[-1]C" - как вот эту нотацию понять?! R[-1] это ячейка на 1 строку выше ActiveCell в том же столбце, как я понимаю, а вот "С:_С" по краям что означает?
Изменено: realalexandro - 24.12.2016 12:03:13
 
Цитата
realalexandro написал:
Это видимо оператор выхода из цикла...
Ответ - да. Чтобы не гадать, поставьте курсор в слово (например Exit) и нажмите F1.
1. Квадратные скобки - относительная адресация, без скобок - абсолютная. Откройте какую-нибудь книгу с формулами, в Параметры - Формулы включите стиль ссылок R1C1 и посмотрите на формулы.
2. C означает тот же столбец, т.е. C[0]

В учебниках Вы разбираетесь лучше меня - я ни одного не читал  :oops: , а Вы с Уокенбахом знакомы.
Посмотрите тут: http://www.cyberforum.ru/vba/thread432513.html
Изменено: Казанский - 24.12.2016 13:01:20
 
Казанский, спасибо за ликбез! Буду учиться...

Не совсем понял про C:R[-1]C, если C обозначает тот же столбец, то выходит R[-1]C транслируется в номер столбца... а хотя, нет, кажется, всё понял!

Если всю формулу взять с учётом Вашего пояснения, то получится что то типа
=SUM(R(# строки последней ячейки с цифрой)С(текущий столбец):R(# строки ячейки на одну выше текущей)С(текущий столбец)
например =SUM(R2C:R9C)

Ещё раз большое спасибо!
 
Цитата
Sub Macro25()
Dim x, y
 y = ActiveCell.Column
 For x = ActiveCell.Row - 1 To 1 Step -1
   If IsEmpty(Cells(x, y)) Or Not IsNumeric(Cells(x, y)) Then Exit For
 Next
 If x < ActiveCell.Row - 1 Then
   ActiveCell.FormulaR1C1 = "=SUM(R" & x + 1 & "C:R[-1]C)"
 Else
   MsgBox "Нечего складывать", vbExclamation
 End If
End Sub
Как добавить жирный шрифт, к применяемому макросу. Может кто дописать.

Возможно его виды изменить ? нужно при выделение только цифр. В пустые ячейки вносились промежуточные итоги.
1
2
3
=Sum
32
42
55
=Sum
78
=Sum
 
Как Ваш вопрос связан с темой о суммировании?
Страницы: 1
Читают тему
Наверх