Sub DropDownList() Sheet1.Range("S6:X6").Select Range(Selection, Selection.End(xlDown)).Select With Selection.Validation .Delete .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _ xlBetween, Formula1:="='Sheet2'!$A$2:$A$341" .IgnoreBlank = True .InCellDropdown = True .InputTitle = "" .ErrorTitle = "" .InputMessage = "" .ErrorMessage = "" .ShowInput = True .ShowError = True End With End Sub
[/vba]
Подскажите, пожалуйста:
* после выполнения кода хотелось бы сделать так, чтобы область со списком не выделялась (чтобы код выполнялся тихо, без визуальных "эффектов". Сейчас он выбирает диапазон и остается он выделенным. А делать смену фокуса вот этим[vba]
Код
Selection.Cells(1).Select
[/vba] не хочется); * список выбора динамический (добавляю или удаляю элементы, периодически), как бы задать именно область из листа 2 начиная с A2 и до последней ячейки (список непрерывный).
Суть в том, чтобы на листе 1 в ячейках с S6:X6 и до последней заполненной строки вниз под этим диапазоном, всегда был актуальный список из листа 2 (с ячейки A2 и до последней заполненной ячейки вниз) [moder]Дайте более конкретное название теме.[/moder]
Книга и код
[vba]
Код
Sub DropDownList() Sheet1.Range("S6:X6").Select Range(Selection, Selection.End(xlDown)).Select With Selection.Validation .Delete .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _ xlBetween, Formula1:="='Sheet2'!$A$2:$A$341" .IgnoreBlank = True .InCellDropdown = True .InputTitle = "" .ErrorTitle = "" .InputMessage = "" .ErrorMessage = "" .ShowInput = True .ShowError = True End With End Sub
[/vba]
Подскажите, пожалуйста:
* после выполнения кода хотелось бы сделать так, чтобы область со списком не выделялась (чтобы код выполнялся тихо, без визуальных "эффектов". Сейчас он выбирает диапазон и остается он выделенным. А делать смену фокуса вот этим[vba]
Код
Selection.Cells(1).Select
[/vba] не хочется); * список выбора динамический (добавляю или удаляю элементы, периодически), как бы задать именно область из листа 2 начиная с A2 и до последней ячейки (список непрерывный).
Суть в том, чтобы на листе 1 в ячейках с S6:X6 и до последней заполненной строки вниз под этим диапазоном, всегда был актуальный список из листа 2 (с ячейки A2 и до последней заполненной ячейки вниз) [moder]Дайте более конкретное название теме.[/moder]w00t
Sub DropDownList() With Range(Sheet1.Range("S6:X6"), Sheet1.Range("S6:X6").End(xlDown)).Validation .Delete .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _ xlBetween, Formula1:="=list" .IgnoreBlank = True .InCellDropdown = True .InputTitle = "" .ErrorTitle = "" .InputMessage = "" .ErrorMessage = "" .ShowInput = True .ShowError = True End With End Sub
[/vba] [p.s.]А тему переназовите как-то так: "Не выделять ячейки при создании выпадающего списка". А то все равно не понятно, что конкретно нужно сделать.[/p.s.]
w00t, для списка можно создать именованный диапазон:
Sub DropDownList() With Range(Sheet1.Range("S6:X6"), Sheet1.Range("S6:X6").End(xlDown)).Validation .Delete .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _ xlBetween, Formula1:="=list" .IgnoreBlank = True .InCellDropdown = True .InputTitle = "" .ErrorTitle = "" .InputMessage = "" .ErrorMessage = "" .ShowInput = True .ShowError = True End With End Sub
[/vba] [p.s.]А тему переназовите как-то так: "Не выделять ячейки при создании выпадающего списка". А то все равно не понятно, что конкретно нужно сделать.[/p.s.]Manyasha
1. Если ниже строки 6 ничего нет, то, возможно, не стоит засовывать проверку в (1 048 576 - 5) * 6 = 6 291 426 ячеек? Положим ее только в строку 6. 2. Имя для диапазона я написал вот так:
3. End(xlDown) найдет ячейку перед ПЕРВОЙ незаполненной, а вот End(xlUp) найдет как раз ПОСЛЕДНЮЮ заполненную 4. ...Range("S6:X6").End(xlDown)).Row будет искать только по первому столбцу диапазона - S. А если последняя заполненная не в S, а в W, например? Я бы вот так сделал: [vba]
Код
Sub DropDownList() r_ = 6 For i = 19 To 24 r1_ = Cells(Rows.Count, i).End(xlUp).Row If r1_ > r_ Then r_ = r1_ Next i With Range("S6:X" & r_).Validation .Delete .Add Type:=xlValidateList, Formula1:="=спис" End With End Sub
[/vba]
1. Если ниже строки 6 ничего нет, то, возможно, не стоит засовывать проверку в (1 048 576 - 5) * 6 = 6 291 426 ячеек? Положим ее только в строку 6. 2. Имя для диапазона я написал вот так:
3. End(xlDown) найдет ячейку перед ПЕРВОЙ незаполненной, а вот End(xlUp) найдет как раз ПОСЛЕДНЮЮ заполненную 4. ...Range("S6:X6").End(xlDown)).Row будет искать только по первому столбцу диапазона - S. А если последняя заполненная не в S, а в W, например? Я бы вот так сделал: [vba]
Код
Sub DropDownList() r_ = 6 For i = 19 To 24 r1_ = Cells(Rows.Count, i).End(xlUp).Row If r1_ > r_ Then r_ = r1_ Next i With Range("S6:X" & r_).Validation .Delete .Add Type:=xlValidateList, Formula1:="=спис" End With End Sub
Насчет предварительной сортировки - сделал в VBA, подумал, что так будет лучше, чем делать в формуле
[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) Dim tValue As Variant, rOffset As Long, cOffset As Long
With Target If .Column = 1 Then tValue = .Cells(1, 1).Value rOffset = ActiveCell.Row - .Row cOffset = ActiveCell.Column - .Column
With Columns(1) With Range(.Cells(2, 1), .Cells(Rows.Count, 1).End(xlUp)).EntireRow .Sort key1:=.Cells(1, 1), order1:=xlAscending, Header:=xlNo End With With .Find(tValue, after:=.Cells(1, 1), LookIn:=xlValues, lookat:=xlWhole) Application.Goto .Cells If .Row = 2 And rOffset = -1 Then rOffset = 0 .Offset(rOffset, cOffset).Select End With End With End If End With Application.EnableEvents = True End Sub
Я бы вот так сделал: Sub DropDownList() r_ = 6 For i = 19 To 24 r1_ = Cells(Rows.Count, i).End(xlUp).Row If r1_ > r_ Then r_ = r1_ Next i With Range("S6:X" & r_).Validation .Delete .Add Type:=xlValidateList, Formula1:="=спис" End With End Sub
по этой части, если будет возможность кому-то меня сориентировать, - как найти последнюю строку, ориентируясь на заливку ячеек. Все то же самое (но достаточно будет, если Range ("F6:F") имеет заливку строк). То выпадающий список на S6:X и до самой последней строки с заливкой (ту, которую по F6:F найдем?).
Вообще, начиная с 6 строки, непрерывная заливка на большой диапазон, просто по столбу F с 6 строки и по конец залитых цветом найти бы границы (залитых цветом, любым). И на соответствующий диапазон S6:X - выпадающий? [moder]Хоть я и мало что понял из этого поста, но почему-то кажется, что это тянет на новый вопрос, а не на продолжение текущего[/moder]
Насчет предварительной сортировки - сделал в VBA, подумал, что так будет лучше, чем делать в формуле
[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) Dim tValue As Variant, rOffset As Long, cOffset As Long
With Target If .Column = 1 Then tValue = .Cells(1, 1).Value rOffset = ActiveCell.Row - .Row cOffset = ActiveCell.Column - .Column
With Columns(1) With Range(.Cells(2, 1), .Cells(Rows.Count, 1).End(xlUp)).EntireRow .Sort key1:=.Cells(1, 1), order1:=xlAscending, Header:=xlNo End With With .Find(tValue, after:=.Cells(1, 1), LookIn:=xlValues, lookat:=xlWhole) Application.Goto .Cells If .Row = 2 And rOffset = -1 Then rOffset = 0 .Offset(rOffset, cOffset).Select End With End With End If End With Application.EnableEvents = True End Sub
Я бы вот так сделал: Sub DropDownList() r_ = 6 For i = 19 To 24 r1_ = Cells(Rows.Count, i).End(xlUp).Row If r1_ > r_ Then r_ = r1_ Next i With Range("S6:X" & r_).Validation .Delete .Add Type:=xlValidateList, Formula1:="=спис" End With End Sub
по этой части, если будет возможность кому-то меня сориентировать, - как найти последнюю строку, ориентируясь на заливку ячеек. Все то же самое (но достаточно будет, если Range ("F6:F") имеет заливку строк). То выпадающий список на S6:X и до самой последней строки с заливкой (ту, которую по F6:F найдем?).
Вообще, начиная с 6 строки, непрерывная заливка на большой диапазон, просто по столбу F с 6 строки и по конец залитых цветом найти бы границы (залитых цветом, любым). И на соответствующий диапазон S6:X - выпадающий? [moder]Хоть я и мало что понял из этого поста, но почему-то кажется, что это тянет на новый вопрос, а не на продолжение текущего[/moder]w00t
Сообщение отредактировал _Boroda_ - Среда, 25.05.2016, 09:53