Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Массив в качестве элементов для DropDown (элемент формы) - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Массив в качестве элементов для DropDown (элемент формы) (Макросы/Sub)
Массив в качестве элементов для DropDown (элемент формы)
Roman777 Дата: Среда, 08.06.2016, 17:28 | Сообщение № 1
Группа: Проверенные
Ранг: Ветеран
Сообщений: 980
Репутация: 127 ±
Замечаний: 0% ±

Excel 2007, Excel 2013
[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]
мб стоит это отдельной темой задать?
К сообщению приложен файл: test1.xls (46.5 Kb)


Много чего не знаю!!!!

Сообщение отредактировал Manyasha - Среда, 08.06.2016, 18:46
 
Ответить
Сообщение[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
Дата добавления - 08.06.2016 в 17:28
SLAVICK Дата: Среда, 08.06.2016, 17:35 | Сообщение № 2
Группа: Модераторы
Ранг: Старожил
Сообщений: 2290
Репутация: 766 ±
Замечаний: 0% ±

2019
Попробуйте вместо
[vba]
Код
obj.ListFillRange = r.Address
[/vba]
написать
[vba]
Код
obj.ListFillRange = d.keys
[/vba]


Иногда все проще чем кажется с первого взгляда.
 
Ответить
СообщениеПопробуйте вместо
[vba]
Код
obj.ListFillRange = r.Address
[/vba]
написать
[vba]
Код
obj.ListFillRange = d.keys
[/vba]

Автор - SLAVICK
Дата добавления - 08.06.2016 в 17:35
Roman777 Дата: Среда, 08.06.2016, 17:39 | Сообщение № 3
Группа: Проверенные
Ранг: Ветеран
Сообщений: 980
Репутация: 127 ±
Замечаний: 0% ±

Excel 2007, Excel 2013
SLAVICK, что-то не заполняет...


Много чего не знаю!!!!
 
Ответить
СообщениеSLAVICK, что-то не заполняет...

Автор - Roman777
Дата добавления - 08.06.2016 в 17:39
SLAVICK Дата: Среда, 08.06.2016, 18:20 | Сообщение № 4
Группа: Модераторы
Ранг: Старожил
Сообщений: 2290
Репутация: 766 ±
Замечаний: 0% ±

2019
Да это я попутал с комбобоксом.
вот сделал на Ваш пример комбобокс.
[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]
Сначала нажмите кнопку - потом смотрите в комбобоксе.

Пробовал для Вашего листбокса сделать через имя - но всеравно не захотел работать.
К сообщению приложен файл: 8135069.xls (53.0 Kb)


Иногда все проще чем кажется с первого взгляда.

Сообщение отредактировал SLAVICK - Среда, 08.06.2016, 18:23
 
Ответить
СообщениеДа это я попутал с комбобоксом.
вот сделал на Ваш пример комбобокс.
[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
Дата добавления - 08.06.2016 в 18:20
Manyasha Дата: Среда, 08.06.2016, 18:32 | Сообщение № 5
Группа: Модераторы
Ранг: Старожил
Сообщений: 2198
Репутация: 898 ±
Замечаний: 0% ±

Excel 2010, 2016
Еще вариант (для элемента формы, как в примере)
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]
К сообщению приложен файл: test1-2.xls (41.0 Kb)


ЯД: 410013299366744 WM: R193491431804
 
Ответить
СообщениеЕще вариант (для элемента формы, как в примере)
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]

Автор - Manyasha
Дата добавления - 08.06.2016 в 18:32
Roman777 Дата: Среда, 08.06.2016, 20:20 | Сообщение № 6
Группа: Проверенные
Ранг: Ветеран
Сообщений: 980
Репутация: 127 ±
Замечаний: 0% ±

Excel 2007, Excel 2013
Manyasha, Во, идеально прям))). Спасибо! Ща буду ищучать, что-то этого "ControlFormat.итд" не находил никак, а ведь так и думал, что есть какой-то подобный способ))).
SLAVICK, с комбобоксом тоже спасибо, хотя меня больше именно элемент DropDown (он же формы да?) интересовал...)


Много чего не знаю!!!!

Сообщение отредактировал Roman777 - Среда, 08.06.2016, 20:22
 
Ответить
СообщениеManyasha, Во, идеально прям))). Спасибо! Ща буду ищучать, что-то этого "ControlFormat.итд" не находил никак, а ведь так и думал, что есть какой-то подобный способ))).
SLAVICK, с комбобоксом тоже спасибо, хотя меня больше именно элемент DropDown (он же формы да?) интересовал...)

Автор - Roman777
Дата добавления - 08.06.2016 в 20:20
nilem Дата: Среда, 08.06.2016, 20:56 | Сообщение № 7
Группа: Авторы
Ранг: Старожил
Сообщений: 1613
Репутация: 563 ±
Замечаний: 0% ±

