Помогите, пожалуйста составить макрос для выпадающего списка, чтобы строчек было больше чем 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]
но как сделать на одиночный клик мышки, не могу разобраться. Спасибо заранее!Гость
Одиночный? Это Вам Private Sub Worksheet_SelectionChange(ByVal Target As Range) нужно... Правда тогда не только по клику, но и при любом переходе на ячейки подконтрольного диапазона будет появляться ComboBox1. Но без примера обещать не могу
Одиночный? Это Вам Private Sub Worksheet_SelectionChange(ByVal Target As Range) нужно... Правда тогда не только по клику, но и при любом переходе на ячейки подконтрольного диапазона будет появляться ComboBox1. Но без примера обещать не могу Hugo
Хотел ещё поинтересоваться: если у меня будет несколько диапазонов ValidationList = "n4:n17", и соответственно несколько ComboBox. Каким образом их объединить на одном листе? Я к тому, что нужно ли переделывать данный код (в первом посте) или же внести в него какие-либо изменения (несколько диапазонов)? Заранее спасибо!
Hugo, спасибо за ответ!
Хотел ещё поинтересоваться: если у меня будет несколько диапазонов ValidationList = "n4:n17", и соответственно несколько ComboBox. Каким образом их объединить на одном листе? Я к тому, что нужно ли переделывать данный код (в первом посте) или же внести в него какие-либо изменения (несколько диапазонов)? Заранее спасибо!Гость
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]
Quote (Гость)
если у меня будет несколько диапазонов ValidationList = "n4:n17", и соответственно несколько ComboBox.
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
Буду разбираться, адаптировать под свою задачу. Не подскажите учебник по VB для начинающих (типа меня, с ооочень начальными познаниями в данном языке)? Спасибо!
Gustav, спасибо огромное!
Буду разбираться, адаптировать под свою задачу. Не подскажите учебник по VB для начинающих (типа меня, с ооочень начальными познаниями в данном языке)? Спасибо!Гость
Дата: Воскресенье, 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-х диапазонов, кстати ощутил приемущество двойного клика)) (как в первом посте) - можно копировать данную ячейку. Прошу не пинать за назойливость)Гость
при попытке вставки Вашего варианта кода в строке "Sub ComboChange(cb As ComboBox)" выпадает ошибка "user-defined type not defined".
Если в окне редактора VB выполнить команду меню "Tools \ References", то стоит галочка у библиотеки "Microsoft Forms 2.0 Object Library" ? Почти уверен, что нет, а должна Вы, наверное, вставили код в пустую книгу и пытаетесь скомпилировать. Не получится - надо включить ссылку на MS Forms, причем в списке Вы его, скорее всего, не найдете. Поэтому надо либо через кнопку Browse и указать C:\WINDOWS\system32\FM20.DLL, либо просто вставить на рабочий лист первый комбо-бокс и ссылка на MS Forms появится автоматически.
Quote (Гость)
при попытке вставки Вашего варианта кода в строке "Sub ComboChange(cb As ComboBox)" выпадает ошибка "user-defined type not defined".
Если в окне редактора VB выполнить команду меню "Tools \ References", то стоит галочка у библиотеки "Microsoft Forms 2.0 Object Library" ? Почти уверен, что нет, а должна Вы, наверное, вставили код в пустую книгу и пытаетесь скомпилировать. Не получится - надо включить ссылку на MS Forms, причем в списке Вы его, скорее всего, не найдете. Поэтому надо либо через кнопку Browse и указать C:\WINDOWS\system32\FM20.DLL, либо просто вставить на рабочий лист первый комбо-бокс и ссылка на MS Forms появится автоматически.Gustav
Дата: Воскресенье, 24.06.2012, 19:14 |
Сообщение № 10
Группа: Гости
Gustav, все сделал как Вы описали - всё получилось! (добавил в ручную) Хотел ещё спросить: можно ли через меню "Свойства" "Поля со списком AcktiveX" в режиме "Конструктора" сделать так, чтобы после выпадения комбокса и выбора одной из строк, комбокс сворачивался и принимал вид просто ячейки (как в Вашем примере)?
Gustav, все сделал как Вы описали - всё получилось! (добавил в ручную) Хотел ещё спросить: можно ли через меню "Свойства" "Поля со списком AcktiveX" в режиме "Конструктора" сделать так, чтобы после выпадения комбокса и выбора одной из строк, комбокс сворачивался и принимал вид просто ячейки (как в Вашем примере)?Гость
можно ли через меню "Свойства" "Поля со списком AcktiveX" в режиме "Конструктора" сделать так, чтобы после выпадения комбокса и выбора одной из строк, комбокс сворачивался и принимал вид просто ячейки
Не очень понял. В режиме "Конструктора" из списка выбрать ничего нельзя. Вид "просто ячейки" в нашей программе он принимает в результате установки всех его четырех размеров в 0 (см. HideCombo). Естественно, эти четыре размера (Top, Left и т.д.) доступны через окно "Свойства"... А что Вы хотите-то? Изменить эти 4 свойства одновременно при помощи одного какого-то пятого? Ну, можно попробовать подергать Visible, но эффект, по-моему, не совсем такой же получается...
Quote (Гость)
можно ли через меню "Свойства" "Поля со списком AcktiveX" в режиме "Конструктора" сделать так, чтобы после выпадения комбокса и выбора одной из строк, комбокс сворачивался и принимал вид просто ячейки
Не очень понял. В режиме "Конструктора" из списка выбрать ничего нельзя. Вид "просто ячейки" в нашей программе он принимает в результате установки всех его четырех размеров в 0 (см. HideCombo). Естественно, эти четыре размера (Top, Left и т.д.) доступны через окно "Свойства"... А что Вы хотите-то? Изменить эти 4 свойства одновременно при помощи одного какого-то пятого? Ну, можно попробовать подергать Visible, но эффект, по-моему, не совсем такой же получается...Gustav
Дата: Понедельник, 25.06.2012, 18:33 |
Сообщение № 12
Группа: Гости
Gustav, просто я хотел узнать - можно ли через стандартные средства (свойства Комбокса) добиться таких же результатов, как используя код) понял, что - нет! задача решена, всем спасибо за помощь!
Gustav, просто я хотел узнать - можно ли через стандартные средства (свойства Комбокса) добиться таких же результатов, как используя код) понял, что - нет! задача решена, всем спасибо за помощь!Гость