Страницы: 1
RSS
Проверка правильности формул с помощью макросов
 
Добрый день, форумчане. Пожалуйста помогите. Есть такое задание дана таблица, нужно написать макрос который будет выдавать сообщение вида :в ячейке такой-то задана неверная формула. Может уже кто делал такое??? не нашла ничего похожего(((
 
А что значит формула не правильная? Как макрос должен догадаться, что она не правильная?
 
задаётся формула в макросе для  определённой ячейки, и потом когда мы будем писать формулу в ячейку таблицы, если сделаем ошибку должно выскочить сообщение "неверная формула" .  
 
Код
Sub formula()  
If ActiveCell.FormulaR1C1 = "=RC[1]" Then
  MsgBox "ok"
  Else
  MsgBox "error in " & ActiveCell.Address(0, 0)
  End If
End Sub

Изменено: Юрий - 03.06.2016 12:56:01
 
Спасибо большое. А не могли бы вы скинуть документ с эти макросом?
 
Код
Private Sub Worksheet_Change(ByVal Target As Range)
    trueF = "=СУММ(B1:B10)" '"верная" формула
    Application.EnableEvents = False
    If Not Intersect(Target, [A1]) Is Nothing And Target.Count = 1 Then
        If Target.FormulaLocal <> trueF Then
            MsgBox "Неверная формула!", vbCritical + vbOKOnly
            Target = Empty
        End If
    End If
    Application.EnableEvents = True
End Sub
В модуль листа. Формулу вводите в желтую ячейку (A1)
Изменено: Sanja - 02.06.2016 19:11:54
Согласие есть продукт при полном непротивлении сторон
 
Sanja,Спасибо большое:) я не могли бы пояснить как работает? я в VBA не очень, но зачёт очень нужен:(  
 
Sanja,разобралась более менее. А как быть с проверкой других формул? например если в одной формуле и произведение и сумма? как записать?
 
В смысле "Как работает"? Как просили - так и работает.  :)
Код с коментами
Код
Private Sub Worksheet_Change(ByVal Target As Range) 'процедура обработки события изменения значений в диапазоне
    trueF = "=СУММ(B1:B10)" '"верная" формула
    Application.EnableEvents = False    'отключаем обработку событий
    If Not Intersect(Target, [A1]) Is Nothing And Target.Count = 1 Then 'если изменяемая ячейка попадает в диапазон (A1) и она одна, то
        If Target.FormulaLocal <> trueF Then    'проверяем совпадает-ли введенная формула с верной
            MsgBox "Неверная формула!", vbCritical + vbOKOnly 'если не совпадает, выдаем сообщение
            Target = Empty  'очищаем ячейку, куда вводили формулу
        End If
    End If
    Application.EnableEvents = True 'включаем обработку событий
End Sub
Согласие есть продукт при полном непротивлении сторон
 
Запишите в переменную trueF (строка кода №2) нужную формулу и сверяйтесь с ней
Согласие есть продукт при полном непротивлении сторон
 
Sanja, благодарю, очень помогли:)  
 
ещё вопрос, как данный макрос применить и для других ячеек? на весь столбец? повторять этот кусочек кода меняя номера ячеек? или как?
 
Цитата
memch написал:
как данный макрос применить и для других ячеек?
Код
If Not Intersect(Target, Range("A1:A1000")) Is Nothing

 
Юрий М,спасибо:)
 
Код
Private Sub Worksheet_Change(ByVal Target As Range)
    trueF = "=(D*100)/C" '"верная формула
    Application.EnableEvents = False
    If Not Intersect(Target, [E4:E15]) Is Nothing And Target.Count = 1 Then
        If Target.FormulaLocal <> trueF Then
            MsgBox "Неверная формула!", vbCritical + vbOKOnly
            Target = Empty
        End If
    End If
    Application.EnableEvents = True
End Sub


как формулу во второй строке записать так, что бы она применялась для всего столбца в 4-ой строке? я что-то не пойму((
 
Цитата
memch написал:
для всего столбца в 4-ой строке
Это как?
 
ну для одной строки у меня значения в ячейке E4 cчитаются trueF = "=(D4*100)/C4" ' и такие повторяющиеся формулы для следующих сток до Е15, только в формуле меняются индексы у D и C . Вот как-нибудь можно прописать в общем виде для диапазона ячеек формулу trueF = "=(Di*100)/Ci"? т.е. что бы эта формула сама индексы меняла? надеюсь понятно сказала :oops:
Изменено: memch - 03.06.2016 00:02:56
 
Прикрепила документ, посмотрите пожалуйста, может так понятнее будет? на данный момент макрос правильно работает только для ячейки E4, надо реализовать правильную работу макроса для диапазона E4:E15...help me((
Изменено: memch - 03.06.2016 20:55:58
 
тогда формулу нужно вводить в формате R1C1
Код
Private Sub Worksheet_Change(ByVal Target As Range)
    trueF = "=(RC[-1]*100)/RC[-2]" '"верная" формула
    Application.EnableEvents = False
    If Not Intersect(Target, [E4:E15]) Is Nothing And Target.Count = 1 Then
        If Target.FormulaR1C1 <> trueF Then
            MsgBox "Неверная формула!", vbCritical + vbOKOnly
            Target = Empty
        End If
    End If
    Application.EnableEvents = True
End Sub
 
Цитата
Zoynels написал: тогда формулу нужно вводить в формате R1C1
Не обязательно. И скобки в ней не нужны
Код
Private Sub Worksheet_Change(ByVal Target As Range)
    trueF = "=D" & Target.Row & "*100/C" & Target.Row '"верная" формула
    Application.EnableEvents = False
    If Not Intersect(Target, [E4:E15]) Is Nothing And Target.Count = 1 Then
        If Target.Formula <> trueF Then
            MsgBox "Неверная формула!", vbCritical + vbOKOnly
            Target = Empty
        End If
    End If
    Application.EnableEvents = True
End Sub
Согласие есть продукт при полном непротивлении сторон
 
Sanja,Огромное спасибо!!!  :) Именно это и нужно было)))
Страницы: 1
Наверх