如何修复“对象变量或未设置块变量”

时间:2019-06-04 18:47:56

标签: excel vba

enter image description here

当我尝试跨多个不具有相同选择样式的框尝试宏时,只会出现此错误。

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

2 个答案:

答案 0 :(得分:1)

解决Selection假设存在选择。如果未选择任何内容,则SelectionNothing,访问其成员将引发错误91,就像您得到的一样。

要解决Selection.Style,需要当前选择具有Style属性,但是Selection可以是ShapeChart,不一定是{ {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

不确定为什么要应用两次格式化吗?