Тема: Ошибка с типами данных

Помогите пожалуйста!. Ситуация такая: создаю форму и размещаю на ней TextBox для ввода значений. Нужно, чтобы пользователь вводил целые числа от 1 до 7, а в случае вводе остальных чисел, букв или символов, появлялось сообщение об ошибке. Решаю эту задачу через Select Case следующим образом:
Private Sub UserForm_Initialize()
TextBox1.Value = CStr(Var)
End Sub
Private Sub CommandButton1_Click()
Var = CStr(TextBox1.Value)
Select Case Var
    Case Is = 1
        MsgBox "OK!"
    Case Is = 2
       MsgBox "OK!"
         .
         .
         .
    Case Is = 7
        MsgBox "OK"
    Case Else
        MsgBox "Wrong Value!"
End Select
End Sub
Компилятор пишет: "Type Mismatch"(
Что делать?

Re: Ошибка с типами данных

Попробуйте такой вариант:

Private Sub ComboBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
   If (InStr("1234567", Chr(KeyAscii)) = 0) Then
            MsgBox "Wrong value!"
            KeyAscii = 0
   End If
End Sub

Re: Ошибка с типами данных

Var = CStr(TextBox1.Value)
Var у Вас строковая переменная, а проверяете как чило.
Вместо Is = 1 должно быть просто "1". Вот оно и "Несоответствие типов" о чем и пишет компилятор.

Re: Ошибка с типами данных

Или использовать Var = Left(CInt(Trim(Me.TextBox1.Value), 1). Вот тогда первый символ текст-бокса будет конвертироваться в число. На самом деле вариант, предложенный Leonid, наиболее правильный имхо - проверка правильности ввода производится не в момент нажатия кнопки CommandButton1, а момент ввода данных в TextBox

Re: Ошибка с типами данных

вариант, предложенный Leonid, наиболее правильный

А мне кажется, здесь нельзя ограничивать и сказать правильно или неправильно. Смотря какая стоит задача.

Re: Ошибка с типами данных

> brigval
А какая здесь стоит задача? По-моему, самая стандартная - проверка ввода. И вариант который я предлагаю, не столько мой велосипед, сколько общепринятый прием. Вот Андрей явно изобретает что-то новое - оператор Select Case для проверки ввода. Полагаю, что познакомившись со стандартным решением, он будет применять Select Case точнее и уместнее.
Во всяком случае, я задачу своего выступления вижу именно так.

Re: Ошибка с типами данных

> Leonid
Leonid, человек не понял, почему у него не работает код, а Вы просто дали ему свое готовое решение. Без анализа его ошибки.
А задача может быть и такая. У меня при вводе неправльных символов текст краснеет и пользователь видит, что он вводит неправильно. Но он может и продолжать ввод, что б потом исправить нужное место.
А в данном случае ваш пример заставляет его отвлекаться и принудительно закрывать выскакивающее окошко с сообщением.
Далее. В вопросе приведен пример кода, когда правильный ввод подтверждается. Вот Вам и другая еще одна задача.
Кроме того есть и другой подход, когда KeyAscii не преобразуется в символы, а сранивается с числами соответствующими нажатым клавишам. Код менее наглядный, зато количество преобразований в этом случае меньше.
И т.д. и т.п.
Leonid, я не против вашего примера, но сообщать начинающему, что вот этот код "наиболее правильный" я и считаю неправильным. О чем и сказал.

Re: Ошибка с типами данных

Спасибо большое! Использовал вариант, предложенный Леонидом. Все работает. Только не совсем понятен синтаксис. Очевидно, строка "1234567" - это допустимые для ввода числа. А что, если надо интервал шире, скажем, целые числа от 1 до 150?

Re: Ошибка с типами данных

Вот, вот. Человек получил готовое решение и не знает, что дальше с ним делать. А в своем варианте с Select case он бы мог сам увеличивать диапазон хоть до 1000 :)

Re: Ошибка с типами данных

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

brigval пишет:

Человек получил готовое решение и не знает, что дальше с ним делать.

А вспомните как Вы учились, Вам кто-нибудь разжевывал все до такой степени?
И возможно ли научиться программированию без самостоятельного мышления? Вопрос риторический!

Re: Ошибка с типами данных

И все же, рискуя навлечь упреки коллег, привожу еще один вариант:

Private Sub TextBox1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
     Dim TextValue As String
     Dim Number As Integer
     Dim color_default As Long
     TextValue = Me.TextBox1.Text
     color_default = Me.TextBox1.ForeColor
     On Error Resume Next
     Number = CInt(TextValue)
     If (Number > 0 And Number < 151) Then
         Me.TextBox1.ForeColor = vbGreen
         MsgBox "Good value!"
         Me.TextBox1.ForeColor = color_default
      Else
        Me.TextBox1.ForeColor = vbRed
         MsgBox "Wrong value!", vbCritical
         Me.TextBox1.Text = ""
         Me.TextBox1.ForeColor = color_default
     End If
End Sub

Re: Ошибка с типами данных

> Leonid
Уже после отсылки ответа, я подумал, что надо было бы уточнить, что мой ответ был напрален не на ваш пример, а на сообщение kpblc (2005-05-27 08:45:39). Но ответили Вы и я уточнил свою позицию. Так что, пожалуйста, не обижайтесь и не переживайте. Коенц недели, конец рабочего дня... Может и я что-то не так сформулировал.
Мне никто не разжевывал :) Я думаю, что и Вам тоже.

Re: Ошибка с типами данных

Спасибо за помощь

Re: Ошибка с типами данных

> All:
Прошу прощения, что вызвал такое бурное обсуждение... Имелось в виду, что проверка производится во время ввода текста. А что там делать внутри - в принципе, дело десятое.