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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.04.2014, 22:22   #1
brik
Пользователь
 
Регистрация: 17.04.2014
Сообщений: 22
По умолчанию преобразовать формулу в макрос

как преобразовать формулу ActiveCell.FormulaR1C1 = "=RC[-7]-RC[-6]-RC[-2]"
в макрос на диапазоне с 8 до 1000 строки те c N8 до U1000
те результат вычислений в столбце U (ActiveCell.FormulaR1C1) а RC[-7] это столбец N

единственное условие в макросе что формула должна появлятся работать когда есть значение в столбце N
если значения нет в ячейках столбца N - то и формула не работает

записал формулу как условие это к ней прикрутить

Последний раз редактировалось brik; 17.04.2014 в 23:19.
brik вне форума Ответить с цитированием
Старый 17.04.2014, 23:20   #2
brik
Пользователь
 
Регистрация: 17.04.2014
Сообщений: 22
По умолчанию

както так но не работает почему то

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("N8:U1000")) Is Nothing Then

i = 8
If Cells(i, 14).Value <> "" Then
Cells(i, 21).FormulaR1C1 = "=RC[-7]-RC[-6]-RC[-2]"
i = i + 1
End If
End Sub
brik вне форума Ответить с цитированием
Старый 18.04.2014, 00:12   #3
Казанский
Старожил
 
Аватар для Казанский
 
Регистрация: 31.12.2010
Сообщений: 2,133
По умолчанию

А не проще в U8:U1000 вставить формулу
Код:
=ЕСЛИ(N8="";"";N8-O8-S8)
exceleved@yandex.ru Яндекс.Деньги: 410011500007619
Казанский вне форума Ответить с цитированием
Старый 18.04.2014, 00:49   #4
brik
Пользователь
 
Регистрация: 17.04.2014
Сообщений: 22
По умолчанию

с макросом кажется получше
тк существует вероятность что случайно потрут формулу в какой либо ячейке диапазона до 1000 надо диапазон защищенный делать на пароль садить книгу
а так макрос вроде всеравно пересчитает если результат попортят

плюс еще когда если протягиваешь ЕСЛИ на длинный диапазон другие макросы например фильтрация и прочие замедляются

так пробую - чето на формулу ругается

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("N8:U1000")) Is Nothing Then
With Target(, 21)
.FormulaR1C1 = "=IF(RC[-7]="";"";RC[-7]-RC[-6]-RC[-2])"
End With
End If
End Sub

так еще пробовал - тоже не получилось

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("N6:U1000")) Is Nothing Then
With Target( , 21)
If Target.Offset(0, -7).Value = "" Then Target.Value = "" Else Target.FormulaR1C1 = "=RC[-7]-RC[-6]-RC[-2]"
End With
End If
End Sub

гдето ошибки делаю

Последний раз редактировалось brik; 18.04.2014 в 02:56.
brik вне форума Ответить с цитированием
Старый 18.04.2014, 09:14   #5
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Зачем Вы упорно хотите вставить формулы в ячейки? Если формулы заменять макросом, то пусть он и вычисляет требуемые значения.
И еще. При вашем подходе к решению задачи будет невозможна работа с диапазонами. Например, если вставили скопированный диапазон (или просто очистили) в влияющие ячейки, то макрос отработает только ячейку активной строки.
Предлагаю поступить так:
Код:
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim x As Range: Set x = Selection
    If Intersect(Target, [N8:N1000, O8:O1000, S8:S1000, U8:U1000]) Is Nothing Then Exit Sub
    With Application
        .ScreenUpdating = False: .EnableEvents = False
        [N8:N1000].Copy [U8]
        [O8:O1000].Copy: [U8].PasteSpecial xlValues, xlSubtract
        [S8:S1000].Copy: [U8].PasteSpecial xlValues, xlSubtract
        [U8:U1000].Replace "-*", "", xlPart
        .CutCopyMode = False: .ScreenUpdating = True: .EnableEvents = True
    End With
    x.Select
End Sub
Чем шире угол зрения, тем он тупее.

Последний раз редактировалось SAS888; 18.04.2014 в 10:22.
SAS888 вне форума Ответить с цитированием
Старый 18.04.2014, 11:20   #6
brik
Пользователь
 