Excel 2013, 2016
как вариант
[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
[/vba]


Яндекс.Деньги 4100159601573
 
Ответить
Сообщениекак вариант
[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
[/vba]

Автор - nilem
Дата добавления - 08.06.2016 в 20:56
Roman777 Дата: Среда, 08.06.2016, 21:15 | Сообщение № 8
Группа: Проверенные
Ранг: Ветеран
Сообщений: 980
Репутация: 127 ±
Замечаний: 0% ±

Excel 2007, Excel 2013
nilem, Спасибо).
Я ещё раз всмотрелся в изменения Manyasha и понял, что не понял: в чем же всё-таки разница между:
[vba]
Код
Set obj = Sheets(1).Shapes("Drop Down 5")
и
Set obj = ActiveSheet.DropDowns("5")
[/vba]

через obj.Select выделится 1 и тот же объект, но почему, когда задаю по нижнему варианту, метода
[vba]
Код
.ControlFormat
[/vba]
нету....


Много чего не знаю!!!!

Сообщение отредактировал Roman777 - Среда, 08.06.2016, 21:15
 
Ответить
Сообщениеnilem, Спасибо).
Я ещё раз всмотрелся в изменения Manyasha и понял, что не понял: в чем же всё-таки разница между:
[vba]
Код
Set obj = Sheets(1).Shapes("Drop Down 5")
и
Set obj = ActiveSheet.DropDowns("5")
[/vba]

через obj.Select выделится 1 и тот же объект, но почему, когда задаю по нижнему варианту, метода
[vba]
Код
.ControlFormat
[/vba]
нету....

Автор - Roman777
Дата добавления - 08.06.2016 в 21:15
nilem Дата: Среда, 08.06.2016, 21:17 | Сообщение № 9
Группа: Авторы
Ранг: Старожил
Сообщений: 1613
Репутация: 563 ±
Замечаний: 0% ±

Excel 2013, 2016
наверное, DropDowns(5) без кавычек


Яндекс.Деньги 4100159601573
 
Ответить
Сообщениенаверное, DropDowns(5) без кавычек

Автор - nilem
Дата добавления - 08.06.2016 в 21:17
Roman777 Дата: Среда, 08.06.2016, 21:26 | Сообщение № 10
Группа: Проверенные
Ранг: Ветеран
Сообщений: 980
Репутация: 127 ±
Замечаний: 0% ±

Excel 2007, Excel 2013
nilem, Да нет, если без ковычек - то будет DropDowns(1), на сколько я понял, "5" будет означать обращение по имени "Drop Down 5" (аналог), по крайней мере тесты с выделением данного объекта так проходят, а без ковычек - порядковый номер чтоли или индекс на листе этого объекта, что-то очень похожее на worksheets("1") и worksheets(1) =)


Много чего не знаю!!!!

Сообщение отредактировал Roman777 - Среда, 08.06.2016, 21:27
 
Ответить
Сообщениеnilem, Да нет, если без ковычек - то будет DropDowns(1), на сколько я понял, "5" будет означать обращение по имени "Drop Down 5" (аналог), по крайней мере тесты с выделением данного объекта так проходят, а без ковычек - порядковый номер чтоли или индекс на листе этого объекта, что-то очень похожее на worksheets("1") и worksheets(1) =)

Автор - Roman777
Дата добавления - 08.06.2016 в 21:26
Manyasha Дата: Среда, 08.06.2016, 22:01 | Сообщение № 11
Группа: Модераторы
Ранг: Старожил
Сообщений: 2198
Репутация: 898 ±
Замечаний: 0% ±

Excel 2010, 2016
Roman777, ControlFormat - это метод объектов Shape, все элементы формы и ActiveX являются шейпами. У DropDowns нет такого метода, но есть List (я просто не догадалась его применить)


ЯД: 410013299366744 WM: R193491431804
 
Ответить
СообщениеRoman777, ControlFormat - это метод объектов Shape, все элементы формы и ActiveX являются шейпами. У DropDowns нет такого метода, но есть List (я просто не догадалась его применить)

Автор - Manyasha
Дата добавления - 08.06.2016 в 22:01
Roman777 Дата: Четверг, 09.06.2016, 09:37 | Сообщение № 12
Группа: Проверенные
Ранг: Ветеран
Сообщений: 980
Репутация: 127 ±
Замечаний: 0% ±

Excel 2007, Excel 2013
Manyasha, точно, метод .list использовал и nilem, и SLAVICK сразу об этом говорил %) .... А я что-то сразу и не обратил внимание...) Спасибо ещё раз большое, теперь вроде всё на своих "полках" hands .


Много чего не знаю!!!!

Сообщение отредактировал Roman777 - Четверг, 09.06.2016, 09:40
 
Ответить
СообщениеManyasha, точно, метод .list использовал и nilem, и SLAVICK сразу об этом говорил %) .... А я что-то сразу и не обратил внимание...) Спасибо ещё раз большое, теперь вроде всё на своих "полках" hands .

Автор - Roman777
Дата добавления - 09.06.2016 в 09:37
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Массив в качестве элементов для DropDown (элемент формы) (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!