当我尝试跨多个不具有相同选择样式的框尝试宏时,只会出现此错误。
Sub Remove_Decimals()
'
' Remove_Decimals Macro
'
' Keyboard Shortcut: Ctrl+Shift+V
'
If Selection.Style = "Percent" Then
Else:
Selection.NumberFormat = "_($* #,##0.0_);_($* (#,##0.0);_($* ""-""??_);_(@_)"
Selection.NumberFormat = "_($* #,##0_);_($* (#,##0);_($* ""-""??_);_(@_)"
End If
End Sub
答案 0 :(得分:1)
解决Selection
假设存在选择。如果未选择任何内容,则Selection
为Nothing
,访问其成员将引发错误91,就像您得到的一样。
要解决Selection.Style
,需要当前选择具有Style
属性,但是Selection
可以是Shape
或Chart
,不一定是{ {1}}个单元格。
确保这一点的唯一方法是验证Range
的数据类型-将此保护子句添加到代码的开头,应该对其进行修复:
Selection
现在我们知道我们正在查看一个If Not TypeOf Selection Is Excel.Range Then Exit Sub
,可以安全地将其强制转换为该接口,并消除仅在运行时解决的后期绑定代码(对于任何错误,存在风险438错字... Range
无法接听):
Option Explicit
现在,我知道我们通常更喜欢正条件,但是在Dim selectedCells As Range
Set selectedCells = Selection
部分中使用整个逻辑创建一个空的条件块毫无意义。反转该条件并删除空块-如果要编写一个值只是为了覆盖下一条语句,则直接跳至第二个赋值:
Else
也就是说,由于该宏被命名为“删除小数”,因此最好首先验证我们正在查看的是数字值-但是我们无法在If selectedCells.Style <> "Percent" Then
selectedCells.NumberFormat = "_($* #,##0_);_($* (#,##0);_($* ""-""??_);_(@_)"
End If
范围内执行此操作,我们需要分别验证每个单元格(因为selectedCells
是在任意多个单元格范围内的2D变体数组)。
所以,回顾一下:
selectedCells.Value
答案 1 :(得分:0)
尝试一下(只是重复使用代码):
Sub Remove_Decimals()
'
' Remove_Decimals Macro
'
' Keyboard Shortcut: Ctrl+Shift+V
'
Dim rngCell As Range
For Each rngCell In Selection
If rngCell.Style <> "Percent" Then
rngCell.NumberFormat = "_($* #,##0.0_);_($* (#,##0.0);_($* ""-""??_);_(@_)"
rngCell.NumberFormat = "_($* #,##0_);_($* (#,##0);_($* ""-""??_);_(@_)"
End If
Next rngCell
End Sub
不确定为什么要应用两次格式化吗?