Если вы действительно хотите, чтобы тип ячейки был указан, вы не можете. Насколько мне известно, все ячейки в VBA содержат разные типы данных.
Если вы имеете в виду тип данных варианта, то, конечно, вы можете сделать это так или иначе. Вот предложение, это немного быстро и грязно, но это работает. Вы должны будете поместить это в свой модуль кода рабочего листа. Обратите внимание, что он не проверяет, пересекает ли ваш диапазон bool, int range, что угодно, что может вызвать у вас некоторые проблемы.
Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo handler
Dim cell As Range, _
boolRng As Range, _
intRng As Range
Set boolRng = Union(Sheet1.Range("A1:B2"), Sheet1.Range("E:E"))
Set intRng = Union(Sheet1.Range("B7:K12"), Sheet1.Range("M:M"))
If Not Intersect(Target, boolRng) Is Nothing Then
For Each cell In Intersect(Target, boolRng)
If cell.Value <> "" Then
cell.Value = CBool(cell.Value)
End If
Next cell
End If
If Not Intersect(Target, intRng) Is Nothing Then
For Each cell In Intersect(Target, intRng)
If cell.Value <> "" Then
cell.Value = CInt(cell.Value)
End If
Next cell
End If
Exit Sub
handler:
Select Case Err.Number
Case 13 'Type mismatch, raised when cint/cbool/c*** fails
cell.Value = ""
Resume Next
Case Else
Err.Raise Err.Number, Err.Source, Err.Description, Err.HelpFile, Err.HelpContext
End Select
End Sub
Редактировать: Замечу, что вы хотите вызвать ошибку, если значение назначено неправильно, вы можете сделать это в разделе обработки ошибок. Вместо
Cell.value = ""
Resume Next
Вы можете использовать
Err.Raise ISuggestAnEnumForErrorNumbers, "Sheet1.Worksheet_Change(Event)", "Attempted to assign wrong type to cell."