VBA更改表单控件背景颜色

时间:2013-12-17 16:16:40

标签: excel vba excel-vba

我正在尝试通过VBA代码更改表单控件复选框的背景颜色。我已经尝试了我可以在互联网上找到的每种代码变体,但仍然会出现故障。

我目前的线路在下面,是迄今为止我发现的唯一一个不会给我编译错误的线路。当我运行它虽然我得到一个“运行时错误'438':对象不支持此属性或方法”执行此行时出错。这是真的,无论我将它设置为xlBlack,RGB(255,255,255)还是“11398133”(我知道不是黑色,但我只是想看看是否有任何颜色可用)。

任何人都知道发生了什么以及我如何实际做到这一点?

    Sheets("Controls").Shapes.Range(Array("Check Box 8")).BackColor = "11398133"  

答案
我找到了答案。由于某些原因,没有一个响应有效,但Johnny的回答确实帮助我通过在内存中加载正确的对象来接近它,然后我可以使用Locals窗口来追踪我想要的属性。

最后,它确定了Johnny建议的对象,然后只是cb.Interior.Color = xlBlack我正在寻找。没有.Fill和没有.DrawingObject。不知道是什么让这种情况与那些能够以这种方式工作的人不同,但是你去了。

所以,对于任何其他人来看,最终为我工作的代码是下面的简单添加,你可以找到对象的Excel名称(在我的情况下,复选框8)在录制宏时选择它。

    For Each cb In Sheets("Controls").CheckBoxes
        If cb.Name = "Check Box 8" Then
            cb.Interior.Color = xlNone
            Exit Sub
        End If
    Next

2 个答案:

答案 0 :(得分:3)

这应该为你做。请按照以下步骤操作:

  1. 在工作表上创建一些表单复选框
  2. 将以下代码复制到模块(alt F11,插入,模块)
  3. 运行SetMacro
  4. 保存并测试
  5. 代码:

    Sub SetMacro()
        Dim cb, ws
        For Each ws In ThisWorkbook.Sheets
            For Each cb In ws.CheckBoxes
                If cb.OnAction = "" Then cb.OnAction = "CheckedUnchecked"
            Next cb
        Next ws
    End Sub
    
    Sub CheckedUnchecked()
        With ActiveSheet.Shapes(Application.Caller).DrawingObject
            If .Value = 1 Then
                .Interior.ColorIndex = 4
            Else
                .Interior.ColorIndex = 2
            End If
        End With
    

    如果您只想在活动工作表上执行此操作,请改用此块:

    Sub SetMacro()
        Dim cb
        For Each cb In ActiveSheet.CheckBoxes
            If cb.OnAction = "" Then cb.OnAction = "CheckedUnchecked"
        Next cb
    End Sub
    
    Sub CheckedUnchecked()
        With ActiveSheet.Shapes(Application.Caller).DrawingObject
            If .Value = 1 Then
                .Interior.ColorIndex = 4
            Else
                .Interior.ColorIndex = 2
            End If
        End With
    End Sub
    

答案 1 :(得分:0)

另一种可能性是你想要设置ForeColor而不是BackColor。

非常简单:

  

Sub changegColor()

   Dim wb As Workbook
   Dim ws As Worksheet
   Dim cb As Object
   Dim rng As Range

   Set wb = ActiveWorkbook
   Set ws = wb.ActiveSheet
   Set cb = ws.Shapes.Range(1)

   With cb.Fill
       .Solid
       .ForeColor.RGB = RGB(0, 255, 0)
   End With   
     

End Sub