Страницы: 1
RSS
Макрос по условию для диапазона ячеек
 
Подскажите пожалуйста. Есть такой код  
Private Sub Worksheet_Calculate()  
If Range("A1") > 2 Then  
Call Макрос1  
End If  
End Sub  
Никак не могу сделать это для диапазона ячеек А1:А10.  
И условие нужно поменять на ЕСЛИ > 2 и < 8
 
Тут только одно непонятно. Если значения всех ячеек диапазона  А1:А10 удовлетворяют условию > 2 и < 8, то только тогда запускать Макрос1?  
Или достаточно одной?  
Для одной так:  
Private Sub Worksheet_Calculate()  
Dim flag As Boolean  
For Each rr In Range("A1:A10")  
If rr.Value > 2 And rr.Value < 8 Then  
flag = True  
Exit For  
End If  
Next  
If flag Then Call Макрос1  
End Sub
 
Лузер, спасибо. Да - хотелось для проверки условия хотя бы в одной из ячеек диапазона. Этот код вставить в Лист или в Модуль?
 
{quote}{login=Sten}{date=04.05.2008 12:40}{thema=}{post}Лузер, спасибо. Да - хотелось для проверки условия хотя бы в одной из ячеек диапазона. Этот код вставить в Лист или в Модуль?{/post}{/quote}У Вас этот код где был? :)
 
Нигде еще не был. Я подсмотрел где-то сам код и только. К тому же он не срабатывал сам при изменении.
 
Попробовал в Лист1, в Модуль1, в Книгу - не срабатывает.
 
Вообще-то он нужен в исходном тексте листа.  
У Вас макросы не отключены уровнем безопасности?  
У меня работает, я проверял прежде чем выложить.
 
Безопасность макросов низкая.  
Не срабатывает. Посмотрите сам файл пожалуйста.
 
Все работает.  
Только у Вас нет формул на листе, следовательно лист не пересчитывается, следовательно событие Worksheet_Calculate не наступает.  
Может Вам нужно другое событие? Worksheet_Change, например? и отслеживать изменение диапазона A1:A10?
 
Сделал так:  
Private Sub Worksheet_Change(ByVal Target As Range)  
Dim flag As Boolean  
For Each rr In Range("A1:A10")  
If rr.Value > 2 And rr.Value < 8 Then  
flag = True  
Exit For  
End If  
Next  
If flag Then Call Макрос1  
End Sub  
Срабатывает на любую величину. Ввожу например 20 и все равно срабатывает
 
И не контролирется диапазон
 
Если пример тот же, то достаточно одного значения в А5=5, чтобы условие работало. А диапазнон не контролируется - Вы же Target не проверяете на принадлежность к A1:A10
 
Делаю А равной 40. Макрос срабатывает. Насчет контроля диапазона - странно: я ведь так и просил - для диапазона А1:А10 (для любой ячейки этого диапазона). Условие: между 2 и 8. Ничего не менялось.
 
Что такое "А равной 40" я не понял.  
Еще раз первый свой вопрос:  
Вам нужно чтобы значения ВСЕХ десяти ячеек лежали в пределах 2 и 8 для запуска макроса? Или если ОДНА (любая) ячейка принимает значение между 2 и 8, а остальные неважно?  
И еще раз отмечу, что данный код будет запускать Макрос1 при любом изменении листа, при значении любой одной ячейки из А1:А10 в меджу 2 и 8
 
Торопился и пропустил "5". А5 равной 40. Макрос сработал. Хотя не должен был. Может я невнятно формулирую задачу? Нужно: если любая из ячеек внутри диапазона А1:А10 принимает значение между 2 и 8 (>2 и <8), сработал Макрос1. На остальные ячейки листа это не должно распространяться. Спасибо за долготерпение.
 
давайте еще раз файл
 
Вот файл
 
Во-первых, у Вас в А4 стоит 5, а значит условие соблюдается. Достаточно одной ячейки со значением между 2 и 8  
Во-вторых, держите файл, который срабатывает только на изменение диапазона А1:А10
 
Лузер, извините меня ради Бога! Это мне понятно что я хочу. Видимо не совсем толково довожу свою мысль. Сейчас все работает почти так как нужно (как хотел). Попробую еще раз. Если в Вашем файле все ячейки А1:А6 заполнены например значением "3". Затем я ЛЮБУЮ ячейку контролируемого диапазона меняю на значение вне >2 И <8 (допустим меняю на значение 12), то ничего не должно произойти. А если любую из этих ячеек я поменяю на значение от 3 до 7, то должен сработать макрос. Надеюсь что на этот раз сформулировал правильно. Еще раз прошу меня извинить.
 
А дважды об этом спрашивал :)  
ВСЕ это не ЛЮБАЯ.  
для все:  
Private Sub Worksheet_Change(ByVal Target As Range)  
Dim flag As Boolean  
If Not Intersect(Target, Range("A1:A10")) Is Nothing Then  
 For Each rr In Range("A1:A10")  
   If rr.Value <= 2 Or rr.Value >= 8 Then  
     flag = True  
     Exit For  
   End If  
 Next  
 If Not flag Then Call Макрос1  
End If  
End Sub
 
Спасибо, Лузер™
 
Сразу не было возможности проверить - уезжал. А вот вернулся, включил - не работает. Может срок годности истек :-)
 
Протух однозначно :)  
Что значит не работает?  
Sten, давайте сделаем так: Вы пишете столбик из 10 чисел, при котором должно выскакивать сообщение и стобик при котором не должно.  
Может тогда будет понятно, как должно работать.
 
Все в файле. Может только на моем компюьтере код не срабатывает?
 
Любую цель люди понимают иначе, чем человек, ее указующий. (Фрэнсис Чизхолм, законы Чизхолма)  
 
Попробуем еще раз :)  
Private Sub Worksheet_Change(ByVal Target As Range)  
If Not Intersect(Target, Range("A1:A10")) Is Nothing And Target.Value > 2 And Target.Value < 8 Then Call Ìàêðîñ1  
End Sub
 
Private Sub Worksheet_Change(ByVal Target As Range)  
If Not Intersect(Target, Range("A1:A10")) Is Nothing And Target.Value > 2 And Target.Value < 8 Then Call Макрос1  
End Sub  
без кракозябров
 
Теперь - то что доктор прописал.  
Огромное спасибо.
Страницы: 1
Читают тему
Наверх