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

Вход

Регистрация

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

 

= Мир MS Excel/Выпадающий список более 8 строк - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Выпадающий список более 8 строк
Гость Дата: Пятница, 22.06.2012, 22:28 | Сообщение № 1
Группа: Гости
Здравствуйте!

Помогите, пожалуйста составить макрос для выпадающего списка, чтобы строчек было больше чем 8. Подозреваю, что можно использовать поле со списком ActivX.

Нашёл вот такой код:

[vba]
Code
Const ValidationList = "n4:n17"
Public Events As Boolean

Private Sub ComboBox1_Change()
If Not Events Then Exit Sub
ActiveCell.Value = Me.ComboBox1.Value
HideCombo
End Sub

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If Intersect(Target, [b4:e6]) Is Nothing Or Target.Cells.Count > 1 Then HideCombo: Exit Sub
Cancel = True: Events = False
Me.ComboBox1.Top = Target.Top: Me.ComboBox1.Left = Target.Left
Me.ComboBox1.Width = Target.Width + 16: Me.ComboBox1.Height = Target.Height
FillCombo
Events = True
End Sub

Sub FillCombo()
Me.ComboBox1.Clear
For Each cell In Range(ValidationList).Cells
Me.ComboBox1.AddItem cell
Next
Me.ComboBox1.ListRows = Range(ValidationList).Cells.Count
Me.ComboBox1.Value = ActiveCell.Value: Me.ComboBox1.Font.Size = 6
End Sub

Sub HideCombo()
Me.ComboBox1.Top = 0: Me.ComboBox1.Left = 0: Me.ComboBox1.Width = 0: Me.ComboBox1.Height = 0
End Sub
[/vba]

но как сделать на одиночный клик мышки, не могу разобраться. Спасибо заранее!
 
Ответить
СообщениеЗдравствуйте!

Помогите, пожалуйста составить макрос для выпадающего списка, чтобы строчек было больше чем 8. Подозреваю, что можно использовать поле со списком ActivX.

Нашёл вот такой код:

[vba]
Code
Const ValidationList = "n4:n17"
Public Events As Boolean

Private Sub ComboBox1_Change()
If Not Events Then Exit Sub
ActiveCell.Value = Me.ComboBox1.Value
HideCombo
End Sub

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If Intersect(Target, [b4:e6]) Is Nothing Or Target.Cells.Count > 1 Then HideCombo: Exit Sub
Cancel = True: Events = False
Me.ComboBox1.Top = Target.Top: Me.ComboBox1.Left = Target.Left
Me.ComboBox1.Width = Target.Width + 16: Me.ComboBox1.Height = Target.Height
FillCombo
Events = True
End Sub

Sub FillCombo()
Me.ComboBox1.Clear
For Each cell In Range(ValidationList).Cells
Me.ComboBox1.AddItem cell
Next
Me.ComboBox1.ListRows = Range(ValidationList).Cells.Count
Me.ComboBox1.Value = ActiveCell.Value: Me.ComboBox1.Font.Size = 6
End Sub

Sub HideCombo()
Me.ComboBox1.Top = 0: Me.ComboBox1.Left = 0: Me.ComboBox1.Width = 0: Me.ComboBox1.Height = 0
End Sub
[/vba]

но как сделать на одиночный клик мышки, не могу разобраться. Спасибо заранее!

Автор - Гость
Дата добавления - 22.06.2012 в 22:28
Hugo Дата: Пятница, 22.06.2012, 22:47 | Сообщение № 2
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3690
Репутация: 790 ±
Замечаний: 0% ±

365
Одиночный?
Это Вам Private Sub Worksheet_SelectionChange(ByVal Target As Range) нужно...
Правда тогда не только по клику, но и при любом переходе на ячейки подконтрольного диапазона будет появляться ComboBox1.
Но без примера обещать не могу smile


webmoney: E265281470651 Z422237915069
USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD
 
Ответить
СообщениеОдиночный?
Это Вам Private Sub Worksheet_SelectionChange(ByVal Target As Range) нужно...
Правда тогда не только по клику, но и при любом переходе на ячейки подконтрольного диапазона будет появляться ComboBox1.
Но без примера обещать не могу smile

Автор - Hugo
Дата добавления - 22.06.2012 в 22:47
Гость Дата: Суббота, 23.06.2012, 05:52 | Сообщение № 3
Группа: Гости
Hugo, спасибо за ответ!

Хотел ещё поинтересоваться: если у меня будет несколько диапазонов ValidationList = "n4:n17", и соответственно несколько ComboBox. Каким образом их объединить на одном листе? Я к тому, что нужно ли переделывать данный код (в первом посте) или же внести в него какие-либо изменения (несколько диапазонов)? Заранее спасибо!
 
