更改范围颜色的按钮和 DblClick 以恢复更改

Buttons that change color of a Range and a DblClick to revert the changes

我正在寻找编辑当前代码的方法,因为它冗长冗长,但如果需要,我可以坚持使用。我当前的代码在每个按钮上简单地重复,因为它运行通过 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

最终结果两次尝试均未成功。

这些都不起作用,想要 'work around' 或修复我的错误,接受任何想法,但我必须保留我不能使用的按钮 'Cell Selection'。

编辑 如果可能的话,我有一个可用的数组方法,我不擅长使用 ActiveX 控件,所以任何建议都可能非常有用。

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

没有简单的方法可以 Application.Undo 撤消宏执行操作的结果。您要么需要创建数据的 cache/copy 并还原为该数据,要么需要制定一种在自定义函数中实现 "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

另外,您查询:

as I updated is there a way to do this on a mass scale as I have 60+ 'buttons'...

是的。首先确保所有按钮调用相同的过程。然后,修改每个按钮的程序,如下所示。 注意 如果不同时调用单击事件,我无法使双击工作,首先,它具有无法 "store" 前一个的不良影响范围的颜色。您也许可以添加一些条件逻辑,目前我已经硬编码,因此 "undo" 函数将恢复为 完全没有颜色 :

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