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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.08.2011, 16:35   #1
Ellienn
 
Регистрация: 19.12.2010
Сообщений: 8
По умолчанию Изменение ячеек при копировании

Здравствуйте!
Столкнулась с такой проблемой. Для расчета различных цен и скидок необходимо было прописать зависимости значений одних ячеек от других, например, если заполнена такая и такая колонка, то такую-то цену считаем так-то, а если такая-то колонка не заполнена - цену пересчитываем по другому. Код реализовала на событие листа Change


Private Sub Worksheet_Change(ByVal Target As Range)

If ((Target.Row > 15) And (Target.Row < 516) And (Target.Column < 19)) Then

If ((Target.Column = 7) And (sell <> 1)) Then

If ((Target.Offset(0, 3).Value = 0) And (Target.Offset(0, 2).Value = 0) And (Target.Offset(0, 5).Value = 0) And (Target.Offset(0, 6).Value = 0)) Then
totalsell = 1
Target.Offset(0, 1) = Target.Offset(0, 0) * Target.Offset(0, -4)
End If

If (Target.Offset(0, 3).Value <> 0) Then
totalsell = 1
add = 1
Target.Offset(0, 2) = ((Target.Offset(0, 0) / Target.Offset(0, 3)) - 1) * 100
Target.Offset(0, 1) = Target.Offset(0, 0) * Target.Offset(0, -4)
End If
totalsell = 0
add = 0
End If
End Sub


Если я ввожу данные построчно - все считается идеально, проблем нет. Но, если я скопирую в колонку 2 и больше строки (остальные колонки должны просчитаться с помощью кода) - тут же выдается ошибка на строке
If ((Target.Offset(0, 3).Value = 0) And (Target.Offset(0, 2).Value = 0) And (Target.Offset(0, 5).Value = 0) And (Target.Offset(0, 6).Value = 0)) Then
и просчет, естественно, не происходит

Не могу понять почему так и как с этим бороться
Ellienn вне форума Ответить с цитированием
Старый 29.08.2011, 16:44   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
Не могу понять почему так
В коде вы сравниваете ячейку с нулём:
Код:
Target.Offset(0, 3).Value = 0
Если изменилось ячеек больше, чем одна, то Target ссылается не на одну ячейку, а на диапазон, и, соответственно, его Value представляет собой уже не одно значение (которое можно сравнить с нулём), а массив значений, который так просто с нулем не сравнить.

Цитата:
как с этим бороться
Вариантов 2:
1) исправить макрос, предусмотрев возможность множественного изменения ячеек
2) прикрепить файл, чтобы местные спецы заменили вам всё это безобразие на формулы.

Я бы рекомендовал 2-й вариант.
Впрочем, и с первым вариантом вам вряд ли помогут без прикреплённого файла.
EducatedFool вне форума Ответить с цитированием
Старый 29.08.2011, 16:52   #3
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Если уж так нужен макрос - то выглядеть он должен как-то так:

Код:
Private Sub Worksheet_Change(ByVal Target As Range)

    ' пересечение изменённого диапазона с интересующим нас диапазоном
    Dim ra As Range, cell As Range: Set ra = Intersect(Target, [g16:g515])

    If ra Is Nothing Then Exit Sub    ' интересующие нас ячейки не были изменены - выходим из макроса

    On Error Resume Next
    Application.EnableEvents = False    ' временно отключаем сработку событий листа

    For Each cell In ra.Cells    '  перебираем изменённые ячейки

        With cell    ' вычисления над очередной изменённой ячейкой
            If ((.Offset(0, 3) = 0) And (.Offset(0, 2) = 0) And (.Offset(0, 5) = 0) And (.Offset(0, 6) = 0)) Then
                totalsell = 1
                .Offset(0, 1) = .Offset(0, 0) * .Offset(0, -4)
            End If

            If (.Offset(0, 3) <> 0) Then
                totalsell = 1
                Add = 1
                .Offset(0, 2) = ((.Offset(0, 0) / .Offset(0, 3)) - 1) * 100
                .Offset(0, 1) = .Offset(0, 0) * .Offset(0, -4)
            End If
            totalsell = 0
            Add = 0
        End With
    Next cell

    Application.EnableEvents = True    ' включаем обратно сработку событий листа
End Sub
EducatedFool вне форума Ответить с цитированием
Старый 30.08.2011, 13:51   #4
Ellienn
 
Регистрация: 19.12.2010
Сообщений: 8
По умолчанию

Спасибо, исправила макрос, все работает!
Ellienn вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Несхождения при копировании файлов Drobot Общие вопросы C/C++ 3 21.09.2010 15:39
Перезапись при копировании/перемещении Shouldercannon Общие вопросы Delphi 4 12.09.2010 02:32
Почему ошибка при копировании? valerij Microsoft Office Excel 8 02.05.2009 01:49
Вопрос о копировании ячеек с данными gege Microsoft Office Excel 4 11.11.2008 09:29
Ошибка при копировании столбца в Excel! antonchik Microsoft Office Excel 1 29.07.2008 07:48