Ответить
СообщениеHugo, спасибо за ответ!

Хотел ещё поинтересоваться: если у меня будет несколько диапазонов ValidationList = "n4:n17", и соответственно несколько ComboBox. Каким образом их объединить на одном листе? Я к тому, что нужно ли переделывать данный код (в первом посте) или же внести в него какие-либо изменения (несколько диапазонов)? Заранее спасибо!

Автор - Гость
Дата добавления - 23.06.2012 в 05:52
Gustav Дата: Суббота, 23.06.2012, 08:38 | Сообщение № 4
Группа: Админы
Ранг: Участник клуба
Сообщений: 2797
Репутация: 1161 ±
Замечаний: ±

начинал с Excel 4.0, видел 2.1
Quote (Гость)
если у меня будет несколько диапазонов ValidationList = "n4:n17", и соответственно несколько ComboBox.

Вот примерный код для двух комбо-боксов:
[vba]
Code

Option Explicit

Const ValidationList1 = "n4:n17"
Const ValidationList2 = "p4:p13"

Public Events As Boolean
       
Sub ComboChange(cb As ComboBox)
        If Not Events Then Exit Sub
        ActiveCell.Value = cb.Value
        HideCombo cb
End Sub
       
Private Sub ComboBox1_Change()
        ComboChange Me.ComboBox1
End Sub
       
Private Sub ComboBox2_Change()
        ComboChange Me.ComboBox2
End Sub
       
Sub FillCombo(cb As ComboBox, validList As String)
        Dim cell As Range
        cb.Clear
        For Each cell In Range(validList).Cells
            cb.AddItem cell
        Next
        cb.ListRows = Range(validList).Cells.Count
        cb.Value = ActiveCell.Value: cb.Font.Size = 6
End Sub
       
Sub HideCombo(cb As ComboBox)
        With cb
            .Top = 0: .Left = 0: .Width = 0: .Height = 0
        End With
End Sub
       
Sub ShowCombo(cb As ComboBox, Target As Range)
        With cb
            .Top = Target.Top: .Left = Target.Left
            .Width = Target.Width + 16: .Height = Target.Height
        End With
End Sub
       
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
       
        HideCombo Me.ComboBox1
        HideCombo Me.ComboBox2
       
        If Target.Cells.Count > 1 Then
            Exit Sub
        End If
             
        If Not (Intersect(Target, [b4:e6]) Is Nothing) Then
            Events = False
            ShowCombo Me.ComboBox1, Target
            FillCombo Me.ComboBox1, ValidationList1
            Events = True
        End If
            
        If Not (Intersect(Target, [b14:e16]) Is Nothing) Then
            Events = False
            ShowCombo Me.ComboBox2, Target
            FillCombo Me.ComboBox2, ValidationList2
            Events = True
        End If
     
End Sub
[/vba]
К сообщению приложен файл: 8377031.xlsm (25.7 Kb)


МОИ: Ник, Tip box: 41001663842605

Сообщение отредактировал Gustav - Суббота, 23.06.2012, 08:47
 
Ответить
Сообщение
Quote (Гость)
если у меня будет несколько диапазонов ValidationList = "n4:n17", и соответственно несколько ComboBox.

Вот примерный код для двух комбо-боксов:
[vba]
Code

Option Explicit

Const ValidationList1 = "n4:n17"
Const ValidationList2 = "p4:p13"

Public Events As Boolean
       
Sub ComboChange(cb As ComboBox)
        If Not Events Then Exit Sub
        ActiveCell.Value = cb.Value
        HideCombo cb
End Sub
       
Private Sub ComboBox1_Change()
        ComboChange Me.ComboBox1
End Sub
       
Private Sub ComboBox2_Change()
        ComboChange Me.ComboBox2
End Sub
       
Sub FillCombo(cb As ComboBox, validList As String)
        Dim cell As Range
        cb.Clear
        For Each cell In Range(validList).Cells
            cb.AddItem cell
        Next
        cb.ListRows = Range(validList).Cells.Count
        cb.Value = ActiveCell.Value: cb.Font.Size = 6
End Sub
       
Sub HideCombo(cb As ComboBox)
        With cb
            .Top = 0: .Left = 0: .Width = 0: .Height = 0
        End With
End Sub
       
Sub ShowCombo(cb As ComboBox, Target As Range)
        With cb
            .Top = Target.Top: .Left = Target.Left
            .Width = Target.Width + 16: .Height = Target.Height
        End With
