Страницы: 1 2 След.
RSS
Автоматический запуск макроса в зависимости от значения в ячейке.
 
Пусть ячейка A1 принимает только два значения: 1 или 0. Как только значение в этой ячейке принимает 1, тут же должен автоматически запускаться макрос (под именем Put-record; он вставляет строку в таблице). Если ячейка принимает значение 0 (или, допустим, какое-либо иное значение, отличное от 1), то ничего не требуется специально запускать, пока ячейка вновь не станет равной единице. Нужен VBA-код этого макроса, который бы сам мониторил ячейку A1 и запускал бы другой макрос Put-record каждый раз, как только значение ячейки A1 сменится с нуля (или с какой-л. другой цифры или значения) на единицу.
 
Вставьте этот код в модуль нужного листа.  
Private Sub Worksheet_Change(ByVal Target As Range)  
  If Not Intersect(Target, Range("A1")) Is Nothing Then  
     If Target = 1 Then  
        MsgBox "Здесь вызываем Ваш макрос"  
     End If  
  End If  
End Sub
 
Private Sub Worksheet_Change(ByVal Target As Range)  
If Not Intersect(Target, Range("A1")) Is Nothing Then  
If Target = 1 Then  
MsgBox "Put_record"  
End If  
End If  
End Sub  
 
Но этот код требует дополнительного подтверждения запуска макроса Put_record  
Очень нужно, чтоб Excel без дополнительных вопросов запускал макрос Put_record, как только A1 становится равным 1
 
Как все запущено...  
Вместо    
MsgBox "Здесь вызываем Ваш макрос"  
надо просто вставить имя вашего макроса - без кавычек  
Private Sub Worksheet_Change(ByVal Target As Range)  
If Not Intersect(Target, Range("A1")) Is Nothing Then  
If Target = 1 Then  
Put_record  
End If  
End If  
End Sub
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Хорошо, но можно, я попробовал, и так:  
 
Private Sub Worksheet_Change(ByVal Target As Range)  
If Not Intersect(Target, Range("A1")) Is Nothing Then  
If Target = 1 Then  
Application.Run "'auto-put-record.xls'!Put_record"  
End If  
End If  
End Sub  
 
Этот код работает без вопросов, но сейчас попробую и ваш. Здесь auto-put-record.xls - имя файла.
 
И ваш код работает. Спасибо вам и Юрий М !
 
Если A1 является формулой, т.е. ссылается на другие ячейки, то все эти выше указанные коды - не работаю. Что делать?
 
использовать не Private Sub Worksheet_Change(ByVal Target As Range)  
а  
Private Sub Worksheet_Calculate()  
If [A1] = 1 Then
Put_record  
End If  
End Sub  
 
