Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: обьект Target в событии Worksheet_Change  (Прочитано 20010 раз)
0 Пользователей и 5 Гостей смотрят эту тему.
_serj_
Гость
« : 21-08-2007 09:58 » new

Здравствуйте. Прошу вашего внимания.
Мне необходимо при изменении ячейки входящей в диапозон Ax:Dx програмно изменить ячейку Ex, где x номер одной сроки. Задачау я эту реализовал, но при изминеии ячейки идет пересчет всей книги, а книга с множеством ссылок и огромной структурой. Такая маленькая база массивом примерно 2500x45 на одном листе, и 7 листов ссылаются на этот массив. Одним словом куча вычислений. Почему присходит перерасчет. Как этого избежать. Надеюсь понятно написал. Заранее благодарю за ваше внимание. Спасибо
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 21-08-2007 10:27 » 

_serj_, код покажи, может где то рефреш делаешь
Записан

_serj_
Гость
« Ответ #2 : 21-08-2007 11:38 » 

Вот такой незамысловатый код получается:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Value <> 0 Then Cells(Target.Row, 4).Value = "ОК"
End Sub
<!--Еще подскажите пожалуйста как в условии можно диапазон указать для этого объекта
« Последнее редактирование: 21-08-2007 12:31 от _serj_ » Записан
_serj_
Гость
« Ответ #3 : 21-08-2007 12:08 » 

А еще если я вставляю диапазон из Буфера обмена выдает ошибку Type Mismatch, как справитсья с этой проблемой?
Записан
HandKot
Молодой специалист

ru
Offline Offline

« Ответ #4 : 22-08-2007 06:02 » 

Цитата
Мне необходимо при изменении ячейки входящей в диапозон Ax:Dx програмно изменить ячейку Ex, где x номер одной сроки
Код:
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim r As Range
   
    Set r = Range("$A:$D")  'устанавливаем диапозон для проверки столбцы  с A по D
       
    If Not (Intersect(r, Target) Is Nothing) Then
        Cells(Target.Row, 5).Value = "Ok"    'столбец Е имеет номер 5
    End If
End Sub


Цитата
Почему присходит перерасчет. Как этого избежать
отключите автоматический перерасчет
Записан

I Have Nine Lives You Have One Only
THINK!
_serj_
Гость
« Ответ #5 : 22-08-2007 06:18 » 

Огромнейшее вам спасибо, работает все как надо, как я и хотел. Перерасчет отключать не пришлось, работает быстро.
Записан
_serj_
Гость
« Ответ #6 : 22-08-2007 08:02 » 

Еще один вопрос. Каким способом можно проверить какой символ я вставляю в диапазон Ax:Dx, если Проверяю Target.Value то работает. Но мне необходимо вставлять скопированные такой же размерности диапазоны. Отладчик ругается на Target.Value сообщением Type Mismatch когда я вставляю диапазон из буфера

Private Sub Worksheet_Change(ByVal Target As Range)
  Dim r As Range
  Set r = Range("$J:$N")
 
  If Target.Validation <> 1 Then
  If Not (Intersect(r, Target) Is Nothing) Then
    Cells(Target.Row, 15).Value = "ОК"
  End If
  End If
 
  If Target.Value = 1 Then
    If Not (Intersect(r, Target) Is Nothing) Then
    Cells(Target.Row, 15).Value = ""
  End If
  End If
End Sub
Записан
HandKot
Молодой специалист

ru
Offline Offline

« Ответ #7 : 22-08-2007 08:53 » 

Как Вам известно то ByVal Target As Range, у объекта типа Range нет св-ва Value поэтому и возникает ошибка
Если Вы вставляете несколько ячеек, то нужно просто пройтись по всем ячейкам range


а что Вы хотите сделать вот этим
Код:
If Target.Validation <> 1 Then
...
If Target.Value = 1 Then
?
Записан

I Have Nine Lives You Have One Only
THINK!
_serj_
Гость
« Ответ #8 : 23-08-2007 05:22 » 

Вместо Validation стоит Value, синтаксическая ошибка.
Записан
_serj_
Гость
« Ответ #9 : 23-08-2007 06:23 » 

Ну вроде со всем разобрался. Спасибо всем огромное. Оправдали все ожидания
Записан
HandKot
Молодой специалист

ru
Offline Offline

« Ответ #10 : 23-08-2007 07:16 » 

позволю себе доработать код
Код:
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim r As Range
    Dim c As Range
 
    'задаем диапозон отслеживания изменений
    Set r = Range("$J:$N")
 
    'если изменения произошлди в заданном диапозоне, то
    If Not (Intersect(r, Target) Is Nothing) Then
        'бежим по всем ячекам изменненого диапозона
        For Each c In Target.Cells
            If c.Value <> 1 Then
                Cells(c.Row, 15).Value = "Ok"
            Else
                Cells(c.Row, 15).Value = ""
            End If
        Next
    End If
End Sub
Записан

I Have Nine Lives You Have One Only
THINK!
_serj_
Гость
« Ответ #11 : 23-08-2007 07:38 » 

Мои коды можно считать уродскими, я это понимаю. На VBA раньше программировать не приходилось, еще не притерся. А так код почти такой же получился, строчек на десять побольше Улыбаюсь) Спасибо тебе HandKot
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines