Как записать и использовать такой макрос в Excel?

Приветствую!
Есть две таблицы, связанных между собой определенными функциями.
Какие функции - сейчас не особо важно, сделал для примера такое:
Вторая таблица берет данные из первой строки первой таблицы, хитрым образом суммирует их и помещает себе в первую строчку. Далее во второй таблице вторая строчка берет данные из второй строчки первой таблицы, плюсует первую строку второй таблицы (которая над ней). И так далее.

Задача следующая - протянуть строки второго таблицы от последней заполненной строки второй таблицы до последней строки первой таблицы с учётом всех этих функций с помощью макроса. Вы спросите — «зачем протягивать макросом, если можно просто выделить последнюю строчку второй таблицы и протянуть ее вниз мышкой». Проблема в том, что строчек первой таблицы в «боевой» задаче более десятка тысяч (крупная база данных). Нужно записать макрос для того, что бы нажать его и уйти пить кофеек минут на 20, пока оно всё растянет и пересчитает.
53bfecff05bd4dfba21ec1ca9440bfa6.png

Протяжка вручную срабатывает на ура — данные считаются правильно. Но нужен макрос, потому что количество срок будет очень большим.

Проблема следующая: никак не получается записать макрос. Сначала пробую обычную запись и воспроизведение — вроде бы пишет, но воспроизводится с жёстко-забитыми адресами ячеек и строк (с 22 по 40). Если в первой таблице после этих манипуляций добавить еще n-нное количество строчек с данными — макрос всё так же тягает строки с 22 по 40.
Понятное дело — нужно включить относительную адресацию. Включаем её тут:
e6dfccdfa5de41d29444d9d96445e823.png

«Должно работать» — скажете вы. Но не тут-то было! После записи и воспроизведения макроса получаем ошибку:
e3b8c62889ad4e7f9f36f15e524a31f0.png
Окно дебага:
087fee9bfd6e434793fc2444a2bcc917.png

Вот тут у меня и ступор - VBA не владею =(.
  • Вопрос задан
  • 5191 просмотр
Пригласить эксперта
Ответы на вопрос 3
@rosperitus
D4 источник формул и данных, а D5:D35 диапазон куда нужно протянуть
ActiveSheet.Range("D4").Copy (ActiveSheet.Range("D5:D35"))

А вообще, обычно достаточно скопировать строку (диапазон) с формулами (форматами/данными), а потом выделить нужный для протягивания диапазон и вставить
Ответ написан
Комментировать
iiil
@iiil
Инженер и вэб-дизайнер, рисую.
В макросе надо определить количество строк в первой таблице и заполнить вторую таблицу формулами на такое же количество строк. А вообще не понятно, Вы во второй таблице заполните до конца, чтобы не выводило нулей - сделайте проверку на пустое значение, например, в третьем столбце считается сумма первых двух, но только если там есть числа:

=ЕСЛИ(A1<>'';A1+B1;'')
И протяните всю таблицу 2 до конца, один раз это сделать можно. Ну или как сказал - пишите макрос. Не владете vba - добро пожаловать на фриланс-биржу, работая плевая.
Ответ написан
Комментировать
honor8
@honor8
Принципы быстродействия VBA в описании
Очевидно, формула, которую надо размножить, записана во "второй строчке", т.е. диапазоне H3:K3.
Вставьте нижеприведённый код в Module1 (который указан на скриншоте).

' Не самый оптимальный, но наглядный способ. Ctrl+Break - экстренная остановка.
Option Explicit
'123456789012345678901234567890123456h8nor@ya567890123456789012345678toster56789

Sub Макрос1()
  Dim i As Long
  
  i = 3 ' Формулу будем копировать с 3-й строки
  With ThisWorkbook.ActiveSheet
    Do
      i = i + 1
      .Range("H" & i & ":K" & i) = .Range("H" & i - 1 & ":K" & i - 1).FormulaR1C1
    Loop Until i = .UsedRange.Rows.Count ' Цикл ДО последней строки с данными
  End With
End Sub
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы