[moder]Решила все-таки разделить темы. Начало тут[/moder] Дело в том, что некоторые объекты в экселе, хотят в качестве аргумента видеть тоже объекты экселя, как я понимаю. Например, в приложенном файле хочу DropDowns(1) заполнить значениями ячеек по горизонтали (значениями, какой-либо строчки). Но на сколько я понял, для данного объекта, заполнение работает только, если будут ячейки определённого столбца (только по вертикали) и как я понял, ячейки должны быть обязательно смежными, только тогда у меня корректно заполняется DropDowns(1). Думал, что можно записать туда данные из что-то типа "массива", из памяти, а так, судя по всему, необходимо данные приводить к определённому формату на самом листе и "изгадить" уже установленный формат и вид заполнения файла. Может быть конечно, я просто не понимаю, зачем вообще объект DropDowns(1) придуман, я просто с ним эксперементирую, вот и получаю такие глупые вопросы. [vba]
Код
Sub f1() Dim d As Object, key$, k&, tabl() As String, t& Dim obj Dim r As Range, r1 As Range Set d = CreateObject("Scripting.Dictionary") Set obj = Sheets(1).DropDowns(1) ReDim tabl(1) For i& = 1 To Cells(1, Columns.Count).End(xlToLeft).Column key = Cells(1, i) If key <> "" Then If Not d.exists(key) Then k = k + 1 d.Add key, k ' ReDim Preserve tabl(k) ' tabl(k) = key ' t = t & key If r Is Nothing Then Set r = Cells(1, i) Else Set r = Union(r, Cells(1, i)) End If End If End If Next i obj.Select obj.ListFillRange = r.Address End Sub
[/vba] мб стоит это отдельной темой задать?
[moder]Решила все-таки разделить темы. Начало тут[/moder] Дело в том, что некоторые объекты в экселе, хотят в качестве аргумента видеть тоже объекты экселя, как я понимаю. Например, в приложенном файле хочу DropDowns(1) заполнить значениями ячеек по горизонтали (значениями, какой-либо строчки). Но на сколько я понял, для данного объекта, заполнение работает только, если будут ячейки определённого столбца (только по вертикали) и как я понял, ячейки должны быть обязательно смежными, только тогда у меня корректно заполняется DropDowns(1). Думал, что можно записать туда данные из что-то типа "массива", из памяти, а так, судя по всему, необходимо данные приводить к определённому формату на самом листе и "изгадить" уже установленный формат и вид заполнения файла. Может быть конечно, я просто не понимаю, зачем вообще объект DropDowns(1) придуман, я просто с ним эксперементирую, вот и получаю такие глупые вопросы. [vba]
Код
Sub f1() Dim d As Object, key$, k&, tabl() As String, t& Dim obj Dim r As Range, r1 As Range Set d = CreateObject("Scripting.Dictionary") Set obj = Sheets(1).DropDowns(1) ReDim tabl(1) For i& = 1 To Cells(1, Columns.Count).End(xlToLeft).Column key = Cells(1, i) If key <> "" Then If Not d.exists(key) Then k = k + 1 d.Add key, k ' ReDim Preserve tabl(k) ' tabl(k) = key ' t = t & key If r Is Nothing Then Set r = Cells(1, i) Else Set r = Union(r, Cells(1, i)) End If End If End If Next i obj.Select obj.ListFillRange = r.Address End Sub
[/vba] мб стоит это отдельной темой задать?Roman777
Да это я попутал с комбобоксом. вот сделал на Ваш пример комбобокс. [vba]
Код
Sub d() Dim d As Object, key$, k&, tabl() As String, t& Dim obj As ComboBox Dim r As Range, r1 As Range Set d = CreateObject("Scripting.Dictionary") Set obj = Worksheets(2).Combo For Each c In Range(Cells(1, 1), Cells(20, 3)) If Not d.exists(c.Value) Then d.Add c.Value, c Next obj.List = d.keys End Sub
[/vba] Сначала нажмите кнопку - потом смотрите в комбобоксе.
Пробовал для Вашего листбокса сделать через имя - но всеравно не захотел работать.
Да это я попутал с комбобоксом. вот сделал на Ваш пример комбобокс. [vba]
Код
Sub d() Dim d As Object, key$, k&, tabl() As String, t& Dim obj As ComboBox Dim r As Range, r1 As Range Set d = CreateObject("Scripting.Dictionary") Set obj = Worksheets(2).Combo For Each c In Range(Cells(1, 1), Cells(20, 3)) If Not d.exists(c.Value) Then d.Add c.Value, c Next obj.List = d.keys End Sub
[/vba] Сначала нажмите кнопку - потом смотрите в комбобоксе.
Пробовал для Вашего листбокса сделать через имя - но всеравно не захотел работать.SLAVICK
Еще вариант (для элемента формы, как в примере) Roman777, Ваш макрос не трогала, только правки для заполнения списка внесла [vba]
Код
Sub f1() Dim d As Object, key$, k&, tabl() As String, t& Dim obj Dim r As Range, r1 As Range Set d = CreateObject("Scripting.Dictionary") 'Изменила Set obj = Sheets(1).Shapes("Drop Down 5") ReDim tabl(1) For i& = 1 To Cells(1, Columns.Count).End(xlToLeft).Column key = Cells(1, i) If key <> "" Then If Not d.exists(key) Then k = k + 1 d.Add key, k End If End If Next i 'Добавила arrItems = d.keys obj.ControlFormat.RemoveAllItems obj.ControlFormat.AddItem arrItems End Sub
[/vba]
Еще вариант (для элемента формы, как в примере) Roman777, Ваш макрос не трогала, только правки для заполнения списка внесла [vba]
Код
Sub f1() Dim d As Object, key$, k&, tabl() As String, t& Dim obj Dim r As Range, r1 As Range Set d = CreateObject("Scripting.Dictionary") 'Изменила Set obj = Sheets(1).Shapes("Drop Down 5") ReDim tabl(1) For i& = 1 To Cells(1, Columns.Count).End(xlToLeft).Column key = Cells(1, i) If key <> "" Then If Not d.exists(key) Then k = k + 1 d.Add key, k End If End If Next i 'Добавила arrItems = d.keys obj.ControlFormat.RemoveAllItems obj.ControlFormat.AddItem arrItems End Sub
Manyasha, Во, идеально прям))). Спасибо! Ща буду ищучать, что-то этого "ControlFormat.итд" не находил никак, а ведь так и думал, что есть какой-то подобный способ))). SLAVICK, с комбобоксом тоже спасибо, хотя меня больше именно элемент DropDown (он же формы да?) интересовал...)
Manyasha, Во, идеально прям))). Спасибо! Ща буду ищучать, что-то этого "ControlFormat.итд" не находил никак, а ведь так и думал, что есть какой-то подобный способ))). SLAVICK, с комбобоксом тоже спасибо, хотя меня больше именно элемент DropDown (он же формы да?) интересовал...)Roman777
Много чего не знаю!!!!
Сообщение отредактировал Roman777 - Среда, 08.06.2016, 20:22
Sub example_3() 'одномерный массив без дубликатов из столбца Dim x, i& With ActiveSheet i = .UsedRange.Columns(1).Rows.Count x = Filter(Evaluate("TRANSPOSE(IF(COUNTIF(OFFSET(a1:a" & i & ",0,0,ROW(1:" & i & _ ")),a1:a" & i & ")=1,a1:a" & i & ",CHAR(126)))"), "~", 0) .DropDowns(1).List = Application.Transpose(x) End With End Sub
[/vba]
как вариант [vba]
Код
Sub example_3() 'одномерный массив без дубликатов из столбца Dim x, i& With ActiveSheet i = .UsedRange.Columns(1).Rows.Count x = Filter(Evaluate("TRANSPOSE(IF(COUNTIF(OFFSET(a1:a" & i & ",0,0,ROW(1:" & i & _ ")),a1:a" & i & ")=1,a1:a" & i & ",CHAR(126)))"), "~", 0) .DropDowns(1).List = Application.Transpose(x) End With End Sub
nilem, Да нет, если без ковычек - то будет DropDowns(1), на сколько я понял, "5" будет означать обращение по имени "Drop Down 5" (аналог), по крайней мере тесты с выделением данного объекта так проходят, а без ковычек - порядковый номер чтоли или индекс на листе этого объекта, что-то очень похожее на worksheets("1") и worksheets(1) =)
nilem, Да нет, если без ковычек - то будет DropDowns(1), на сколько я понял, "5" будет означать обращение по имени "Drop Down 5" (аналог), по крайней мере тесты с выделением данного объекта так проходят, а без ковычек - порядковый номер чтоли или индекс на листе этого объекта, что-то очень похожее на worksheets("1") и worksheets(1) =)Roman777
Много чего не знаю!!!!
Сообщение отредактировал Roman777 - Среда, 08.06.2016, 21:27
Roman777, ControlFormat - это метод объектов Shape, все элементы формы и ActiveX являются шейпами. У DropDowns нет такого метода, но есть List (я просто не догадалась его применить)
Roman777, ControlFormat - это метод объектов Shape, все элементы формы и ActiveX являются шейпами. У DropDowns нет такого метода, но есть List (я просто не догадалась его применить)Manyasha
Manyasha, точно, метод .list использовал и nilem, и SLAVICK сразу об этом говорил .... А я что-то сразу и не обратил внимание...) Спасибо ещё раз большое, теперь вроде всё на своих "полках" .
Manyasha, точно, метод .list использовал и nilem, и SLAVICK сразу об этом говорил .... А я что-то сразу и не обратил внимание...) Спасибо ещё раз большое, теперь вроде всё на своих "полках" .Roman777
Много чего не знаю!!!!
Сообщение отредактировал Roman777 - Четверг, 09.06.2016, 09:40