Здравствуйте, уважаемые! Ковыряю новую для меня тему макросов. Если без особых подробностей - в файле есть макрос "W_Change" который по условию присваивает ячейке С16 текстовое значение. Так вот он один раз срабатывает, а повторно (если удалить значения из С15-16), ничего не происходит. Можете подсказать, где пробел в моих чайниковских знаниях? [vba]
Код
Private Sub W_Change(ByVal Target As Range) Application.ScreenUpdating = 0 Application.EnableEvents = False If Target.Cells.Count > 1 Then Exit Sub If Target.Cells.Value = "Заказ" Then Range("C16") = "этап2" Else: Exit Sub End If Application.EnableEvents = True End Sub
[/vba] А вообще хотел сделать, чтобы при выборе из списка значения в ячеке С15 в нижележащих ячейках появились значения из ряда Списки!T2:Z2
Здравствуйте, уважаемые! Ковыряю новую для меня тему макросов. Если без особых подробностей - в файле есть макрос "W_Change" который по условию присваивает ячейке С16 текстовое значение. Так вот он один раз срабатывает, а повторно (если удалить значения из С15-16), ничего не происходит. Можете подсказать, где пробел в моих чайниковских знаниях? [vba]
Код
Private Sub W_Change(ByVal Target As Range) Application.ScreenUpdating = 0 Application.EnableEvents = False If Target.Cells.Count > 1 Then Exit Sub If Target.Cells.Value = "Заказ" Then Range("C16") = "этап2" Else: Exit Sub End If Application.EnableEvents = True End Sub
[/vba] А вообще хотел сделать, чтобы при выборе из списка значения в ячеке С15 в нижележащих ячейках появились значения из ряда Списки!T2:Z2pabchek
Private Sub W_Change(ByVal Target As Range) Application.ScreenUpdating = 0 Application.EnableEvents = False ' отключаем обработку событий If Target.Cells.Count > 1 Then Exit Sub If Target.Cells.Value = "Заказ" Then Range("C16") = "этап2" Else: Exit Sub ' кто обработку событий включать будет? End If Application.EnableEvents = True ' отключаем обработку событий End Sub
[/vba] [p.s.]строка Else: Exit Sub просто лишняя И здесь If Target.Cells.Count > 1 Then Exit Sub порядок строк неверный [/p.s.]
[vba]
Код
Private Sub W_Change(ByVal Target As Range) Application.ScreenUpdating = 0 Application.EnableEvents = False ' отключаем обработку событий If Target.Cells.Count > 1 Then Exit Sub If Target.Cells.Value = "Заказ" Then Range("C16") = "этап2" Else: Exit Sub ' кто обработку событий включать будет? End If Application.EnableEvents = True ' отключаем обработку событий End Sub
[/vba] [p.s.]строка Else: Exit Sub просто лишняя И здесь If Target.Cells.Count > 1 Then Exit Sub порядок строк неверный [/p.s.]RAN
Быть или не быть, вот в чем загвоздка!
Сообщение отредактировал RAN - Понедельник, 01.02.2016, 17:17
Вот-вот. EnableEvents все портит. Если в теле макроса много выходов, то можно что-то типа вот так сделать. Если выходов мало и EnableEvents нужен только для маленького кусочка, то у Андрея ниже вообще классика. [vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) Application.ScreenUpdating = 0 Application.EnableEvents = False If Target.Cells.Count > 1 Then GoTo A If Target.Value = "Заказ" Then Range("C16") = "этап2" ' Else: GoTo A End If A: Application.EnableEvents = True End Sub
[/vba] С EnableEvents вообще очень аккуратно нужно. Я иногда даже допускаю, чтобы событие несколько раз отработало, лишь бы EnableEvents не выключать. Это, конечно, не есть хорошо, но на легких макросах "да и ладно"
Вот-вот. EnableEvents все портит. Если в теле макроса много выходов, то можно что-то типа вот так сделать. Если выходов мало и EnableEvents нужен только для маленького кусочка, то у Андрея ниже вообще классика. [vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) Application.ScreenUpdating = 0 Application.EnableEvents = False If Target.Cells.Count > 1 Then GoTo A If Target.Value = "Заказ" Then Range("C16") = "этап2" ' Else: GoTo A End If A: Application.EnableEvents = True End Sub
[/vba] С EnableEvents вообще очень аккуратно нужно. Я иногда даже допускаю, чтобы событие несколько раз отработало, лишь бы EnableEvents не выключать. Это, конечно, не есть хорошо, но на легких макросах "да и ладно"_Boroda_
Private Sub Worksheet_Change(ByVal Target As Range) ' Application.ScreenUpdating = 0 ' зачем? If Target.Cells.Count > 1 Then Exit Sub If Target.Cells.Value = "Заказ" Then Application.EnableEvents = False Range("C16") = "этап2" Application.EnableEvents = True End If End Sub
[/vba]
Издержки копи-паста [vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) ' Application.ScreenUpdating = 0 ' зачем? If Target.Cells.Count > 1 Then Exit Sub If Target.Cells.Value = "Заказ" Then Application.EnableEvents = False Range("C16") = "этап2" Application.EnableEvents = True End If End Sub
If Target.Cells.Count > 1 Then Exit Sub Application.EnableEvents = False If Target.Cells.Value = "Заказ" Then Range("C16") = "этап2" Application.EnableEvents = True End Sub
[/vba]
или так [vba]
Код
Private Sub W_Change(ByVal Target As Range)
If Target.Cells.Count > 1 Then Exit Sub Application.EnableEvents = False If Target.Cells.Value = "Заказ" Then Range("C16") = "этап2" Application.EnableEvents = True End Sub
Private Sub Worksheet_Change(ByVal Target As Range) If Target.Cells.Count > 1 Then Exit Sub Application.ScreenUpdating = 0 Application.EnableEvents = False If Target.Cells.Value = "Заказ" Then этап2 = WorksheetFunction.Transpose(Sheets("Списки").Range("T2:Z2").Value) Range("C16").Resize(UBound(этап2), 1) = этап2 End If Application.EnableEvents = True Application.ScreenUpdating = 1 End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range) Application.ScreenUpdating = 0 Dim addr As String Dim x As Variant NoEvents = Range("C4") Dim rng, c, r, cll As String
If NoEvents = False Then Exit Sub If Target.Cells.Count > 1 Then Exit Sub addr = ActiveCell.Address() x = Split(addr, "$") c = x(1) r = x(2) rng = c & ":" & c & "," & r & ":" & r Range(rng).Select cll = c & r Range(cll).Activate End Sub
[/vba]
За вами не угонишся :'(
[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) If Target.Cells.Count > 1 Then Exit Sub Application.ScreenUpdating = 0 Application.EnableEvents = False If Target.Cells.Value = "Заказ" Then этап2 = WorksheetFunction.Transpose(Sheets("Списки").Range("T2:Z2").Value) Range("C16").Resize(UBound(этап2), 1) = этап2 End If Application.EnableEvents = True Application.ScreenUpdating = 1 End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range) Application.ScreenUpdating = 0 Dim addr As String Dim x As Variant NoEvents = Range("C4") Dim rng, c, r, cll As String
If NoEvents = False Then Exit Sub If Target.Cells.Count > 1 Then Exit Sub addr = ActiveCell.Address() x = Split(addr, "$") c = x(1) r = x(2) rng = c & ":" & c & "," & r & ":" & r Range(rng).Select cll = c & r Range(cll).Activate End Sub
На понимание с моей стороны пока времени не было. Тем не менее, проверил все ваши предложения. Итог: _Boroda_, RAN, работают. Udik, к сожалению, нет. doober, работает, + еще и моя вторая хотелка сделана - спасибо! И всем большое спасибо! Теперь разобраться бы еще
На понимание с моей стороны пока времени не было. Тем не менее, проверил все ваши предложения. Итог: _Boroda_, RAN, работают. Udik, к сожалению, нет. doober, работает, + еще и моя вторая хотелка сделана - спасибо! И всем большое спасибо! Теперь разобраться бы еще pabchek
"Учиться, учиться и еще раз учиться!" WM: R399923528092