End Sub
       
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
       
        HideCombo Me.ComboBox1
        HideCombo Me.ComboBox2
       
        If Target.Cells.Count > 1 Then
            Exit Sub
        End If
             
        If Not (Intersect(Target, [b4:e6]) Is Nothing) Then
            Events = False
            ShowCombo Me.ComboBox1, Target
            FillCombo Me.ComboBox1, ValidationList1
            Events = True
        End If
            
        If Not (Intersect(Target, [b14:e16]) Is Nothing) Then
            Events = False
            ShowCombo Me.ComboBox2, Target
            FillCombo Me.ComboBox2, ValidationList2
            Events = True
        End If
     
End Sub
[/vba]

Автор - Gustav
Дата добавления - 23.06.2012 в 08:38
Гость Дата: Суббота, 23.06.2012, 18:32 | Сообщение № 5
Группа: Гости
Gustav, спасибо огромное!

Буду разбираться, адаптировать под свою задачу. Не подскажите учебник по VB для начинающих (типа меня, с ооочень начальными познаниями в данном языке)? Спасибо!
 
Ответить
СообщениеGustav, спасибо огромное!

Буду разбираться, адаптировать под свою задачу. Не подскажите учебник по VB для начинающих (типа меня, с ооочень начальными познаниями в данном языке)? Спасибо!

Автор - Гость
Дата добавления - 23.06.2012 в 18:32
Serge_007 Дата: Суббота, 23.06.2012, 18:38 | Сообщение № 6
Группа: Админы
Ранг: Местный житель
Сообщений: 16475
Репутация: 2749 ±
Замечаний: ±

Excel 2016
Quote (Гость)
учебник по VB для начинающих

http://www.excelworld.ru/index/vba/0-12


ЮMoney:41001419691823 | WMR:126292472390
 
Ответить
Сообщение
Quote (Гость)
учебник по VB для начинающих

http://www.excelworld.ru/index/vba/0-12

Автор - Serge_007
Дата добавления - 23.06.2012 в 18:38
Гость Дата: Воскресенье, 24.06.2012, 08:39 | Сообщение № 7
Группа: Гости
Serge_007, благодарю за ссылку. Не часто встретишь такой "живой" форум!
 
Ответить
СообщениеSerge_007, благодарю за ссылку. Не часто встретишь такой "живой" форум!

Автор - Гость
Дата добавления - 24.06.2012 в 08:39
Гость Дата: Воскресенье, 24.06.2012, 11:41 | Сообщение № 8
Группа: Гости
Gustav, возможно ламерский вопрос, но при попытке вставки Вашего варианта кода в строке "Sub ComboChange(cb As ComboBox)" выпадает ошибка "user-defined type not defined". Что делаю не так? Не поможете адаптировать свой код под следующую задачу: выпадание 2 списков (более 8 строк) которые берут данные из 2-х диапазонов, кстати ощутил приемущество двойного клика)) (как в первом посте) - можно копировать данную ячейку. Прошу не пинать за назойливость)
 
Ответить
СообщениеGustav, возможно ламерский вопрос, но при попытке вставки Вашего варианта кода в строке "Sub ComboChange(cb As ComboBox)" выпадает ошибка "user-defined type not defined". Что делаю не так? Не поможете адаптировать свой код под следующую задачу: выпадание 2 списков (более 8 строк) которые берут данные из 2-х диапазонов, кстати ощутил приемущество двойного клика)) (как в первом посте) - можно копировать данную ячейку. Прошу не пинать за назойливость)

Автор - Гость
Дата добавления - 24.06.2012 в 11:41
Gustav Дата: Воскресенье, 24.06.2012, 12:22 | Сообщение № 9
Группа: Админы
Ранг: Участник клуба
Сообщений: 2797
Репутация: 1161 ±
Замечаний: ±

начинал с Excel 4.0, видел 2.1
Quote (Гость)
при попытке вставки Вашего варианта кода в строке "Sub ComboChange(cb As ComboBox)" выпадает ошибка "user-defined type not defined".

Если в окне редактора VB выполнить команду меню "Tools \ References", то стоит галочка у библиотеки "Microsoft Forms 2.0 Object Library" ? Почти уверен, что нет, а должна smile Вы, наверное, вставили код в пустую книгу и пытаетесь скомпилировать. Не получится - надо включить ссылку на MS Forms, причем в списке Вы его, скорее всего, не найдете. Поэтому надо либо через кнопку Browse и указать C:\WINDOWS\system32\FM20.DLL, либо просто вставить на рабочий лист первый комбо-бокс и ссылка на MS Forms появится автоматически.


