Связка Combobox и Visible

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Neithan
Новичок
Новичок
 
Сообщения: 25
Зарегистрирован: 30.05.2010 (Вс) 8:10

Связка Combobox и Visible

Сообщение Neithan » 30.05.2010 (Вс) 8:25

Здравствуйте!

У меня, как у совсем еще новичка в деле vba, возник позорный вопрос, как сделать так, чтобы при выборе из выпадающего списка combobox можно было бы сделать исчезновение всех полей (касающихся одних определенных расчетов) с userform1 и заменить их другими полями (касающимися других расчетов) на той же userform1?

Т.е. дело по сути вот в чем: нужно сделать калькулятор, который совмещал бы в себе например суммирование шести строк (textbox) и второй своей функцией мог бы считать только две строки (но уже абсолютно по другому алгоритму, например умножать и делить).

Иными словами сделать так, чтобы при выборе из выпадающего списка можно было выбрать определенную методику расчета, при этом старая методика (соответственно со старыми строками textbox для расчета этой методики) исчезала и заменялась бы на том же месте и на той же userform уже другими строками и соответственно другими формулами для этих строк.

Excel файл прилагается, работаю в 2003 офисе =/

Буду рад если поможете, если неохота качать файл, могу скинуть сюда код, но в правилах прочел, что так лучше не делать. Я совсем еще новичок, так что надеюсь на понимание =)

Заранее спасибо!
Ссылка на файл:
http://depositfiles.com/files/jioldbcyq

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Связка Combobox и Visible

Сообщение iGrok » 30.05.2010 (Вс) 12:06

Как самый простой вариант - можно создать на форме два фрейма (контейнера), поместить в один - 6 полей ввода и кнопку для выполнения расчётов, во второй - 2 поля, и кнопку. Для кнопок прописать весь код взаимодействия с соответствующими полями, а по выбору значения в комбо - скрывать один из фреймов и показывать второй.
label:
cli
jmp label

Neithan
Новичок
Новичок
 
Сообщения: 25
Зарегистрирован: 30.05.2010 (Вс) 8:10

Re: Связка Combobox и Visible

Сообщение Neithan » 30.05.2010 (Вс) 13:16

Спасибо за подсказку, но в силу своей недалекости в этом, никак не могу реализовать, т.е. как я понял надо поработать с этими 2мя кодами (предварительно я полностью фреймом закрыл все кнопки на юзерформе):
Код: Выделить всё
Private Sub Frame1_Click()

End Sub

Private Sub UserForm_Initialize()
ComboBox1.AddItem "Рассчет 1"
ComboBox1.AddItem "Рассчет 2"
ComboBox1.AddItem "Рассчет 3"
ComboBox1.AddItem "Рассчет 4"
End Sub


Полагаю надо применить оператор if then? Или я не прав, то есть что-то вроде:
Код: Выделить всё
if combobox1.additem "Рассчет1"
then frame1.visualise=false
end if


Но все это выглядит красным, у меня пока с логикой в этих вопросах проблемы =/

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Связка Combobox и Visible

Сообщение iGrok » 30.05.2010 (Вс) 13:41

Neithan писал(а):Полагаю надо применить оператор if then? Или я не прав, то есть что-то вроде:
Код: Выделить всё
if combobox1.additem "Рассчет1"
then frame1.visualise=false
end if


А при чём там Additem?
Проверять надо в событии ComboBox1_Change(). Как-то так:
Код: Выделить всё
Private Sub ComboBox1_Change()
    Select Case ComboBox1.ListIndex
        Case 0
            Debug.Print "A"
        Case 1
            Debug.Print "B"
        Case 2
            Debug.Print "C"
    End Select
End Sub

Private Sub UserForm_Initialize()
    ComboBox1.AddItem "A"
    ComboBox1.AddItem "B"
    ComboBox1.AddItem "C"
End Sub
label:
cli
jmp label

Neithan
Новичок
Новичок
 
