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

Вход

Регистрация

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

 

= Мир MS Excel/DropList в ячейках - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » DropList в ячейках (Макросы/Sub)
DropList в ячейках
Benos Дата: Суббота, 22.05.2021, 13:22 | Сообщение № 1
Группа: Пользователи
Ранг: Новичок
Сообщений: 22
Репутация: 0 ±
Замечаний: 0% ±

Excel 2016 / 365
Добрый день, всем!
Делаю сводную таблицу. Данных (строк) в ней нужно заполнять много, но многие из них шаблонные.
Пытаюсь сделать выпадающий список в ячейке, но пока того, что нужно не добился.
Прошу помощи!
Вот пример кода, фаил так же приложил.
[vba]
Код
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
    If Sh.Name = "лист" Then Call dropList(Target)
End Sub
Sub dropList(iCell)
    Dim arrList()
    Dim lastRow As Integer
    Debug.Print iCell.Column
    Select Case iCell.Row
        Case "2"
            lastRow = Worksheets("данные").Cells(Rows.Count, 1).End(xlUp).Row
            ReDim arrList(lastRow)
            For i = 0 To lastRow
                arrList(i) = Worksheets("данные").Cells(i + 1, 1).Value
            Next i
        Case "3"
            lastRow = Worksheets("данные").Cells(Rows.Count - 1, 2).End(xlUp).Row
            ReDim arrList(lastRow)
            For i = 0 To lastRow
                arrList(i) = Worksheets("данные").Cells(i + 1, 2).Value
            Next i
        Case "4"
            lastRow = Worksheets("данные").Cells(Rows.Count - 1, 3).End(xlUp).Row
            ReDim arrList(lastRow)
            For i = 0 To lastRow
                arrList(i) = Worksheets("данные").Cells(i + 1, 3).Value
            Next i
    End Select
        If Worksheets("лист").Cells(iCell.Row, 1).Value <> "" And iCell.Column > 1 Then
            With Cells(iCell.Row, iCell.Column).Validation
                .Delete
                .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:=Join(arrList, ",")
                .IgnoreBlank = True
                .InCellDropdown = True
                .ShowInput = True
            End With
        End If
End Sub
[/vba]
Выпадающий список работает, но не совсем так как хотелось бы.
1. Не могу понять, почему первый столбик - выпадающий список
по идее эта строка должна отсечь его
[vba]
Код
If Worksheets("лист").Cells(iCell.Row, 1).Value <> "" And iCell.Column > 1 Then
[/vba]

2. Как можно в этом списки прикрутить поиск, по мере ввода (аналог вебпоисковиков).

3. Не очень нравится сборка массива
[vba]
Код
For i = 0 To lastRow
                arrList(i) = Worksheets("данные").Cells(i + 1, 1).Value
            Next i
[/vba]
Если массив большой то будет долго собираться. Пробовал через Range, но там получается двумерный массив и подключить его "Formula1:=Join(arrList, ",")" не смог.

4. Сейчас определение сроки идет по номеру "Select Case iCell.Row", что не очень удобно, так как строки могут добавляться и удаляться.
Пытался реализовать через имя ячеек в первом столбце
[vba]
Код
Worksheets("лист").Range(Cells(iCell.Row, 1).Name)
[/vba]
Мол если у первого элемента строки имя "цвет", то цепляем столбец с цветами... но вылетает ошибка... думаю не верный подход..

5. Не сообразил, как можно добавить ввод элементов, которых нет в списке.

Буду раз, если подскажите что и как... а то я в тупике :)
К сообщению приложен файл: test.xlsm(25.5 Kb)
 
Ответить
СообщениеДобрый день, всем!
Делаю сводную таблицу. Данных (строк) в ней нужно заполнять много, но многие из них шаблонные.
Пытаюсь сделать выпадающий список в ячейке, но пока того, что нужно не добился.
Прошу помощи!
Вот пример кода, фаил так же приложил.
[vba]
Код
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
    If Sh.Name = "лист" Then Call dropList(Target)
