Ввод строго ограниченных значений в указанный диапазон
В процессе эксплуатации программы иногда возникает необходимость сделать так, чтобы вводимые пользователем данные не выходили за рамки определенного интервала. В этом подразделе мы рассмотрим два трюка, которые позволяют решить эту задачу: с использованием диалогового окна и путем непосредственного ввода данных в диапазон. Применение подобных трюков позволяет контролировать корректность вводимых пользователями данных.
Ввод данных с помощью диалогового окна
Можно настроить программу таким образом, что ввод строго ограниченных данных в указанный диапазон будет осуществляться только с помощью диалогового окна. Для этого нужно воспользоваться макросом, код которого приведен в листинге 2.35.
Листинг 2.35. Настройка ввода данных в диалоговом окне
Sub DialogInputData()
Dim intMin As Integer, intMax As Integer ' Диапазон значений
Dim strInput As String ' Введенная пользователем строка
Dim strMessage As String
Dim intValue As Integer
intMin = 1 ' Минимальное значение
intMax = 50 ' Максимальное значение
strMessage = "Введите значение от " & intMin & " до " & intMax
' Ввод значения (цикл завершается, когда пользователь вводит _
значение из заданного диапазона или отменяет ввод)
Do
strInput = InputBox(strMessage)
If strInput = "" Then Exit Sub ' Отмена ввода
' Проверка, содержит ли введенная пользователем строка число
If IsNumeric(strInput) Then
intValue = CInt(strInput)
' Проверка, удовлетворяет ли значение диапазону
If intValue >= intMin And intValue <= intMax Then
' Все условия выполнены
Exit Do
End If
End If
' Формирование сообщения с текстом ошибки
strMessage = «Вы ввели некорректное значение.» & vbNewLine & _
"Введите число от " & intMin & " до " & intMax
Loop
' Внесение данных в ячейку
ActiveSheet.Range(«A1»).Value = strInput
End Sub
После написания данного кода в окне выбора макросов станет доступен макрос DialoglnputData. Для его вызова лучше создать специальную кнопку. После нажатия данной кнопки откроется диалоговое окно с предложением ввести значение от 1 до 50 (интервал значений можно изменять по своему усмотрению – для этого достаточно внести соответствующие изменения в код макроса). При попытке ввода значения, которое выходит за рамки указанного интервала, появится окно с соответствующим предупреждением и повторным предложением ввести корректное значение. Введенное значение будет помещено в ячейку А1 – это указано в строке кода ActiveSheet.Range («Al»). Value = strlnput. Если в данной строке вместо А1 указать, например, В1: Е5, то введенное значение будет помещено во все ячейки указанного интервала.
Непосредственный ввод данных
Если ввод данных с использованием диалогового окна по каким-либо причинам нецелесообразен, то можно вводить их непосредственно в диапазон. При этом программа будет контролировать вводимые данные (чтобы они не выходили за рамки указанного интервала).
Выделим на рабочем листе какой-либо диапазон (например, А1:Е10) и назовем его InputRange. Теперь в редакторе VBA в модуле рабочего листа напишем код, представленный в листинге 2.36.
Листинг 2.36. Ограничение возможных значений диапазона
Sub Worksheet_Change(ByVal Target As Excel.Range)
Dim rgInputRange As Range
Dim cell As Range
Dim strMessage As String
Dim varResult As Variant
' Диапазон, в котором контролируется ввод
Set rgInputRange = Range(«A1:E10»)
' Просмотр всех измененных ячеек и контроль ввода в тех,
которые _
принадлежат заданному диапазону
For Each cell In Target
' Проверка принадлежности диапазону
If Union(cell, rgInputRange).Address =
rgInputRange.Address Then
' Контроль правильности ввода
varResult = IsCellDataValid(cell)
If varResult = True Then
' Введено корректное значение
Exit Sub
Else
' Формирование и вывод сообщения об ошибке
strMessage = "Ячейка " & cell.Address(False, False) &
":" _
& vbCrLf & vbCrLf & varResult
MsgBox strMessage, vbCritical, «Неправильное значение»
' Очистка ввода
Application.EnableEvents = False
cell.ClearContents
cell.Activate
Application.EnableEvents = True
End If
End If
Next cell
End Sub
Function IsCellDataValid(cell As Range) As Variant
' Возвращает True, если в ячейку вводится целое число _
в диапазоне от 1 до 12. В противном случае выдается _
соответствующее сообщение
' Проверка, является ли содержимое ячейки числом
If Not WorksheetFunction.IsNumber(cell.Value) Then
IsCellDataValid = «Нечисловое значение»
Exit Function
End If
' Проверка, является ли введенное число целым
If Int(cell.Value) <> cell.Value Then
IsCellDataValid = «Введите целое число»
Exit Function
End If
' Проверка соответствия числа диапазону
If cell.Value < 1 Or cell.Value > 12 Then
IsCellDataValid = «Значение должно быть от 1 до 12»
Exit Function
End If
' В ячейку введено допустимое значение
IsCellDataValid = True
End Function
После написания данного кода в диапазон А1:Е10 можно будет вводить только целые числовые значения, попадающие в интервал от 1 до 12. При попытке ввода нечислового значения (например, текста) программа не позволит этого сделать – на экране отобразится окно с сообщением Нечисловое значение. Ввод дробного числа также будет невозможен – появится сообщение Введите целое число. Если же попытаться ввести значение, выходящее за рамки интервала от 1 до 12, то это также окажется невозможным и будет выдано сообщение Значение должно быть от 1 до 12.