0

我正在尝试使用下面的代码强制单元格采用大写值,该值有效。

If Intersect(Target, Range("B9", "F10")) Is Nothing Then Exit Sub
    Application.EnableEvents = False
    ActiveSheet.Unprotect Password:=""
    Target = UCase(Target)
    Application.EnableEvents = True
    ActiveSheet.Protect Password:=""

但是,当单元格的内容被删除(可能需要)时,我收到以下错误“运行时错误'13':类型不匹配”

如果您能对此有所了解,那就太好了!

4

2 回答 2

2

Target 是 Range,而不是 String(假设您使用的是 Worksheet_Change 事件)。

应该是多个单元格同时更改,而不是空单元格。

当你只有一个单元格时,一切都很好,因为Target的值评估为 Target.Value,它通常可以转换为 String。当您一次更改多个单元格时,Target.Value 将返回一个数组,该数组不能转换为字符串。

因此,您必须一次更改每个单元格:

Dim cell as Range, cells as Range
Set cells=Intersect(Target, Range("B9", "F10"))
If cells Is Nothing Then Exit Sub
Application.EnableEvents = False
ActiveSheet.Unprotect Password:=""
For each cell In cells.Cells
    Cell.Value = UCase(cell.Value)
Next
Application.EnableEvents = True
ActiveSheet.Protect Password:=""
于 2013-07-18T10:06:23.117 回答
1

我保持我的立场。原始代码是:

Target = UCase(Target)

这意味着您希望 Target range 大写。这样做的方法是将此行替换为:

For Each c In Target
    If VarType(c.Value)=vbString Then
        c.Value = UCase(c.Value)
    End If
Next

这使:

If Intersect(Target, Range("B9", "F10")) Is Nothing Then Exit Sub
    Application.EnableEvents = False
    ActiveSheet.Unprotect Password:=""
    Dim c As Range
    For Each c In Target
        If VarType(c.Value)=vbString Then
            c.Value = UCase(c.Value)
        End If
    Next
    Application.EnableEvents = True
    ActiveSheet.Protect Password:=""
于 2013-07-18T10:04:03.263 回答