Страницы: 1
RSS
vba скопировать формулу из одной ячейки в другую
 
Всем доброго дня!
Excel 2007
Есть необходимость программно скопировать формулу из верхней ячейки в следующую пустую одного и того же столбца.
Событие происходит не в модуле, а на листе (Private Sub Worksheet_Change(ByVal Target As Range))
Что делаю:

1. Объявляю переменные
Dim a
Dim b

2. Нахожу последнюю пустую строку
LastRow = Cells(Rows.Count, 1).End(xlUp).Row

3. Выбираю со смещением нужную мне ячейку, где уже есть формула.
Cells(LastRow - 0, 6).Select

4. Загоняю формулу в переменную а
a = Cells(LastRow - 0, 6).Formula

Если посмотреть "а", то моя формула там сохранена в виде строки типа "=бла бла бла"

5. Выбираю следующую вниз пустую ячейку, чтоб скопировать формулу из переменной "а"
ActiveCell.Offset(1, 0).Select

И тут загвоздка.
Метод copy paste не работает, ошибка Object required
Назначение переменной "а" в качестве as Range почему-то не работает или я туплю (начал хорошо отмечать праздник...)

Вопрос: как скопировать формулу?
 
Цитата
Иван Иванов написал:
LastRow - 0
Нафига вычитать 0?
Цитата
Иван Иванов написал:
ActiveCell.Offset(1, 0).Select
Вообще лишнее. Притом зачем активная ячейка, если вставить надо в первую пустую?
Наверное, правильнее будет так:
Код
a = Cells(LastRow - 0, 6).Formula
Cells(LastRow + 1, 6).Formula = a
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
The_Prist написал: Нафига вычитать 0?...
Наверное, правильнее будет так: a = Cells(LastRow - 0, 6).Formula
:)
Согласие есть продукт при полном непротивлении сторон
 
Sanja, Т-с-с... Пока не узнал смысл сего действа - решил не изменять код автора :)
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
как скопировать формулу?
Код
If Cells(LastRow , 6).HasFormula Then Cells(LastRow + 1, 6).FillDown
 
Уважаемый Kuzmich, ваш вариант подвешивает Excel.

Уважаемый The_Prist
Пробую ваш вариант.
Работает, формула вставляется, но выдает ошибку "Method ''Formula" of object 'Range' failed"
После закрытия сообщения об ошибке формула сохраняется.


Вот полный листинг кода:
Код
Private Sub Worksheet_Change(ByVal Target As Range)

Dim a

Application.ScreenUpdating = False

LastRow = Cells(Rows.Count, 1).End(xlUp).Row

' Тупорылая проверка

If Cells(LastRow + 1, 4) = "" Then ' Тут располагается выпадающий список со значениями, если пусто, тогда уходим

Exit Sub

End If

If Cells(LastRow + 1, 8) = "" Then ' Тут располагается выпадающий список со значениями, если пусто, тогда уходим

Exit Sub

End If

Cells(LastRow - 0, 6).Select

a = Cells(LastRow - 0, 6).Formula

Cells(LastRow + 1, 6).Formula = a       ' Вот тут и возникает ошибка!!!

Application.ScreenUpdating = True

 
End Sub
Изменено: Иван Иванов - 07.03.2016 14:13:10
 
Иван Иванов, код следует оформлять соответствующим тегом. Ищите такую кнопку и исправьте своё сообщение.
Спасибо!
 
Исправил, извиняюсь.
 
Подозрение есть. Можно узнать, что там за формула? Попробуйте так:
Код
    a = Application.ConvertFormula(Cells(LastRow, 6).Formula, xlA1, xlR1C1)
И еще, правильно:
    Dim a$, LastRow&
Изменено: kuklp - 07.03.2016 14:34:41
Я сам - дурнее всякого примера! ...
 
Цитата
kuklp написал:
a = Application.ConvertFormula(Cells(LastRow, 6).Formula, xlA1, xlR1C1)
Type mismatch.
 
Ну так формулу нам покажете? Гадать уже кагбэ и не интересно.. А лучше пример в файле.
Изменено: kuklp - 07.03.2016 15:21:15
Я сам - дурнее всякого примера! ...
 
Вообще имеет смысл перед выполнением вставить:
Код
Application.EnableEvents = False

а после всех изменений
Код
Application.EnableEvents = True

Плюс посмотреть - а не вызывает ли формула ошибку(#ЗНАЧ! и т.п.). Ну и попробуйте так:
Код
Cells(LastRow, 6).Copy
Cells(LastRow + 1, 6).PasteSpecial xlFormulas
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Результат нулевой! Подвешивает Excel. Всех, наверное, достал.
Выкладываю файл с проблемой. Буду признателен за подсказку.
Можно, конечно, просто копировать формулу из предыдущей строки вручную(не царь ведь!), однако хочется разобраться и довести этот вопрос до логического конца.
Жена чуть не убила вчера, весь праздник вместо того, чтобы  :D, провел в раздумьях. В чем ошибка?
 
 
Там таблица глючная. Скопировал данные в новый лист, сделал новую таблицу и все работает. Еще события отключил, подвешивало из-за зацикливания.
Изменено: kuklp - 09.03.2016 11:08:55
Я сам - дурнее всякого примера! ...
 
Спасибо огромное, уважаемый kuklp
Таблица не глючная. Я втупую скопировал ваш код и вставил в свою. Всё прекрасно заработало без проблем.
Подумаю, из-за чего такое могло происходить. Предполагаю, что проблема была в необъявленной переменной LastRow&

Тему можно и закрыть. Всем огромное спасибо за участие!
 
Цитата
The_Prist написал:
a = Cells(LastRow - 0, 6).Formula
Cells(LastRow + 1, 6).Formula = a
Зачем промежуточная переменная?
Разве нельзя просто написать:
Код
Cells(LastRow + 1, 6).Formula = Cells(LastRow, 6).Formula
Изменено: O_Lex - 04.06.2020 17:30:05
 
Можно. См. #4
Владимир
 
Цитата
Иван Иванов написал:
Вопрос: как скопировать формулу?
ответ
не нужно копировать формулу, присвойте ячейке текст формулы
Код
cells(r,c).formula = cells(ro,co).formula
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
Страницы: 1
Наверх