Новости:

К первому сообщению темы должен быть прикреплен файл примера в формате xls*.
Приложив пример, Вы избавите себя и других от вопросов типа "А какой критерий?", "А куда выводить результат?", "А сколько строк?" и все тех же просьб выложить файл. Рисовать за Вас Ваши же таблички с заданиями, а затем и решение к ним, никто желанием не горит. Да и, как показывает практика, в большинстве случаев без файла решения не найти.

Главное меню

Как вставить смешанную ссылку на ячейку в строку формулы макроса?

Автор AlWin, 29.10.2012, 20:22

« назад - далее »

AlWin

В строках заготовки-шаблона нижележащие зависимые ячейки ссылаются формулой со смешанной ссылкой на влияющую. После копирования-вставки строк шаблона в новое место требуется поменять ссылки в формулах на вновь образовавшиеся  влияющие ячейки и распространить их по строкам и столбцам до конца диапазона данных. Помогите...

alex77755

Показал бы что есть и что должно получиться быстрей бы помогли.
И потом: должны быть именно формулы в ячейках или можно заменить значениями?
Как вариант попробуй записать макрос и посмотреть.
Я пока не понял, что куда надо вставлять
Могу помочь VB6, VBA
Alex77755@mail.ru

AlWin

1. Выделяем строку 11. Нажимаем на кнопку макроса. Результат - вставлен новый диапазон (строки 11:14).
2. После вставки формула в ячейке P12 выглядит: "=ОКРУГЛ(P$25*$E12;3), т.е. ссылка осталась на родительскую ячейку шаблона (P$25).
3. Требуется изменить формулу в ячейке P12 на: "=ОКРУГЛ(P$11*$E12;3)
4. Затем скопировать и вставить измененную формулу в ячейки диапазона P12:Q14, создав этих ячейках ссылки на ячейки P$12 и Q$12
5. Распространить формулы диапазона P12:Q14 по лиловым ячейкам до конца Отчетного периода (столбец АА) вместе с формулами диапазона R12:S14 (которые изменению не подлежат).

Wasilic

Может и я на что сгожусь ... Если сгодился, можете меня по+благодарить+.

AlWin

Не могу. Вставленный диапазон тоже динамический. Допустим в P11 - объем работ, а нижележащие строки - это кирпич, раствор, лопата, грузовой мотороллер. Причем таких подчиненных строк может быть и одна и десять. Размножать их придется уже в таблице методом копи-паст и ссылка должна оставаться всегда на ячейку в строке11. Иначе при добавлении каждой 4-й и т.д. подчиненной строки формулы придется править вручную.
В идеале в шаблоне вообще можно было бы оставить только одну подчиненную строку (с последующей возможностью ее размножения уже в таблице), чтобы потом меньше пустых неиспользованных подчиненных строк удалять вручную.

Wasilic

Если не так то, и я ничего не понял.
Может и я на что сгожусь ... Если сгодился, можете меня по+благодарить+.

AlWin

Цитата: Wasilic от 30.10.2012, 14:33
Если не так то, и я ничего не понял.
Один умный мужчин сказал "Кто ясно мыслит - ясно излагает". Или я вообще на другой волне...
Большое спасибо. что уделили свое время. Вообще круто и прикольно - практически то, что хотел. Проблема в том, что догнать как работают Ваши макросы мне в обозримом ближайшем будущем нереально и соответственно подправить под свои нужды не представляется возможным.
Все-таки пара плюсов в моем (церковно-приходском) макросе имеется. Ему плевать на изменения динамических диапазонов (H:J и P:AA) + я могу добавить строки в любое место таблицы между строк 7 и 10 (книга !AlWin.xls), а не только в конец.
В книге !AlWin.xls при изменении размера динамического диапазона H:J оба макроса начинают безобразить. Новые строки добавляются не внутри строк исходной таблицы, а вне. Т.е. если по строке 11 с "Итого" вставить в любую ячейку формулу суммы, напр. S11=SUMM(S7:S10), то при добавлении новых строк они выпадают из диапазона суммирования. Не получается макросом "Продлить период" добавить подчиненную строку в любом месте таблицы.
Вообще же я пытался получить помощь в написании формулы и замене типа ссылки. В моем макросе есть неудачная попытка присвоить ячейке значение типа FormulaR1C1 = "=ROUND(R125C*RC9,3)". Начинается она так: " ac.Offset(-3, stolbМ - 1).Range("A1").Formula = ac.Offset(-4, stolbМ - 1).AddressLocal(ColumnAbsolute:=False, ReferenceStyle:=xlR1C1)", но дальше - никак - то типы данных неверны, то синтаксис ...

