Sub Список() Dim il As Long, i As Long, x As Integer Dim arr() Sheets(2).Columns(1).Clear If Cells(2, 5).Value = "Тема1" Then x = 1 'Номер столбца If Cells(2, 5).Value = "Тема2" Then x = 2 il = Cells(Rows.Count, x).End(xlUp).Row With CreateObject("Scripting.Dictionary") For i = 2 To il If Not .exists(Cells(i, x).Value) Then .Add Key:=Cells(i, x).Value, Item:="" Next i arr = Application.Transpose(.keys) End With Set r = Sheets(2).Cells(1).Resize(UBound(arr), 1) r.Value = arr Cells(2, 7).Validation.Delete Cells(2, 7).Validation.Add Type:=xlValidateList, Formula1:="=" & Sheets(2).Name & "!" & r.Address End Sub
[/vba]
Вот вариант со словариком [vba]
Код
Sub Список() Dim il As Long, i As Long, x As Integer Dim arr() Sheets(2).Columns(1).Clear If Cells(2, 5).Value = "Тема1" Then x = 1 'Номер столбца If Cells(2, 5).Value = "Тема2" Then x = 2 il = Cells(Rows.Count, x).End(xlUp).Row With CreateObject("Scripting.Dictionary") For i = 2 To il If Not .exists(Cells(i, x).Value) Then .Add Key:=Cells(i, x).Value, Item:="" Next i arr = Application.Transpose(.keys) End With Set r = Sheets(2).Cells(1).Resize(UBound(arr), 1) r.Value = arr Cells(2, 7).Validation.Delete Cells(2, 7).Validation.Add Type:=xlValidateList, Formula1:="=" & Sheets(2).Name & "!" & r.Address End Sub
Я бы тоже. И, поскольку в 2003 диапазон проверки нельзя делать на другой лист, то засунул бы его в именованный диапазон (Контрл F3) [vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address(0, 0) <> "E2" Then Exit Sub Select Case Target.Value Case "Тема1" c_ = 1 Case "Тема2" c_ = 2 Case Else Exit Sub End Select r1_ = Cells(Rows.Count, c_).End(xlUp).Row - 1 ar = Cells(2, c_).Resize(r1_) Set slov = CreateObject("Scripting.Dictionary") With slov For i = 1 To r1_ If Not IsEmpty(ar(i, 1)) Then aaa = .Item(CStr(ar(i, 1))) End If Next i Sheets(2).Columns(1).ClearContents Sheets(2).Cells(1).Resize(.Count) = Application.Transpose(.Keys) ActiveWorkbook.Names.Add Name:="spis", RefersTo:="=Лист2!$A$1:$A$" & .Count End With End Sub
Я бы тоже. И, поскольку в 2003 диапазон проверки нельзя делать на другой лист, то засунул бы его в именованный диапазон (Контрл F3) [vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address(0, 0) <> "E2" Then Exit Sub Select Case Target.Value Case "Тема1" c_ = 1 Case "Тема2" c_ = 2 Case Else Exit Sub End Select r1_ = Cells(Rows.Count, c_).End(xlUp).Row - 1 ar = Cells(2, c_).Resize(r1_) Set slov = CreateObject("Scripting.Dictionary") With slov For i = 1 To r1_ If Not IsEmpty(ar(i, 1)) Then aaa = .Item(CStr(ar(i, 1))) End If Next i Sheets(2).Columns(1).ClearContents Sheets(2).Cells(1).Resize(.Count) = Application.Transpose(.Keys) ActiveWorkbook.Names.Add Name:="spis", RefersTo:="=Лист2!$A$1:$A$" & .Count End With End Sub
Здравствуйте! Большое спасибо всем откликнувшимся на тему! Макрос от Boroda подходит и все-же... Вопрос для меня решен не до конца, а именно возможно ли макросом в 2003-ем сделать выпадающий список чисел (в том числе дробных), чтобы при выборе из этого списка в ячейке получалось число а не текст? Пробовал разные манипуляции с форматами ячеек, преобразованием текста в числа - пока не получается желаемый результат... Еще раз всем спасибо!
Здравствуйте! Большое спасибо всем откликнувшимся на тему! Макрос от Boroda подходит и все-же... Вопрос для меня решен не до конца, а именно возможно ли макросом в 2003-ем сделать выпадающий список чисел (в том числе дробных), чтобы при выборе из этого списка в ячейке получалось число а не текст? Пробовал разные манипуляции с форматами ячеек, преобразованием текста в числа - пока не получается желаемый результат... Еще раз всем спасибо!pechkin
Сообщение отредактировал pechkin - Суббота, 09.06.2018, 08:15
возможно ли макросом......чтобы при выборе из этого списка в ячейке получалось число
Да, возможно. Для этого в качестве источника данных следует указывать диапазон листа. Но Ваш вопрос, насколько я понял, заключается в том, возможно ли в свойство Validation.Formula1 записать массив, содержащий число с разделителем запятая. Это свойство не поддерживает региональные локали, и в этом массиве может быть записано только число с разделителем точка. А при попытке вставить это число из списка на лист, Excel перехватывает управление, и превращает число в дату (если может). Измените в своем макросе строку, и проследите результат. [vba]
возможно ли макросом......чтобы при выборе из этого списка в ячейке получалось число
Да, возможно. Для этого в качестве источника данных следует указывать диапазон листа. Но Ваш вопрос, насколько я понял, заключается в том, возможно ли в свойство Validation.Formula1 записать массив, содержащий число с разделителем запятая. Это свойство не поддерживает региональные локали, и в этом массиве может быть записано только число с разделителем точка. А при попытке вставить это число из списка на лист, Excel перехватывает управление, и превращает число в дату (если может). Измените в своем макросе строку, и проследите результат. [vba]