Либо так(одно и то же, но меньше строк)  
Private Sub Worksheet_Calculate()  
If [A1] = 1 Then Put_record
End Sub
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Макрос автоматически вставляет строки не один раз, как требуется, а бесконечное число раз - пока не выдаст ошибку (
 
При вставке строк событие Calculate Или Change происходит? Вот макрос и будет срабатывать. Нужно отключить событие.
 
Отключайте события в событиях:  
Private Sub Worksheet_Calculate()  
Application.EnableEvents = False  
код  
Application.EnableEvents = True  
End Sub
Bite my shiny metal ass!      
 
Значит надо завести глобальную  переменную и на неё ориентироваться.  
Public bInsert as Boolean  
Private Sub Worksheet_Calculate()  
If [A1] = 1 Then
if bInsert = false then Put_record:bInsert = true  
Else  
bInsert = false  
end if  
End Sub
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
{quote}{login=Лузер™}{date=05.08.2009 01:51}{thema=}{post}Отключайте события в событиях:  
Private Sub Worksheet_Calculate()  
Application.EnableEvents = False  
код  
Application.EnableEvents = True  
End Sub{/post}{/quote}  
 
T.е. так:  
 
Private Sub Worksheet_Calculate()  
Application.EnableEvents = False  
If [A1] = 1 Then
Put_record  
End If  
Application.EnableEvents = True  
End Sub  
 
Этот код приводит к следующему дефекту: при нажатии клавиши "Enter", на любом месте, на любой ячейке Листа1, если ячейка A1 все еще остается = 1, запускается макрос Put_record. Можно ли устранить этот дефект.
 
{quote}{login=Polisimus}{date=05.08.2009 02:24}{thema=Re: }{post}при нажатии клавиши "Enter", на любом месте, на любой ячейке Листа1, если ячейка A1 все еще остается = 1, запускается макрос Put_record. Можно ли устранить этот дефект.{/post}{/quote}  
 
Я Вам написал код, который будет вставлять строку только один раз - при изменении значения в ячейке А1.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
{quote}{login=The_Prist}{date=05.08.2009 01:53}{thema=}{post}Значит надо завести глобальную  переменную и на неё ориентироваться.  
Public bInsert as Boolean  
Private Sub Worksheet_Calculate()  
If [A1] = 1 Then
if bInsert = false then Put_record:bInsert = true  
Else  
bInsert = false  
end if  
End Sub{/post}{/quote}  
 
 
А этот код привел к очередному зацикливанию (код находится в модуле Листа1)
 
Polisimus, Я Вам дал пример для одного события. Отключать надо везде, что Вам и посоветовал Юрий М.
Bite my shiny metal ass!      
 
{quote}{login=Юрий М}{date=05.08.2009 01:51}{thema=}{post}При вставке строк событие Calculate Или Change происходит? Вот макрос и будет срабатывать. Нужно отключить событие.{/post}{/quote}  
 
Вот макрос вставки:  
Sub Put_record()  
 
   Rows("7:7").Select  
   Selection.Insert Shift:=xlDown  
   Range("A8").Select  
   Selection.AutoFill Destination:=Range("A7:A8"), Type:=xlFillDefault  
   Range("A7:A8").Select  
   Range("A8").Select  
   Selection.Copy  
   Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _  
       :=False, Transpose:=False  
   Application.CutCopyMode = False  
   Range("A4").Select  
End Sub  
 
А вот формула в ячейке A7 =A$4+A$5  
При этом A1 - ссылается на другие ячейки
 
С вашей помощью и с помощью своей интуиции. Ваши коды + плюс интуиция - вот что вышло:  
 
Public bInsert As Boolean  
Private Sub Worksheet_Calculate()  
Application.EnableEvents = False  
If [A1] = 1 Then
If bInsert = False Then Put_record: bInsert = True  
Else  
bInsert = False  
End If  
Application.EnableEvents = True  
End Sub  
 
 
Спасибо всем вам, господа программисты, и моей интуиции.
 
Кажется нашел что нужно. Подскажите каким образом изменить код что бы второй макрос удалял действия первого макроса
 
Запишите макрорекордером все действия, которые требуются для "восстановления" после работы первого макроса. Может Вы про "откат" до момента работы первого макроса?
 
При выборе "1" у меня вставляется таблица (макрос1), если я  выберу "2" то эта таблица должна удалиться (макрос2). Я понимаю что тот же самый код только с другими значениями может использоваться. Вот только как их связать, эти коды, я не знаю.
 
Ну так и запишите удаление этой таблицы.
 
{quote}{login=Юрий М}{date=09.09.2010 03:42}{thema=}{post}Ну так и запишите удаление этой таблицы.{/post}{/quote}  
Макрос я записал а как его запустить при выборе "2"?
 
А я знаю где у Вас выбирается "1"?
 
Извините, на примере выше указанного кода A1
 
If [A1] = 1 Then
Call Макрос1  
ElseIf [A1] = 2 Then
Call Макрос2  
End If
 
{quote}{login=Юрий М}{date=09.09.2010 03:53}{thema=}{post}If [A1] = 1 Then
Call Макрос1  
ElseIf [A1] = 2 Then
Call Макрос2  
End If{/post}{/quote}  
Не получается, посмотрите пожалуйста вложение
 
Удалите всё из модуля листа и вставьте туда этот код:  
Private Sub Worksheet_Change(ByVal Target As Range)  
   If Target.Cells.Count > 1 Then Exit Sub  
   If Not Intersect(Target, Range("A1")) Is Nothing Then  
       If Target = 1 Then  
           Call Макрос1  
           ElseIf Target = 2 Then  
           Call Макрос2  
       End If  
   End If  
End Sub
 
Заработало, ура. Спасибо!
 
Public bInsert As Boolean  
Private Sub Worksheet_Calculate()  
Application.EnableEvents = False  
If [A1] = 1 Then
If bInsert = False Then Put_record: bInsert = True  
Else  
bInsert = False  
End If  
Application.EnableEvents = True  
End Sub  
 
А как изменить этот код, чтобы он запускал второй макрос (Put_record2) при значении А1 = 2, 3, 5?
Страницы: 1 2 След.
Читают тему
Наверх