End Sub
Sub dropList(iCell)
    Dim arrList()
    Dim lastRow As Integer
    Debug.Print iCell.Column
    Select Case iCell.Row
        Case "2"
            lastRow = Worksheets("данные").Cells(Rows.Count, 1).End(xlUp).Row
            ReDim arrList(lastRow)
            For i = 0 To lastRow
                arrList(i) = Worksheets("данные").Cells(i + 1, 1).Value
            Next i
        Case "3"
            lastRow = Worksheets("данные").Cells(Rows.Count - 1, 2).End(xlUp).Row
            ReDim arrList(lastRow)
            For i = 0 To lastRow
                arrList(i) = Worksheets("данные").Cells(i + 1, 2).Value
            Next i
        Case "4"
            lastRow = Worksheets("данные").Cells(Rows.Count - 1, 3).End(xlUp).Row
            ReDim arrList(lastRow)
            For i = 0 To lastRow
                arrList(i) = Worksheets("данные").Cells(i + 1, 3).Value
            Next i
    End Select
        If Worksheets("лист").Cells(iCell.Row, 1).Value <> "" And iCell.Column > 1 Then
            With Cells(iCell.Row, iCell.Column).Validation
                .Delete
                .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:=Join(arrList, ",")
                .IgnoreBlank = True
                .InCellDropdown = True
                .ShowInput = True
            End With
        End If
End Sub
[/vba]
Выпадающий список работает, но не совсем так как хотелось бы.
1. Не могу понять, почему первый столбик - выпадающий список
по идее эта строка должна отсечь его
[vba]
Код
If Worksheets("лист").Cells(iCell.Row, 1).Value <> "" And iCell.Column > 1 Then
[/vba]

2. Как можно в этом списки прикрутить поиск, по мере ввода (аналог вебпоисковиков).

3. Не очень нравится сборка массива
[vba]
Код
For i = 0 To lastRow
                arrList(i) = Worksheets("данные").Cells(i + 1, 1).Value
            Next i
[/vba]
Если массив большой то будет долго собираться. Пробовал через Range, но там получается двумерный массив и подключить его "Formula1:=Join(arrList, ",")" не смог.

4. Сейчас определение сроки идет по номеру "Select Case iCell.Row", что не очень удобно, так как строки могут добавляться и удаляться.
Пытался реализовать через имя ячеек в первом столбце
[vba]
Код
Worksheets("лист").Range(Cells(iCell.Row, 1).Name)
[/vba]
Мол если у первого элемента строки имя "цвет", то цепляем столбец с цветами... но вылетает ошибка... думаю не верный подход..

5. Не сообразил, как можно добавить ввод элементов, которых нет в списке.

Буду раз, если подскажите что и как... а то я в тупике :)

Автор - Benos
Дата добавления - 22.05.2021 в 13:22
Benos Дата: Суббота, 22.05.2021, 16:23 | Сообщение № 2
Группа: Пользователи
Ранг: Новичок
Сообщений: 22
Репутация: 0 ±
Замечаний: 0% ±

Excel 2016 / 365
4. Сейчас определение сроки идет по номеру "Select Case iCell.Row", что не очень удобно, так как строки могут добавляться и удаляться.
Пытался реализовать через имя ячеек в первом столбце

Worksheets("лист").Range(Cells(iCell.Row, 1).Name)

Мол если у первого элемента строки имя "цвет", то цепляем столбец с цветами... но вылетает ошибка... думаю не верный подход..

Этот момент решил, может не совсем корректно... но функционально :)
[vba]
Код
Cells(iCell.Row, 1).Name.Name
[/vba]
 
Ответить
Сообщение
4. Сейчас определение сроки идет по номеру "Select Case iCell.Row", что не очень удобно, так как строки могут добавляться и удаляться.
Пытался реализовать через имя ячеек в первом столбце

Worksheets("лист").Range(Cells(iCell.Row, 1).Name)

Мол если у первого элемента строки имя "цвет", то цепляем столбец с цветами... но вылетает ошибка... думаю не верный подход..

Этот момент решил, может не совсем корректно... но функционально :)
[vba]
Код
Cells(iCell.Row, 1).Name.Name
[/vba]

Автор - Benos
Дата добавления - 22.05.2021 в 16:23
Pelena Дата: Суббота, 22.05.2021, 17:55 | Сообщение № 3
Группа: Админы
Ранг: Местный житель
Сообщений: 17625
Репутация: 3925 ±
Замечаний: ±