Кроме того:
1. Не хотел загружать лист излишней информацией (вижу теперь - зря). Под итогами будет формироваться еще одна таблица с выборкой уникальных значений из подчиненных строк и дальнейшей обработкой в каждом из отчетных периодов. Судя по строке S = Range("P" & Rows.Count).End(xlUp).Row + 1, которую я детально практически не понимаю (почему xlUp = - 4162 и что это значит?), но как тот друг человека чувствую, что Row нижней ячейки определяется методом опускания на самое дно с подъемом и упиранием в первую непустую ячейку столбца. При наличии дополнительных данных ниже основной таблицы требуется какой-то другой метод определения границ диапазона.
2. Диапазон "ОтчетныйПериод" по определению динамический и никак не может быть таким коротким как в примере (должно быть изначально не меньше полусотни). К сожалению такая запись
     .Replace What:="(P", Replacement:="(P$"
     .Replace What:="(Q", Replacement:="(Q$"
     .Replace What:="(T", Replacement:="(T$"
     .Replace What:="(U", Replacement:="(U$"
     .Replace What:="(X", Replacement:="(X$"
     .Replace What:="(Y", Replacement:="(Y$"
с задачей не справляется ни при наличии изначально большого диапазона, ни при добавлении методом "копировать-вставить скопированное", т.к. работает только для явно указанных 6 столбцов.

Wasilic

Ну вот, после первого примера появилась доп. Информация.
Цитировать1. добавить строки в любое место таблицы между строк 7 и 10
А где об этом было сказано раньше?

Цитировать2. вставить в любую ячейку формулу суммы, напр. S11=SUMM(S7:S10),
А в таблице то, ни одной формулы нет.
Я ж не телепат, да и не встречал таких на форуме.
До этого места, поизвращавшись с макросами, еще можно что нить придумать.

А дальше.
Цитировать3. Под итогами будет формироваться еще одна таблица
И как она будет реагировать на вставку строк и столбцов?
В связи с такими извращениями, я помочь не смогу. Извините.

Может и я на что сгожусь ... Если сгодился, можете меня по+благодарить+.

AlWin

Начал мыслить чуть ясней.
Подсказки Wasilic: «Уберите в шаблолне знаки абс.ссылок.» и строка типа .Replace What:="(P", Replacement:="(P$" задачу определенно решают.

Попробую изложить проблему яснее.
Range("A1"). Replace What:="133", Replacement:="$133" возвращает то что нужно.
А вот эта запись
Dim utr As Long
utr = ActiveCell.Row (или utr = 133)
Range("A1"). Replace What:="utr", Replacement:="$utr"
не меняет ничего

Точно так же при явном указании строки естественно нормально работает:
ActiveCell.FormulaR1C1 = "=ROUND(R133C*RC9,3)"
А эта запись:
ActiveCell.FormulaR1C1 = "=ROUND(RutrC*RC9,3)"
Возвращает «=ОКРУГЛ(RutrC*$I134;3)»

Подскажите, пожалуйста, что нужно изменить, чтобы Replace и ROUND работали правильно через переменную utr.

AlWin

Ну вот. Пока набирал сообщение...
С точки зрения грамотного построения структуры данных исходная табличная форма критики однозначно не выдерживает, но таковы обстоятельства и требования, что она должна быть именно такой.
Просто я пытался урезать и упростить табличный пример до минимума, чтобы получить ответ в первую очередь на вопрос: «Как вставить смешанную ссылку на ячейку в строку формулы макроса?»
Как выяснилось, постановка вопроса и выложенная таблица оказались несколько неудачны.
И все-таки - просто помогите ответить на последние вопросы «и будет нам счастье».

Wasilic

Переменная в кавычках - уже не переменная а обычный текст.
Поэтому надо так
Dim utr As Long
utr = ActiveCell.Row '(или utr = 133)
Range("A1"). Replace What:=utr, Replacement:="$" & utr

и так
ActiveCell.FormulaR1C1 = "=ROUND(R" & utr & "C*RC9,3)"
Может и я на что сгожусь ... Если сгодился, можете меня по+благодарить+.

AlWin

Большое Вам спасибо за терпение и реальную помощь. Удачи

Wasilic

В общем то, извращение было почти готово.  :)
Добавил только описание действий макроса.
Мне то он не нужен, а вам пример будет.
И Вам удачи!   ;)
Может и я на что сгожусь ... Если сгодился, можете меня по+благодарить+.

AlWin

Спасибо за «извращение». И особенно за комментарии.
Легкие пути - это в учебниках. А такие кирпичики реальных примеров пригодятся обязательно.