改变Range颜色的按钮和DblClick以恢复更改

时间:2015-03-19 15:43:52

标签: excel-vba colors range double-click undo

我希望编辑我当前的代码,因为它很长,但如果需要,我可以坚持下去。我的当前代码只是在每个按钮上重复,因为它通过ActiveX按钮运行(这些按钮必须保留)。首选撤消操作,但使用RGB更改颜色是可行的选择。

我的编码如下:

Private Sub btn3_Click()
     Sheet1.Range("A84:J84").Interior.ColorIndex = 16
End Sub

这会成功地将单元格范围更改为灰色,我现在需要双击以撤消操作或将颜色更改回原始颜色的内容;我做了两次尝试。

使用撤消功能。

Private Sub btn3_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
       Application.EnableEvents = False
       Application.Undo
       Application.EnableEvents = True
End Sub

然后我尝试了另一种方法并改变颜色。

Private Sub btn3_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    Dim color_index As Long
        color_index = 10
        Sheet1.Range("A84:J84").Interior.Color(color_index) = RGB(153, 153, 255)
End Sub

最终结果均未成功。

这些都不起作用,并希望能够解决这些问题。或者为了解决我的错误,接受任何想法,但我必须保留我不能使用的按钮' Cell Selection'。

修改 如果可能的话,我的数组方法是可用的,我不熟悉使用ActiveX控件,所以任何建议都很可能非常有用。

我的工作簿解释了btn3代表什么。   http://i.stack.imgur.com/35p2f.png

1 个答案:

答案 0 :(得分:1)

没有简单的方法可以Application.Undo撤消宏执行操作的结果。您需要创建数据的缓存/副本并恢复到该数据,或者您需要在自定义函数中制定“撤消”的方法。

在任何情况下,第二种方法中的错误,这一行:

Sheet1.Range("A84:J84").Interior.Color(color_index) = RGB(153, 153, 255)

可以改为:

Sheet1.Range("A84:J84").Interior.ColorIndex = color_index

或者:

Sheet1.Range("A84:J84").Interior.Color = RGB(153, 153, 153)

或者,您可以执行自定义撤消功能,如下所示:

'## Module level variable
Dim previousColor As Long

Sub btn3_Click()
    '## stores the current ColorIndex property of the range
    '   (assumes all cells have the same color)
    previousColor = Sheet1.Range("A84:J84").Interior.ColorIndex

    '## Applies the new color:
    Sheet1.Range("A84:J84").Interior.ColorIndex = 16

End Sub

Sub btn3_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    Sheet1.Range("A84:J84").Interior.ColorIndex = previousColor
End Sub

此外,您询问:

  

因为我有更新的方法来大规模地实现这一点,因为我有60多个“按钮”......

是。首先确保所有按钮调用相同的过程。然后,修改每个按钮的过程,如下所示。 注意我不能在没有调用单击事件的情况下进行双击工作,首先,这会产生不希望的效果,即无法“存储”范围的上一个颜色。您可以添加一些条件逻辑,暂时我已经硬编码,因此“撤消”功能将恢复为根本没有颜色

Dim previousColor As Long '

Private Sub CommandButton1_Click()
    Debug.Print "click"
    Call changeColor(CommandButton1)
End Sub

Private Sub CommandButton1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    Debug.Print "dbl click"
    Call undoChangeColor(CommandButton1)
End Sub

Private Sub CommandButton2_Click()
    Debug.Print "click"
    Call changeColor(CommandButton2)
End Sub

Private Sub CommandButton2_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    Debug.Print "dbl click"
    Call undoChangeColor(CommandButton2)
End Sub

Private Sub changeColor(btn As MSForms.CommandButton)
    'Assumes all cells are same color initially
    previousColor = -4142 '(none) 'Sheet1.Range("A84:J84").Interior.ColorIndex

    'Get the row corresponding with each button:
    Dim rng As Range
    Set rng = Sheet1.Range("A" & btn.TopLeftCell.Row).Resize(1, 11)

    rng.Interior.ColorIndex = 16   'Modify as needed
                                                            'you could assign the RGB() here

End Sub


Private Sub undoChangeColor(btn As MSForms.CommandButton)

    'Get the row corresponding with each button:
    Dim rng As Range
    Set rng = Sheet1.Range("A" & btn.TopLeftCell.Row).Resize(1, 11)

    rng.Interior.ColorIndex = previousColor
End Sub