Вопрос по выпадающему списку

Весь MS Office, программирование на Visual Basic for Applications и MS VB

Модератор: Naeel Maqsudov

Akemi
Сообщения: 19
Зарегистрирован: 20 ноя 2007, 14:57
Контактная информация:

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

Рабочий код я написал, он выглядит так:

Код: Выделить всё

Sub Granichny_znachennya()

If Range("b4").Value = "" Then

Range("h16").Value = 0
Range("i16").Value = 0
Range("j16").Value = 0

ElseIf Range("b4").Value = "важка промисловість" Then

Range("h16").Value = Worksheets(1).Range("d8").Value
Range("i16").Value = Worksheets(1).Range("c8").Value
Range("j16").Value = Worksheets(1).Range("b8").Value

ElseIf Range("b4").Value = "легка промисловість" Then

Range("h16").Value = Worksheets(1).Range("d9").Value
Range("i16").Value = Worksheets(1).Range("c9").Value
Range("j16").Value = Worksheets(1).Range("b9").Value

ElseIf Range("b4").Value = "будівництво" Then

Range("h16").Value = Worksheets(1).Range("d10").Value
Range("i16").Value = Worksheets(1).Range("c10").Value
Range("j16").Value = Worksheets(1).Range("b10").Value

ElseIf Range("b4").Value = "транспорт" Then

Range("h16").Value = Worksheets(1).Range("d11").Value
Range("i16").Value = Worksheets(1).Range("c11").Value
Range("j16").Value = Worksheets(1).Range("b11").Value

ElseIf Range("b4").Value = "зв'язок" Then

Range("h16").Value = Worksheets(1).Range("d12").Value
Range("i16").Value = Worksheets(1).Range("c12").Value
Range("j16").Value = Worksheets(1).Range("b12").Value

ElseIf Range("b4").Value = "сільське господарство" Then

Range("h16").Value = Worksheets(1).Range("d13").Value
Range("i16").Value = Worksheets(1).Range("c13").Value
Range("j16").Value = Worksheets(1).Range("b13").Value

ElseIf Range("b4").Value = "інші галузі мат. виробництва" Then

Range("h16").Value = Worksheets(1).Range("d14").Value
Range("i16").Value = Worksheets(1).Range("c14").Value
Range("j16").Value = Worksheets(1).Range("b14").Value

ElseIf Range("b4").Value = "оптова торгівля" Then

Range("h16").Value = Worksheets(1).Range("d15").Value
Range("i16").Value = Worksheets(1).Range("c15").Value
Range("j16").Value = Worksheets(1).Range("b15").Value

ElseIf Range("b4").Value = "роздрібна торгівля" Then

Range("h16").Value = Worksheets(1).Range("d16").Value
Range("i16").Value = Worksheets(1).Range("c16").Value
Range("j16").Value = Worksheets(1).Range("b16").Value

ElseIf Range("b4").Value = "громадське харчування" Then

Range("h16").Value = Worksheets(1).Range("d17").Value
Range("i16").Value = Worksheets(1).Range("c17").Value
Range("j16").Value = Worksheets(1).Range("b17").Value

ElseIf Range("b4").Value = "освіта, охорона здоров'я" Then

Range("h16").Value = Worksheets(1).Range("d18").Value
Range("i16").Value = Worksheets(1).Range("c18").Value
Range("j16").Value = Worksheets(1).Range("b18").Value

ElseIf Range("b4").Value = "операції з нерухомістю" Then

Range("h16").Value = Worksheets(1).Range("d19").Value
Range("i16").Value = Worksheets(1).Range("c19").Value
Range("j16").Value = Worksheets(1).Range("b19").Value

ElseIf Range("b4").Value = "сфера послуг" Then

Range("h16").Value = Worksheets(1).Range("d20").Value
Range("i16").Value = Worksheets(1).Range("c20").Value
Range("j16").Value = Worksheets(1).Range("b20").Value

ElseIf Range("b4").Value = "інші галузі немат. виробництва" Then

Range("h16").Value = Worksheets(1).Range("d21").Value
Range("i16").Value = Worksheets(1).Range("c21").Value
Range("j16").Value = Worksheets(1).Range("b21").Value

End If

End Sub
Проблема состоит в том, чтоб этот код выполнялся автоматически при работе с документом, а он у меня выполняется только после нажатия кнопки выполнения макроса. Подскажите как быть?

Пробовал использовать метод работы с событиями:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

Сall Granichny_znachennya

End Sub

после первого выбора значения из выпадающего списка значения в необходимых трех ячейках меняются, но потом видимо происходит какое-то зацикливание и все виснит, при этом ЦП забивается на 100%...
packer
Сообщения: 17
Зарегистрирован: 16 ноя 2007, 13:00
Откуда: Ekaterinburg
Контактная информация:

Akemi писал(а):Помогите пожалуйста решить вопрос с выпадающим списком в Excel.
У меня такая задача: есть выпадающий список со значениями, при выборе одного из этих значений в трех других ячейках на этом же листе должны меняться значения.