МОИ: Ник, Tip box: 41001663842605
 
Ответить
Сообщение
Quote (Гость)
при попытке вставки Вашего варианта кода в строке "Sub ComboChange(cb As ComboBox)" выпадает ошибка "user-defined type not defined".

Если в окне редактора VB выполнить команду меню "Tools \ References", то стоит галочка у библиотеки "Microsoft Forms 2.0 Object Library" ? Почти уверен, что нет, а должна smile Вы, наверное, вставили код в пустую книгу и пытаетесь скомпилировать. Не получится - надо включить ссылку на MS Forms, причем в списке Вы его, скорее всего, не найдете. Поэтому надо либо через кнопку Browse и указать C:\WINDOWS\system32\FM20.DLL, либо просто вставить на рабочий лист первый комбо-бокс и ссылка на MS Forms появится автоматически.

Автор - Gustav
Дата добавления - 24.06.2012 в 12:22
Гость Дата: Воскресенье, 24.06.2012, 19:14 | Сообщение № 10
Группа: Гости
Gustav, все сделал как Вы описали - всё получилось! (добавил в ручную) Хотел ещё спросить: можно ли через меню "Свойства" "Поля со списком AcktiveX" в режиме "Конструктора" сделать так, чтобы после выпадения комбокса и выбора одной из строк, комбокс сворачивался и принимал вид просто ячейки (как в Вашем примере)?
 
Ответить
СообщениеGustav, все сделал как Вы описали - всё получилось! (добавил в ручную) Хотел ещё спросить: можно ли через меню "Свойства" "Поля со списком AcktiveX" в режиме "Конструктора" сделать так, чтобы после выпадения комбокса и выбора одной из строк, комбокс сворачивался и принимал вид просто ячейки (как в Вашем примере)?

Автор - Гость
Дата добавления - 24.06.2012 в 19:14
Gustav Дата: Воскресенье, 24.06.2012, 22:22 | Сообщение № 11
Группа: Админы
Ранг: Участник клуба
Сообщений: 2797
Репутация: 1161 ±
Замечаний: ±

начинал с Excel 4.0, видел 2.1
Quote (Гость)
можно ли через меню "Свойства" "Поля со списком AcktiveX" в режиме "Конструктора" сделать так, чтобы после выпадения комбокса и выбора одной из строк, комбокс сворачивался и принимал вид просто ячейки

Не очень понял. В режиме "Конструктора" из списка выбрать ничего нельзя. Вид "просто ячейки" в нашей программе он принимает в результате установки всех его четырех размеров в 0 (см. HideCombo). Естественно, эти четыре размера (Top, Left и т.д.) доступны через окно "Свойства"... А что Вы хотите-то? Изменить эти 4 свойства одновременно при помощи одного какого-то пятого? Ну, можно попробовать подергать Visible, но эффект, по-моему, не совсем такой же получается...


МОИ: Ник, Tip box: 41001663842605

Сообщение отредактировал Gustav - Воскресенье, 24.06.2012, 22:23
 
Ответить
Сообщение
Quote (Гость)
можно ли через меню "Свойства" "Поля со списком AcktiveX" в режиме "Конструктора" сделать так, чтобы после выпадения комбокса и выбора одной из строк, комбокс сворачивался и принимал вид просто ячейки

Не очень понял. В режиме "Конструктора" из списка выбрать ничего нельзя. Вид "просто ячейки" в нашей программе он принимает в результате установки всех его четырех размеров в 0 (см. HideCombo). Естественно, эти четыре размера (Top, Left и т.д.) доступны через окно "Свойства"... А что Вы хотите-то? Изменить эти 4 свойства одновременно при помощи одного какого-то пятого? Ну, можно попробовать подергать Visible, но эффект, по-моему, не совсем такой же получается...

Автор - Gustav
Дата добавления - 24.06.2012 в 22:22
Гость Дата: Понедельник, 25.06.2012, 18:33 | Сообщение № 12
Группа: Гости
Gustav, просто я хотел узнать - можно ли через стандартные средства (свойства Комбокса) добиться таких же результатов, как используя код) понял, что - нет! задача решена, всем спасибо за помощь!
 
Ответить
СообщениеGustav, просто я хотел узнать - можно ли через стандартные средства (свойства Комбокса) добиться таких же результатов, как используя код) понял, что - нет! задача решена, всем спасибо за помощь!

Автор - Гость
Дата добавления - 25.06.2012 в 18:33
  • Страница 1 из 1
  • 1
Поиск:

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