Combobox на листе. Заполнить значениями.

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

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

Ответить
Dark
Сообщения: 63
Зарегистрирован: 23 июл 2008, 23:21

Уважаемые форумчане объясните пожалуйста!! :confused:

Есть поле ComboBox1 которое должно принимать значения от 1 до 373

1.Использую следующий код:



Private Sub Initialize()

Dim S(1 To 373) As Integer

For i = 1 To 373

S(i) = i

Next i

ComboBox1.List = S

End Sub



Работает единожды, а потом приходится тыкать «носом» программу чтобы в поле появились значения, как быть??



2. В зависимости от значения в поле ComboBox1, предположим ячейка I50 должна принимать разные значения, например:



If ComboBox1.Value = 1 Then Range("I50") = 1

If ComboBox1.Value = 22 Then Range("I50") = 1

……..



If ComboBox1.Value = 310 Then Range("I50") = 3

If ComboBox1.Value = 311 Then Range("I50") = 3

……



Но так как ряд значений достаточно большой, то использовать If ComboBox….Value = … Then Range("…") = … думаю не совсем целесообразно, т.к. это долго и ведет к загромождению кода, можно ли заменить эту функцию какой-нибудь другой, чтобы результат был типа:



If ComboBox1.Value = 1,22,………. Then Range("I50") = 1

If ComboBox1.Value = 310,311,………. Then Range("I50") = 3



На всякий пожарный прилагаю файл

Заранее благодарен!
Vikar
Сообщения: 51
Зарегистрирован: 24 апр 2007, 14:21

Может быть так:

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

Private Sub ComboBox1_Change()
    a = CStr(ComboBox1.Value)
    If InStr("1,12,45,67,123", a) <> 0 Then Range("a1") = 5
    If InStr("5,43,66,129,235", a) <> 0 Then Range("a1") = 7
End Sub

Private Sub UserForm_Activate()
Dim S(1 To 373) As Integer
    For i = 1 To 373
        S(i) = i
    Next i
    ComboBox1.List = S
End Sub


Аватара пользователя
EducatedFool
Сообщения: 197
Зарегистрирован: 06 апр 2008, 14:03
Откуда: Россия, Урал
Контактная информация:

можно ли заменить эту функцию какой-нибудь другой, чтобы результат был типа
Конечно, можно. Например, так:

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

Sub test()
    Select Case ComboBox1.Value
        Case 0, 43, 57: [I50] = 0
        Case 1, 2, 3 To 8, 11 To 56: [I50] = 1
        Case 77, Is > 310: [I50] = 3
        Case Else: [I50] = "что-то новое..."
    End Select
End Sub
Макросы для Excel, Word, CorelDRAW. Быстро, профессионально, недорого. http://ExcelVBA.ru/

Благодарности принимаются на кошелёк WebMoney: R318574877619 и Яндекс.Деньги: 41001335672216
Dark
Сообщения: 63
Зарегистрирован: 23 июл 2008, 23:21

Уважаемый Vikar к сожалению ваш вариант:

Private Sub UserForm_Activate()
Dim S(1 To 373) As Integer
For i = 1 To 373
S(i) = i
Next i
ComboBox1.List = S
End Sub

Не пойдет, я тоже думал сначала что можно использовать его, но дело в том что ComboBox1 находится не в Userform как вы пишите Private Sub UserForm_Activate(), а на Листе1 (см.прикрепленный файл) и на код не реагирует, остается вопрос как его запустить в дело!! Может конечно я что-то не понимаю!!Объясните! :confused:
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

Для элементов находящихся на листе приятнее пользоваться возможностями самого контрола
В приложении файл, который делает то, что Вы хотите без единоф строчки макроса

См свойства:
ListFillRange
ColumnCount
BoundColumn
ColumnWidth
LinkedCell

Список основан на двух колонках, показывается первая, а в целевую ячейку кладется соответствующее значение из второй.
Вложения
Book1.zip
(7.08 КБ) 53 скачивания
Dark
Сообщения: 63
Зарегистрирован: 23 июл 2008, 23:21

Уважаемый Naeel Maqsudov! В принципе что-то типа этого сейчас и стоит, только через значения, а можно все-таки реализовать это через Макрос??Только бы разобраться как прописать инициализацию значений в ComboBox1
--------------------------------------------------------------------------------
Добавлено сообщение
--------------------------------------------------------------------------------
Уважаемый Naeel Maqsudov!!
И еще не особо разобрался с значениями св-в Combobox'а
ListFillRange-данные ввода 1-го значения
ColumnCount-??
BoundColumn??
ColumnWidth-параметры окна вывода Combobox'а
LinkedCell-ячейка в которую выводится конечное значение

Что если в вашем прикрепленном примере значения на вывод которые расположенные в ячейке G9:G25 будут стоять в ячейках H9:H25. Непонял как научить Combobox'а 2-м значениям :confused:
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

Список основан на диапазоне из 2 колонок.
Поэтому ColumnCount = 2, а ListFillRange - это обе колонки!
ColumnWidth - это ширины столбцов, разделенный точкой с запятой. Если надо чтобы некоторые столюцы не отображались, то их ширина = 0
BoundColumn - это номер столбца дающего значения. Т.е. если выбрана в списке некоторая строка, то свойство Value берется из столбца BoundColumn

Аналогично, свойство Text берется из столбца номер TextColumn

В справке все это расписано блее подробно.

Если список (поле со списком) на листе, то заполнять его макросом нет никакого резона, но если очень хочется то так

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

ComboBox1.ColumnCount = 2
ComboBox1.List = Range("A1:B10").Value
или так

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

  Dim itms(0 To 9, 0 To 2)
  ComboBox1.ColumnCount = 3
  itms(0, 0) = 1
  itms(0, 1) = "Первая строка"
  itms(0, 2) = 3453
  itms(1, 0) = 2
  itms(1, 1) = "Вторая строка"
  itms(1, 2) = 3453
  ........
  ComboBox1.List = itms
Vikar
Сообщения: 51
Зарегистрирован: 24 апр 2007, 14:21

Давно не смотрел. Праздники однако...

Если Combobox на листе, то можно сделать почти то же что и с формой
В раздел "ЭтаКнига" поместить этот код:

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

Private Sub Workbook_Open()
Dim S(1 To 373) As Integer
    For i = 1 To 373
        S(i) = i
    Next i
    Лист1.ComboBox1.List = S
End Sub
А в раздел "Лист1" (на котором Combobox) этот:

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

Private Sub ComboBox1_Change()
    a = CStr(ComboBox1.Value)
    If InStr("1,12,45,67,123", a) <> 0 Then Range("a1") = 5
    If InStr("5,43,66,129,235", a) <> 0 Then Range("a1") = 7
End Sub
Ответить