Регистрация: 17.04.2014
Сообщений: 22
По умолчанию

Благодарю за ваше отличное решение ! Сам бы конечно не додумался до такого...
brik вне форума Ответить с цитированием
Старый 22.04.2014, 14:24   #7
brik
Пользователь
 
Регистрация: 17.04.2014
Сообщений: 22
По умолчанию

Уважаемый SAS888 - еще раз вынужден обратится к вам тк
макрос работает замечательно на нефильтрованном диапазоне

- а если отфильтровать строки и вводить значения в таблицу в отфильтрованные строки - вычисления сбиваются к сожалению

пример прилагаю - надеюсь на помощь

что делать то - макрос замечательный делает то что нужно
снимать фильтр перед его выполнением и потом снова ставить тотже - а если их несколько по разным критериям вначале перед выполнением ??
Вложения
Тип файла: zip Книга2.zip (16.8 Кб, 19 просмотров)

Последний раз редактировалось brik; 23.04.2014 в 00:08.
brik вне форума Ответить с цитированием
Старый 22.04.2014, 22:06   #8
brik
Пользователь
 
Регистрация: 17.04.2014
Сообщений: 22
По умолчанию

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

но как это сделать - как получить конфигурацию текущего фильтра и тд ума не приложу

Последний раз редактировалось brik; 22.04.2014 в 23:43.
brik вне форума Ответить с цитированием
Старый 23.04.2014, 08:22   #9
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Изначально про автофильтр речи не было. Впредь оговаривайте все условия задачи целиком.
Посмотрите пример во вложении.
В файле "Книга3" реализовано следующее:
Если на рабочем листе применен автофильтр, то перед пересчетом ячеек определяется диапазон автофильтра, а так же все критерии и операторы автофильтра запоминаются в массиве, затем снимается автофильтр, происходит пересчет ячеек и фильтр восстанавливается в прежнее состояние.
В файле "Книга4" другой вариант решения задачи:
Нужные диапазоны помещаются в массивы, происходит пересчет и вывод результатов в соответствующие ячейки рабочего листа по очереди, т. к. помещать результаты в массив и выводить на лист "оптом" при примененном автофильтре некорректно.
Вложения
Тип файла: rar Книга3.rar (13.7 Кб, 14 просмотров)
Тип файла: rar Книга4.rar (12.7 Кб, 13 просмотров)
Чем шире угол зрения, тем он тупее.

Последний раз редактировалось SAS888; 23.04.2014 в 08:48.
SAS888 вне форума Ответить с цитированием
Старый 23.04.2014, 10:37   #10
brik
Пользователь
 
Регистрация: 17.04.2014
Сообщений: 22
По умолчанию

Вариант 2 (Книга4) предложенный вами рабочий - еще раз огромное спасибо за поддержку однако он менее предпочтителен

По варианту 1 (Книга3)ошибки идут при примененном фильтре +вставка значений - я на всякий случай выкладываю с пояснениями
ошибка на строке a(i, 1) = .Filters(i).Criteria1

конечно вариант 1 предпочтительнее тк там перерасчет полный идет на листе при изм любой ячейки
а в варианте 2 такого не получается - например в столбце N значение сотрешь - строка не пересчитывается
Вложения
Тип файла: zip Книга3_вар1.zip (20.5 Кб, 27 просмотров)
Тип файла: zip Книга4 _вар2.zip (20.1 Кб, 22 просмотров)

Последний раз редактировалось brik; 23.04.2014 в 12:06.
brik вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как преобразовать нарисованную кривую в формулу Natizk Общие вопросы Delphi 12 21.04.2013 19:30
Заданную логическую формулу преобразовать в эквивалентную днф sergei15 Паскаль, Turbo Pascal, PascalABC.NET 2 29.05.2012 06:21
Макрос не вписывает формулу agregator Microsoft Office Excel 3 10.02.2012 16:44
[Си++ Билдер]Преобразовать математическую формулу в нормальный для компилятора вид mrG0bliN Помощь студентам 7 24.01.2012 19:28
Преобразовать формулу в макрос Viento Microsoft Office Excel 10 23.01.2009 22:35