Сообщения: 25
Зарегистрирован: 30.05.2010 (Вс) 8:10

Re: Связка Combobox и Visible

Сообщение Neithan » 30.05.2010 (Вс) 16:28

Спасибо огромное, сделал вроде как Вы и сказали, создал два фрейма, на них разместил соответственно по кнопке и поля для ввода чисел, но почему то не скрывает он одну форму при выборе из комбобокса, а оставляет видимыми обе из них, какой бы выбор из комбобокса я не делал =/ Tсли не трудно, поясните пожалуйста что я не так сделал. И оператор Case мне в новину =)


Код: Выделить всё
Private Sub CommandButton1_Click()
Dim a As Double
Dim b As Double
Dim c As Double
Dim d As Double
Dim e As Double
Dim f As Double
Dim g As Double

a = CDbl(TextBox1.Text)
b = CDbl(TextBox2.Text)
c = CDbl(TextBox3.Text)
d = CDbl(TextBox4.Text)
e = CDbl(TextBox5.Text)
f = CDbl(TextBox6.Text)

g = (a + b + c + d + e + f)

TextBox7.Text = g
End Sub

Private Sub CommandButton2_Click()

Dim h As Double
Dim i As Double
Dim j As Double


h = CDbl(TextBox8.Text)
i = CDbl(TextBox9.Text)

j = (h + i)

TextBox10.Text = j
End Sub

Private Sub ComboBox1_Change()

    Select Case ComboBox1.ListIndex
        Case 0
    Debug.Print "Рассчет 1"
        Case 1
    Debug.Print "Рассчет 2"
        Case 2
    Debug.Print "Рассчет 3"
        End Select
   
End Sub


Private Sub UserForm_Initialize()
ComboBox1.AddItem "Рассчет 1"
ComboBox1.AddItem "Рассчет 2"
ComboBox1.AddItem "Рассчет 3"
End Sub

Neithan
Новичок
Новичок
 
Сообщения: 25
Зарегистрирован: 30.05.2010 (Вс) 8:10

Re: Связка Combobox и Visible

Сообщение Neithan » 30.05.2010 (Вс) 16:49

Почему то не выходит сделать например так:

Код: Выделить всё
Private Sub ComboBox1_Change()

    If ComboBox1.Item = "Рассчет 1"
    then Frame1.Visible = False
    End If
   
End Sub

Private Sub UserForm_Initialize()
ComboBox1.AddItem "Рассчет 1"
ComboBox1.AddItem "Рассчет 2"
ComboBox1.AddItem "Рассчет 3"
End Sub


По-моему было бы просто =)) Но почему то ошибку выдает, видно опять туплю и синтаксис какой ни будь перепутал...

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Связка Combobox и Visible

Сообщение iGrok » 30.05.2010 (Вс) 17:10

Код: Выделить всё
If ComboBox1.Item = "Рассчет 1"
    then Frame1.Visible = False
    End If

Это вообще бред. У кобмо нет свойства Item. Плюс нарушен синтаксис if - then. Вот среда и ругается. Зачем ты перенёс Then на новую строку?
У комбо есть свойство List - это массив строк комбобокса. Если хочешь сравнивать с чем-то выбранную строку,
тогда If ComboBox.List(ComboBox.ListIndex) = "строка" Then .....
Только сначала надо проверять чтобы ListIndex не был равен -1 (ничего не выбрано).
Лучше же просто сравнивать индексы. Собственно, первая добавленная строка будет иметь нулевой индекс, вторая - первый, и т.п.

Далее, по моему коду. Debug.print - это чисто для примера.
Разумеется, вместо этого нужно устанавливать правильное visible для фреймов.
Т.е. скрывать один и показывать другой.
label:
cli
jmp label

Neithan
Новичок
Новичок
 
Сообщения: 25
Зарегистрирован: 30.05.2010 (Вс) 8:10

Re: Связка Combobox и Visible

Сообщение Neithan » 30.05.2010 (Вс) 17:28

