Видимо без макроса не получится. Когда выбираю МАЗ в A1 - то после выбора данных в A3 формула в этой ячейке стирается и остаётся та фамилия которая была. Потом выбирать можно но... автоматически фамилия больше не прописывается.
Видимо без макроса не получится. Когда выбираю МАЗ в A1 - то после выбора данных в A3 формула в этой ячейке стирается и остаётся та фамилия которая была. Потом выбирать можно но... автоматически фамилия больше не прописывается.DrMini
Да, это разовая акция. Тогда в Worksheet_Change добавьте что-то типа этого [vba]
Код
If Target.Address(0, 0) = "A1" Then With Range("A3") .Validation.ShowError = False .FormulaR1C1 = "=IF(R1C1=DATA!R2C1,DATA!R2C2,IF(R1C1=DATA!R3C1,DATA!R3C2,""""))" .Validation.ShowError = True .Parent.CircleInvalid .Select End With End If
[/vba]
Да, это разовая акция. Тогда в Worksheet_Change добавьте что-то типа этого [vba]
Код
If Target.Address(0, 0) = "A1" Then With Range("A3") .Validation.ShowError = False .FormulaR1C1 = "=IF(R1C1=DATA!R2C1,DATA!R2C2,IF(R1C1=DATA!R3C1,DATA!R3C2,""""))" .Validation.ShowError = True .Parent.CircleInvalid .Select End With End If
' Модуль Worksheet_Change листа "Выбор" с выпадающим списком, который при изменении запускает программу Get_Drop_Down Private Sub Worksheet_Change(ByVal Target As Range)
Dim DropDownAddress As String ' переменная адреса ячейки в выпадающим первичным списком ' ============= модуль для создания выпадающего списка - начало ==================== ' то это ячейка для создания выпадающего списка With ActiveSheet DropDownAddress = Range("$A$1").Address ' считываем адрес этой ячейки ' если целевая ячейка - пересекается с диапазоном A1 If Not Intersect(Target, Range(DropDownAddress)) Is Nothing Then
If Range("$A$1").Text Like "ГАЗ" Then ' если выбрано "ГАЗ" Range("$A$3").Value = "Иванов" ' пишем "Иванов" ' проверка на наличие выпадающего списка и если да - удаление On Error GoTo trap1 ' если произойдет ошибка при проверке ячейки на выпадающий список, идеи в trap1 Range("$A$3").Validation.Delete ' в ячейке есть выпадающий список, удаляем его. GoTo next1 ' переход к следующему условию trap1: ' в ячейке не было выпадающего списка On Error GoTo 0 'восстанавливаем код без состояния ошибки next1: ElseIf Range("$A$1").Text Like "ВАЗ" Then ' если выбрано "ВАЗ" Range("$A$3").Value = "Сидоров" ' пишем "Сидоров" ' проверка на наличие выпадающего списка и если да - удаление
On Error GoTo trap2 ' если произойдет ошибка при проверке ячейки на выпадающий список, идеи в trap2 Range("$A$3").Validation.Delete ' в ячейке есть выпадающий список, удаляем его. GoTo next2 ' переход к следующему условию trap2: ' в ячейке не было выпадающего списка On Error GoTo 0 'восстанавливаем код без состояния ошибки next2: ElseIf Range("$A$1").Text Like "МАЗ" Then ' если выбрано "МАЗ"
Call Get_Drop_Down ' запуск макроса создания выпадающего списка End If Else ' целевая ячейка - не пересекается с диапазоном А1 End If ' конец условия 1. ' ============= модуль для создания выпадающего списка - конец ====================
End With
' ============= блок проверки дат ====================
If Target.Count > 1 Then Exit Sub If Not Intersect(Target, Range("C5,AD5")) Is Nothing Then If Target.NumberFormat = "m/d/yyyy" Then Target.NumberFormat = "General" End If x_ = Target If Len(x_) = 5 Or Len(x_) = 6 Then If IsDate(Format(x_, "00\/00\/00")) Then If Mid(Format(x_, "00\/00\/00"), 4, 2) > 12 Then GoTo error_ x_ = CDate(Format(x_, "00\/00\/00")) Else: GoTo error_ End If ElseIf Len(x_) = 7 Or Len(x_) = 8 Then If IsDate(Format(x_, "00\/00\/0000")) Then If Mid(Format(x_, "00\/00\/0000"), 4, 2) > 12 Then GoTo error_ x_ = CDate(Format(x_, "00\/00\/0000")) Else: GoTo error_ End If Else: GoTo error_ End If Application.EnableEvents = False Target = x_ Application.EnableEvents = True End If Exit Sub error_: Application.EnableEvents = False Target = Empty Application.EnableEvents = True End Sub
' Модуль Worksheet_Change листа "Выбор" с выпадающим списком, который при изменении запускает программу Get_Drop_Down Private Sub Worksheet_Change(ByVal Target As Range)
Dim DropDownAddress As String ' переменная адреса ячейки в выпадающим первичным списком ' ============= модуль для создания выпадающего списка - начало ==================== ' то это ячейка для создания выпадающего списка With ActiveSheet DropDownAddress = Range("$A$1").Address ' считываем адрес этой ячейки ' если целевая ячейка - пересекается с диапазоном A1 If Not Intersect(Target, Range(DropDownAddress)) Is Nothing Then
If Range("$A$1").Text Like "ГАЗ" Then ' если выбрано "ГАЗ" Range("$A$3").Value = "Иванов" ' пишем "Иванов" ' проверка на наличие выпадающего списка и если да - удаление On Error GoTo trap1 ' если произойдет ошибка при проверке ячейки на выпадающий список, идеи в trap1 Range("$A$3").Validation.Delete ' в ячейке есть выпадающий список, удаляем его. GoTo next1 ' переход к следующему условию trap1: ' в ячейке не было выпадающего списка On Error GoTo 0 'восстанавливаем код без состояния ошибки next1: ElseIf Range("$A$1").Text Like "ВАЗ" Then ' если выбрано "ВАЗ" Range("$A$3").Value = "Сидоров" ' пишем "Сидоров" ' проверка на наличие выпадающего списка и если да - удаление
On Error GoTo trap2 ' если произойдет ошибка при проверке ячейки на выпадающий список, идеи в trap2 Range("$A$3").Validation.Delete ' в ячейке есть выпадающий список, удаляем его. GoTo next2 ' переход к следующему условию trap2: ' в ячейке не было выпадающего списка On Error GoTo 0 'восстанавливаем код без состояния ошибки next2: ElseIf Range("$A$1").Text Like "МАЗ" Then ' если выбрано "МАЗ"
Call Get_Drop_Down ' запуск макроса создания выпадающего списка End If Else ' целевая ячейка - не пересекается с диапазоном А1 End If ' конец условия 1. ' ============= модуль для создания выпадающего списка - конец ====================
End With
' ============= блок проверки дат ====================
If Target.Count > 1 Then Exit Sub If Not Intersect(Target, Range("C5,AD5")) Is Nothing Then If Target.NumberFormat = "m/d/yyyy" Then Target.NumberFormat = "General" End If x_ = Target If Len(x_) = 5 Or Len(x_) = 6 Then If IsDate(Format(x_, "00\/00\/00")) Then If Mid(Format(x_, "00\/00\/00"), 4, 2) > 12 Then GoTo error_ x_ = CDate(Format(x_, "00\/00\/00")) Else: GoTo error_ End If ElseIf Len(x_) = 7 Or Len(x_) = 8 Then If IsDate(Format(x_, "00\/00\/0000")) Then If Mid(Format(x_, "00\/00\/0000"), 4, 2) > 12 Then GoTo error_ x_ = CDate(Format(x_, "00\/00\/0000")) Else: GoTo error_ End If Else: GoTo error_ End If Application.EnableEvents = False Target = x_ Application.EnableEvents = True End If Exit Sub error_: Application.EnableEvents = False Target = Empty Application.EnableEvents = True End Sub
Public Sub Get_Drop_Down() ' макрос - сформировать зависимый выпадающий список
Dim MyList(3) As String ' массив значений зависимого выпадающего списка
MyList(0) = "" ' 1 значение MyList(1) = "Иванов" ' 2 значение MyList(2) = "Петров" ' 3 значение
Range("A3").Value = "" ' значение ячейки А3 по умолчанию
With Range("A3").Validation ' создание выпадающего списка .Delete ' удалить исходные значения .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _ Operator:=xlBetween, Formula1:=Join(MyList, ",") ' добавить список значений выпадающего списка .InCellDropdown = True ' показать выпадающий список в ячейке End With
[/vba]
и есть ещё модуль:
[vba]
Код
Public Sub Get_Drop_Down() ' макрос - сформировать зависимый выпадающий список
Dim MyList(3) As String ' массив значений зависимого выпадающего списка
MyList(0) = "" ' 1 значение MyList(1) = "Иванов" ' 2 значение MyList(2) = "Петров" ' 3 значение
Range("A3").Value = "" ' значение ячейки А3 по умолчанию
With Range("A3").Validation ' создание выпадающего списка .Delete ' удалить исходные значения .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _ Operator:=xlBetween, Formula1:=Join(MyList, ",") ' добавить список значений выпадающего списка .InCellDropdown = True ' показать выпадающий список в ячейке End With