Excel 2010, 2016 & Mac Excel
Здравствуйте.
1. Там, видимо, список был создан раньше. Удалите его через проверку данных, больше он не появится
2. В этом списке никак. Вариант из Готовых решений или ещё вариант
3. см. файл
5. вариант

А зачем создавать списки макросом? Через проверку данных не вариант?
К сообщению приложен файл: 7866039.xlsm(20.1 Kb)


"Черт возьми, Холмс! Но как??!!"
ЯД 41001765434816
 
Ответить
СообщениеЗдравствуйте.
1. Там, видимо, список был создан раньше. Удалите его через проверку данных, больше он не появится
2. В этом списке никак. Вариант из Готовых решений или ещё вариант
3. см. файл
5. вариант

А зачем создавать списки макросом? Через проверку данных не вариант?

Автор - Pelena
Дата добавления - 22.05.2021 в 17:55
Benos Дата: Воскресенье, 23.05.2021, 18:12 | Сообщение № 4
Группа: Пользователи
Ранг: Новичок
Сообщений: 22
Репутация: 0 ±
Замечаний: 0% ±

Excel 2016 / 365
1. Там, видимо, список был создан раньше

Ваша правда, не додумался спасибо!
А зачем создавать списки макросом? Через проверку данных не вариант?

Не силен я в стандартных средствах Excel, как то через VBA "думается легче".
Да и не знаю как умные таблицы созданные через "данные" к макросам прикручивать.

2. В этом списке никак. Вариант из Готовых решений или ещё вариант
5. вариант

Готовые решения видел, но там есть два момента, которые "оттолкнули" от данной идеи
1. Постоянно висящее пустое окно, при активной ячейке, будет перекрывать часть информации
2. Не совсем тот вариант поиска, который хотел реализовать...
хотел реализовать как тут, но без применение комбокса... как я понял такой вариант без комбокса не осуществить.

Очень много примеров видел, с фиксированной ячейкой в виде списка, а мне надо что бы список выпадал в активной ячейке

Пока вот думаю, что бы при активации ячейки поверх нее всплывал комбокс (минимальный, только поле ввода) и попробовать реализовать как на видео.
По принципу... ткнули в ячейку для ввода текста, поверх нее открылся комбокс, в него ввели текст, нажали Ентер(или сняли выделение с ячейки), комбокс скрылся... значение записали в ячейке(или не записали, если не нажали ентер)...

Но как задать позицию комбокса относительно активной ячейки пока не знаю.

Возможно городу огород и есть варианты проще :)
 
Ответить
Сообщение
1. Там, видимо, список был создан раньше

Ваша правда, не додумался спасибо!
А зачем создавать списки макросом? Через проверку данных не вариант?

Не силен я в стандартных средствах Excel, как то через VBA "думается легче".
Да и не знаю как умные таблицы созданные через "данные" к макросам прикручивать.

2. В этом списке никак. Вариант из Готовых решений или ещё вариант
5. вариант

Готовые решения видел, но там есть два момента, которые "оттолкнули" от данной идеи
1. Постоянно висящее пустое окно, при активной ячейке, будет перекрывать часть информации
2. Не совсем тот вариант поиска, который хотел реализовать...
хотел реализовать как тут, но без применение комбокса... как я понял такой вариант без комбокса не осуществить.

Очень много примеров видел, с фиксированной ячейкой в виде списка, а мне надо что бы список выпадал в активной ячейке

Пока вот думаю, что бы при активации ячейки поверх нее всплывал комбокс (минимальный, только поле ввода) и попробовать реализовать как на видео.
По принципу... ткнули в ячейку для ввода текста, поверх нее открылся комбокс, в него ввели текст, нажали Ентер(или сняли выделение с ячейки), комбокс скрылся... значение записали в ячейке(или не записали, если не нажали ентер)...

Но как задать позицию комбокса относительно активной ячейки пока не знаю.

Возможно городу огород и есть варианты проще :)

Автор - Benos
Дата добавления - 23.05.2021 в 18:12
Мир MS Excel » Вопросы и решения » Вопросы по VBA » DropList в ячейках (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

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