Спасибо!!!!)))
Вот плоды :D :D :D Дабы Вы не подумали, что зазря вас терзал =))

Код: Выделить всё
Private Sub ComboBox1_Change()

    Select Case ComboBox1.ListIndex
   
        Case 0
    Frame1.Visible = True
    Frame2.Visible = False
    Frame3.Visible = False
   
        Case 1
    Frame1.Visible = False
    Frame2.Visible = True
    Frame3.Visible = False
   
        Case 2
    Frame1.Visible = False
    Frame2.Visible = False
    Frame3.Visible = True
   
        End Select
End Sub


Меня только одно очень огорчило, мне нужно было, чтобы поверх фрейма 1 мог появляться фрейм 2, а оказалось, что их нельзя наложить друг на друга, как выйти из ситуации? ((



А можно ли сделать так, чтобы по-умолчанию за место пустой строки у меня был бы Case 0?

Вообще я не имею соответствующего образования и только неделю изучаю вба, потому такие и вопросы =/

С позволения хотелось бы еще спросить у Вас, а возможно ли сделать так, чтобы:

1) юзерформ из вба была прикреплена к странице экселя, ну то есть при открытии файла, сразу появлялась юзерформа моя и всегда была бы зафиксирована в одном месте.
2) когда юзер кликал бы на кнопку закрытия окна юзерформы, чтобы его не выносило в редактор ВБА, как то можно этот "крестик" убрать или сделать его безвредным?
3) возможно ли сделать так, чтобы текстбокс мог суммировать и вычитать в одной строке, то есть чтобы в например в TextBox1 можно было бы ввести выражение: "2+3-4" и он бы посчитал (но не в этом тест боксе), что это 1 и прибавил бы этот 1 к итоговому TextBox суммы?

Ещё раз огромное Вам спасибо, даже не надеюсь, что на всё захотите ответить, но все равно дерзнул, ибо это последнее, что меня пока сильно терзает )
Последний раз редактировалось Neithan 30.05.2010 (Вс) 17:57, всего редактировалось 1 раз.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Связка Combobox и Visible

Сообщение iGrok » 30.05.2010 (Вс) 19:05

О. Уже похоже на правду. =)
Насчёт наложить друг на друга - не совсем понял.

Насчёт Case и по-умолчанию: http://www.firststeps.ru/vba/vbahelp/r.php?61
Т.е. напр:
Код: Выделить всё
Select Case ...
  Case 1
  Case 2
  Default
End Select


Далее, вопросы:
1) Я не спец по vba, но попробуй выбрать в редакторе проекта vba книгу, открыть код, в окне кода наверху в левом комбобоксе выбрать Workbook, в правом - Open, и прописать код показа формы в этом событии (что-то типа UserForm1.Show).
Насчёт показа в одном месте - либо перед Show задавай нужные координаты (UserForm1.Left, Top), либо выбирай в свойствах формы StartupPosition - Manual, и задавай координаты там.

2) Если форма будет показана именно так (п.1), а не запуском из редактора - то по закрытию формы ты окажешься не в редакторе, а на листе, с которого она открылась.

3) Ищи математические парсеры. На этом форуме в "Кирпичах" есть несколько вариантов, что-то из них явно можно прикрутить к вба.
label:
cli
jmp label

Neithan
Новичок
Новичок
 
Сообщения: 25
Зарегистрирован: 30.05.2010 (Вс) 8:10

Re: Связка Combobox и Visible

Сообщение Neithan » 30.05.2010 (Вс) 19:16

Оооо, спасибо )))) Как всегда четко!!!

А по-поводу фреймов, поясню, я сделал три фрейма на 1й юзерформе (для каждого задал соответственно обьекты и коды к ним) ну и мне было принципиально, чтобы я мог прямо в юзерформе закрыть один фрейм другим, то есть, чтобы при выборе из комбобокса именно на том месте где был фрейм 1 появился фрейм 2. Короче наложить один фрейм на место другого фрейма сделав невидимым два других. И ничего не вышло, т.к. почему то показывается один фрейм, а остальные оказываются загороженными под ним, несмотря на код Визибл ((( есть какой ни будь вариант решения этой пролемы? )))

