【问题标题】:Adding VBA for multiple checkboxes -returns a compile error为多个复选框添加 VBA - 返回编译错误
【发布时间】:2019-03-07 00:08:08
【问题描述】:

我在一张纸上有 70 个复选框。

我想要每个复选框 - 当单击以填充该复选框周围的矩形时。 如果未单击复选框 - 矩形将不会被填充。

我的问题是我尝试将此代码应用于每个复选框 - 但我收到编译错误:“compile error ambiguous name detected boxcheck”

如何防止编译错误? 注意:每个复选框都有自己的唯一名称 (1-70),每个矩形都有自己的唯一名称 (1-70)。这样每个 Checkbox 应该只填充 VBA IF/THEN 代码引用的 Rectangle。我不希望 1 Checkbox 填充所有矩形。

这是我的代码:

Sub BoxCheck()
    If ActiveSheet.Shapes("Check Box 1").ControlFormat.Value = 1 Then
        ActiveSheet.Shapes("Rectangle 1").Fill.ForeColor.SchemeColor = 3
    End If
    If ActiveSheet.Shapes("Check Box 1").ControlFormat.Value = -4146 Then
        ActiveSheet.Shapes("Rectangle 1").Fill.ForeColor.SchemeColor = 1
    End If
End Sub

【问题讨论】:

  • 您是否检查了完整的代码,看看您是否在某处有任何重复的复选框名称?
  • 不可能是全部。如果BoxCheck 不明确,那么它在(至少)两个地方被声明;删除除一个以外的所有内容。

标签: excel vba if-statement checkbox


【解决方案1】:

如果您在一个模块中有多个名称完全相同的子组件,则可能会引发错误。如果您复制原始代码或下面的代码并简单地将 # 替换为与其相关的矩形和框号,则可能会清除错误。

Sub BoxCheck#()
    If ActiveSheet.Shapes("Check Box #").ControlFormat.Value = 1 Then
        ActiveSheet.Shapes("Rectangle #").Fill.ForeColor.SchemeColor = 3
    End If
    If ActiveSheet.Shapes("Check Box #").ControlFormat.Value = -4146 Then
        ActiveSheet.Shapes("Rectangle #").Fill.ForeColor.SchemeColor = 1
    End If
End Sub

另一种选择是将每个 BoxCheck 放入不同的模块中,但这似乎太过分了,尤其是因为你有 70 个

【讨论】:

    【解决方案2】:

    您可以将所有复选框链接到单个子项,并使用Application.Caller 确定哪个复选框调用了该方法:

    Sub BoxCheck()
        Dim shp, rectName as string
        Set shp = ActiveSheet.Shapes(Application.Caller)
        rectName = Replace(Application.Caller, "Check Box ", "Rectangle ")
    
        ActiveSheet.Shapes(rectName).Fill.ForeColor.SchemeColor = _
                            IIf(shp.ControlFormat.Value = 1, 3, 1)
    
    End Sub
    

    【讨论】:

    • 这是一个很好的答案!它将所有执行工作的代码放在一个地方,这样如果颜色发生变化,或者您希望矩形轮廓而不是填充,则只有一个地方可以更改它。另外,TIL Application.Caller!
    • 谢谢!但是,当我使用您提供的代码时......我收到运行时错误:'-2147024809 (80070057):未找到具有指定名称的项目。然后在调试器中,它以黄色突出显示代码的第二部分。我应该如何解决?注意:我将复选框名称和矩形名称放在引号中。
    • “第二部分”是哪一行?该代码假定您的复选框/矩形对以相同的方式命名“复选框 1”/“矩形 1”、“复选框 2”/“矩形 2”等
    • 一切顺利!谢谢!完美的解决方案。感谢您的帮助
    猜你喜欢
    • 2012-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-07
    • 1970-01-01
    相关资源
    最近更新 更多