Рабочий код я написал, он выглядит так ...

Проблема состоит в том, чтоб этот код выполнялся автоматически при работе с документом, а он у меня выполняется только после нажатия кнопки выполнения макроса. Подскажите как быть?

Пробовал использовать метод работы с событиями:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

Сall Granichny_znachennya

End Sub

после первого выбора значения из выпадающего списка значения в необходимых трех ячейках меняются, но потом видимо происходит какое-то зацикливание и все виснит, при этом ЦП забивается на 100%...
Если у Вас выпадающий список - то это ведь эл-т контрол типа Комбобокс?
И обработчик события должен быть его, а не листа.

Например

Private Sub CmbxDriver_Change()
'С изменением фамилии в комбобоксе соотв-й ячейке шаблона присваивается фамилия водителя
Dim ФамилияВодителя As String
ФамилияВодителя = CmbxDriver.Value
ActiveSheet.Range("B7") = ФамилияВодителя
End Sub
Akemi
Сообщения: 19
Зарегистрирован: 20 ноя 2007, 14:57
Контактная информация:

У меня выпадающий список находится непосредственно на листе в одной из ячеек. Я его делал путем: Данные - Проверка... - Список.
В редакторе VBA он называется xlValidateList.

Сам макрос создания этого списка имеет вид:

Код: Выделить всё

Sub Макрос1()

    With Selection.Validation
        .Delete
        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
        xlBetween, Formula1:="=$K$1:$K$15"
        .IgnoreBlank = True
        .InCellDropdown = True
        .InputTitle = ""
        .ErrorTitle = ""
        .InputMessage = ""
        .ErrorMessage = ""
        .ShowInput = True
        .ShowError = True
    End With

End Sub
Я так понимаю что приведенный вами пример относится к элементу объекта комбобокс, который отличается от моего xlValidateList.
Akemi
Сообщения: 19
Зарегистрирован: 20 ноя 2007, 14:57
Контактная информация:

проще говоря, мне нужно чтоб при появлении в одной ячейке определенного значения в трех других ячейках автоматически происходили изменения значений. как я уже говорил мой код делает то что мне нужно, но он не работает автоматически, а только при нажатии кнопки выполнить F5 в редакторе, либо непосредственно при вызове макроса. может можно как-то сделать чтоб данный макрос работал постоянно, а не только по нажатию кнопки F5? или подцепить как-то саму написанную мною процедуру на обработчик событий, который реагирует на изменение данных в ячейке? Я просто в основном работаю с PHP и MySQL, а с VBA столкнулся впервые...
packer
Сообщения: 17
Зарегистрирован: 16 ноя 2007, 13:00
Откуда: Ekaterinburg
Контактная информация:

Akemi писал(а):проще говоря, мне нужно чтоб при появлении в одной ячейке определенного значения в трех других ячейках автоматически происходили изменения значений. как я уже говорил мой код делает то что мне нужно, но он не работает автоматически, а только при нажатии кнопки выполнить F5 в редакторе, либо непосредственно при вызове макроса. может можно как-то сделать чтоб данный макрос работал постоянно, а не только по нажатию кнопки F5? или подцепить как-то саму написанную мною процедуру на обработчик событий, который реагирует на изменение данных в ячейке? Я просто в основном работаю с PHP и MySQL, а с VBA столкнулся впервые...
Так Вам просто нужно обработать событие Чэндж именно в этой ячейке, т.е. если Target - это нужная Вам ячейка, то вызов процедуры.

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If.Target.Address="A1" Then
Сall Granichny_znachennya
End If
End Sub
PS Ухожу с работы - мож и наврал - коллеги поправят.
PPS Обработка события-то другого должна быть - чот я по-русски написал правильно, а на VBA - ерунду)))
Вот корректный пример в случае, когда нужно "нужно чтоб при появлении в одной ячейке определенного значения ... " что-то запускалось автоматом
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address(ReferenceStyle:=xlR1C1) = "R1C1" Then
MsgBox Range("A1")
End If
End Sub
Мне больше по душе использование контрола комбобокс для выпадающих списков.
Akemi
Сообщения: 19
Зарегистрирован: 20 ноя 2007, 14:57
Контактная информация:

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

С этим вопросом я уже разобрался, вот если кому-то понадобится код (с использованием комбобокса):

Код: Выделить всё

Private Sub ComboBox1_Click()

Me.ComboBox1.ListFillRange = "K1:K15"

If Me.ComboBox1.Value = "" Then

Range("h16").Value = 0
Range("i16").Value = 0
Range("j16").Value = 0

ElseIf Me.ComboBox1.Value = "важка промисловість" Then

Range("h16").Value = Worksheets(1).Range("d8").Value
Range("i16").Value = Worksheets(1).Range("c8").Value
Range("j16").Value = Worksheets(1).Range("b8").Value

ElseIf Me.ComboBox1.Value = "легка промисловість" Then

Range("h16").Value = Worksheets(1).Range("d9").Value
Range("i16").Value = Worksheets(1).Range("c9").Value
Range("j16").Value = Worksheets(1).Range("b9").Value