И ещё я не понял, куда мне прописать
Код: Выделить всё
Select Case ComboBox1_Change()
  Case 1
  Case 2
  Default
end select


И почему Вы написали в качестве дефолта два кейса, можно же типа просто Case 1 и все? Пытался как то вписать в мой предыдущий код касающийся комбобокса, но не вышло(

Попытался сделать так, чтобы форма появилась в экселе на листе, ничего не вышло =/

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Связка Combobox и Visible

Сообщение iGrok » 30.05.2010 (Вс) 19:52

Мда.. Слушай, прочитай книжку какую-нибудь, а? Учебников по VBA в сети - выше крыши.
Я тебе три раза написал пример работы с Select Case, дал ссылку на описание конструкции, а ты всё равно её криво пишешь..

Держи пример со всем, что тебе нужно...
Вложения
uft.zip
(9.27 Кб) Скачиваний: 163
label:
cli
jmp label

Neithan
Новичок
Новичок
 
Сообщения: 25
Зарегистрирован: 30.05.2010 (Вс) 8:10

Re: Связка Combobox и Visible

Сообщение Neithan » 30.05.2010 (Вс) 20:17

Прошу прощения, спасибо большое за помощь!

Нормально вроде всё, кроме 1-го нюанса, я задал для своих текстбоксов переменными цифры, то есть:
Код: Выделить всё
Dim a As Double
a = CDbl(TextBox1.Text)


Отсюда и проблема, когда у меня в строке текстбокса не ноль (а я его поставил в значение Text свойств поля) и не какое - либо число, то происходит ошибка.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Связка Combobox и Visible

Сообщение iGrok » 30.05.2010 (Вс) 20:59

Ммм..
Можно отлавливать события ввода на текстбоксе, и не давать ввести туда ничего, кроме цифр.
Можно ловить и обрабатывать ошибку (Конструкция On Error Goto ... - как использовать смотри в гугле или поиском по этому форуму)
А можно использовать Val вместо CDbl.
label:
cli
jmp label

Neithan
Новичок
Новичок
 
Сообщения: 25
Зарегистрирован: 30.05.2010 (Вс) 8:10

Re: Связка Combobox и Visible

Сообщение Neithan » 30.05.2010 (Вс) 23:22

Отлично! Val как раз то, что надо, единственный минус, что нельзя ставить запятую, а только точку, еслли есть дробное число)) Спасибо!))

И еще раз хотел поблагодарить за пример, который Вы мне сделали))) Однако я про фреймы имел ввиду другое)) в Вашем примере они как бы наискосок идут, м мне надо, чтобы один фрейм полностью накрывал место расположение другого, а этого похоже сделать нельзя =)

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Связка Combobox и Visible

Сообщение iGrok » 31.05.2010 (Пн) 0:04

Запятые, точки:
Опять же, самый простой вариант - заменяем предварительно все запятые на точки: a = Val( Replace$( text, ",", "." ) )
По хорошему же, надо проверять системный разделитель точки и запятой, и для Val заменять его на точку.

Neithan писал(а):а этого похоже сделать нельзя =)

Конечно можно. В окне свойств (Properties) выбираешь второй фрейм. Выставляешь ему Left и Top такие же, как у первого, и вуаля.

Можно и по другому - выставлять Frame2.Top = Frame1.Top: Frame2.Left = Frame1.Left в Form_Initialize..
label:
cli
jmp label

Neithan
Новичок
Новичок
 
Сообщения: 25
Зарегистрирован: 30.05.2010 (Вс) 8:10

Re: Связка Combobox и Visible

Сообщение Neithan » 31.05.2010 (Пн) 7:10

!!! =))))))))))
Спасибо!!! За терпение в первую очередь ))) Приду с работы всё потестирую +))


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex-бот и гости: 18

    TopList