Excel VBA删除带删除线文本时触发Error 400是什么原因?
Excel VBA 运行删除删除线文本代码抛出Error 400的原因
核心报错原因
你遇到的Error 400本质是VBA调用Characters方法时传入了无效的操作对象,触发这个问题的常见场景有3种:
- 选中区域包含空单元格:当
Cell为空时,Len(Cell)返回0,循环For iCh = 1 To 0本来不会执行,但如果单元格是假空(比如公式返回的空文本、或存在不可见的控制字符),会导致Characters方法无法定位到有效字符,直接抛出错误。 - 选中区域包含非文本类型的单元格:如果单元格存储的是数值、日期、公式、逻辑值等非普通文本类型,
Characters方法不支持对这类内容的单个字符进行属性读取,执行Cell.Characters(iCh, 1).Font时就会报错。 - 处理的单元格文本长度超过255字符:在2019及更早版本的Excel中,
Characters方法最多支持处理255个字符的单元格内容,超出长度时调用会直接失效。
修复后的代码
你可以在原有逻辑基础上增加校验逻辑,避免对无效单元格执行操作:
Private Sub DelStrikethroughText() '删除选中区域所有带删除线的文本 Dim Cell As Range For Each Cell In Selection ' 仅处理有内容的文本类型单元格 If Not IsEmpty(Cell) And VarType(Cell.Value) = vbString Then DelStrikethroughs Cell End If ' 非文本单元格直接清空删除线格式 Cell.Font.Strikethrough = False Next Cell End Sub Private Sub DelStrikethroughs(Cell As Range) '删除单个单元格内所有带删除线的文本 Dim NewText As String Dim iCh As Long ' 改成长整型避免长文本溢出 Dim strLen As Long strLen = Len(Cell.Value) If strLen = 0 Then Exit Sub ' 适配老版本Excel 255字符限制,超过长度的单元格直接判断整体是否带删除线 If strLen > 255 Then If Cell.Font.Strikethrough = True Then Cell.Value = "" End If Exit Sub End If For iCh = 1 To strLen With Cell.Characters(iCh, 1) If .Font.Strikethrough = False Then NewText = NewText & .Text End If End With Next iCh Cell.Value = NewText Cell.Characters.Font.Strikethrough = False End Sub
内容的提问来源于stack exchange,提问作者BuhefT
相关产品推荐
相关产品推荐

