Можно ли исправить или объявить тип ячейки в VBA?

Я знаю, что в VBA мы можем сделать

Cells(4, 2).Value = 100 'the cell is an integer Cells(4, 2).Value = True 'the cell is Boolean Cells(4, 2).Value = "abc" 'the cell is Text 

Можно ли исправить или объявить тип ячейки, например, позволить Cells(4,2) принимать только логические значения, так что назначение Integer или Text to Cells(4, 2) дает ошибку?

[EDIT Это решение может быть реализовано с помощью VBA, но оно не может использоваться из VBA, т. Е. Все еще может установить значение ячейки как угодно из VBA (хотя и не вручную в листе Excel). Не уверен, чего хочет OP. ]

Используйте проверку данных.

Вы можете сделать это через VBA:

 Range("A1").Validation.Add Type:=xlValidateList, Formula1:="TRUE,FALSE" 

или вручную: (В Excel 2003: Данные> Проверка …)

введите описание изображения здесь

Теперь вы можете ввести только логическое значение TRUE или FALSE в ячейке A1. Если вы попытаетесь ввести что-то еще, например, число:

введите описание изображения здесь

Используя проверку данных, вы также можете ограничить ячейку принимать только числа, только целые числа, текст определенной длины, в основном что угодно. Например, чтобы принимать только текст, а не цифры, вы должны использовать Allow: Custom, Formula: =NOT(ISNUMBER(A1)) .

Если вы действительно хотите, чтобы тип ячейки был указан, вы не можете. Насколько я знаю, все ячейки в VBA содержат варианты данных.

Если вы имеете в виду тип данных варианта, то обязательно, вы можете сделать это так или иначе. Вот предложение, оно немного быстро и грязно, но оно работает. Вам нужно будет поместить его в свой модуль кода рабочего листа. Обратите внимание, что он не проверяет, если ваш диапазон bool, диапазон int, независимо от того, что пересекается, что может вызвать некоторые проблемы, если они это сделают.

 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." 

Второе предложение JFC по использованию проверки данных.

Чтобы протестировать его, поместите этот код в модуль ( TRIED AND TESTED )

 Sub Sample() With Sheets("Sheet1").Range("A1") .Validation.Delete .Validation.Add Type:=xlValidateList, Formula1:="TRUE,FALSE" .Value = "SID" End With End Sub 

и это в соответствующем листе

 Private Sub Worksheet_Change(ByVal Target As Range) On Error GoTo Whoa If Not Intersect(Target, Range("A1")) Is Nothing Then Application.EnableEvents = False On Error Resume Next If Not Target.SpecialCells(xlCellTypeSameValidation).Cells.Count < 1 Then Dim currentValidation As Excel.Validation Set currentValidation = Target.Validation If currentValidation.Type = xlValidateList Then '~~> I am using INSTR. If you want you can split it using "," as delim '~~> and check for the value. If Not InStr(1, currentValidation.Formula1, Target.Value, vbTextCompare) Then MsgBox "Incorrect Value" Target.ClearContents End If End If End If On Error GoTo 0 End If LetsContinue: Application.EnableEvents = True Exit Sub Whoa: MsgBox Err.Description Resume LetsContinue End Sub 

Теперь попробуйте запустить Sub Sample() в модуле.

Interesting Posts

SSAS Excel Размерная загрузка фильтра с задержкой

Разбор имен переменных из содержимого ячейки

Excel Solver Поиск целевой суммы из подмножества номеров

csv Writer использует поля данных, возвращенные Pandas

Как изменить значение ячейки для Excel Visual Basic для переменной x в той же строке?

Excel – текст в строки и столбцы?

Могу ли я использовать функцию в качестве критерия в SUMIF?

не удалось установить свойство списка. Недопустимая ошибка значения свойства

CSV-файл Удалить пустые ячейки / столбцы

Текстовый файл с разделителями Open Space с разделителями

Excel VBA: макрос не идентифицирует значение For в цикле

объект 438 ошибки времени выполнения не поддерживает это свойство или метод Internet explorer

Как использовать Workbook_BeforeClose из настраиваемого модуля

Преобразование datatable в excel 2007 (.xlsx)

Подсчитайте все строки в столбце A, содержащие «(ЗАКРЫТО)» или «(НЕ ИСПОЛЬЗУЙТЕ»)

Давайте будем гением компьютера.