ElseIf Me.ComboBox1.Value = "будівництво" Then

Range("h16").Value = Worksheets(1).Range("d10").Value
Range("i16").Value = Worksheets(1).Range("c10").Value
Range("j16").Value = Worksheets(1).Range("b10").Value

ElseIf Me.ComboBox1.Value = "транспорт" Then

Range("h16").Value = Worksheets(1).Range("d11").Value
Range("i16").Value = Worksheets(1).Range("c11").Value
Range("j16").Value = Worksheets(1).Range("b11").Value

ElseIf Me.ComboBox1.Value = "зв'язок" Then

Range("h16").Value = Worksheets(1).Range("d12").Value
Range("i16").Value = Worksheets(1).Range("c12").Value
Range("j16").Value = Worksheets(1).Range("b12").Value

ElseIf Me.ComboBox1.Value = "сільське господарство" Then

Range("h16").Value = Worksheets(1).Range("d13").Value
Range("i16").Value = Worksheets(1).Range("c13").Value
Range("j16").Value = Worksheets(1).Range("b13").Value

ElseIf Me.ComboBox1.Value = "інші галузі мат. виробництва" Then

Range("h16").Value = Worksheets(1).Range("d14").Value
Range("i16").Value = Worksheets(1).Range("c14").Value
Range("j16").Value = Worksheets(1).Range("b14").Value

ElseIf Me.ComboBox1.Value = "оптова торгівля" Then

Range("h16").Value = Worksheets(1).Range("d15").Value
Range("i16").Value = Worksheets(1).Range("c15").Value
Range("j16").Value = Worksheets(1).Range("b15").Value

ElseIf Me.ComboBox1.Value = "роздрібна торгівля" Then

Range("h16").Value = Worksheets(1).Range("d16").Value
Range("i16").Value = Worksheets(1).Range("c16").Value
Range("j16").Value = Worksheets(1).Range("b16").Value

ElseIf Me.ComboBox1.Value = "громадське харчування" Then

Range("h16").Value = Worksheets(1).Range("d17").Value
Range("i16").Value = Worksheets(1).Range("c17").Value
Range("j16").Value = Worksheets(1).Range("b17").Value

ElseIf Me.ComboBox1.Value = "освіта, охорона здоров'я" Then

Range("h16").Value = Worksheets(1).Range("d18").Value
Range("i16").Value = Worksheets(1).Range("c18").Value
Range("j16").Value = Worksheets(1).Range("b18").Value

ElseIf Me.ComboBox1.Value = "операції з нерухомістю" Then

Range("h16").Value = Worksheets(1).Range("d19").Value
Range("i16").Value = Worksheets(1).Range("c19").Value
Range("j16").Value = Worksheets(1).Range("b19").Value

ElseIf Me.ComboBox1.Value = "сфера послуг" Then

Range("h16").Value = Worksheets(1).Range("d20").Value
Range("i16").Value = Worksheets(1).Range("c20").Value
Range("j16").Value = Worksheets(1).Range("b20").Value

ElseIf Me.ComboBox1.Value = "інші галузі немат. виробництва" Then

Range("h16").Value = Worksheets(1).Range("d21").Value
Range("i16").Value = Worksheets(1).Range("c21").Value
Range("j16").Value = Worksheets(1).Range("b21").Value

End If

End Sub
Pavel55
Сообщения: 418
Зарегистрирован: 20 окт 2006, 11:40
Откуда: Moscow

Ребята, плиз, берите свой код в тэги

Код: Выделить всё

 ВАШ КОД [./code] 

(только без точки внутри тэга, это чтобы вы сейчас увидели этот тэг). Чтобы получилось такое

[CODE]MsgBox "Берите код в ТЭГИ!!!
Аватара пользователя
Игорь Акопян
Сообщения: 1440
Зарегистрирован: 13 окт 2004, 17:11
Откуда: СПБ
Контактная информация:

Pavel55, а чтобы не писать
&quot писал(а):(только без точки внутри тэга, это чтобы вы сейчас увидели этот тэг). Чтобы получилось такое
надо обрамить пример тэга тэгом [noparse][noparse] [/noparse] [/noparse]
Типа так: [noparse]

Код: Выделить всё

 ВАШ КОД 
[/noparse]

;)
Изображение
Pavel55
Сообщения: 418
Зарегистрирован: 20 окт 2006, 11:40
Откуда: Moscow

))) бум знать )
Akemi
Сообщения: 19
Зарегистрирован: 20 ноя 2007, 14:57
Контактная информация:

Подскажите еще пожалуйста возможно ли в выпадающем списке как-то забить значения по умолчанию непосредственно в коде ВБА, чтоб их не приходилось считывать с листа, как в случае с

Код: Выделить всё

Me.ComboBox1.ListFillRange = "K1:K15"?
В делфи я такое делал с помощью окна Properties, там есть строчка Items, куда все значения и вбивались, а в ВБА я такого не нашел.
Ответить