我有一个“表单”,其中包含工作表上的一组问题(请注意,这不是用户表单,我不想使用它)。一些答案是是/否,其他答案有多个答案,例如数量(即答案可能是 1 或 2 或 3 或 4 等)。
此工作表上的“表单”设计要求这些答案是形状,用户可以像按钮一样单击这些形状来选择他们的答案 - 请注意,我不想使用命令按钮。
在这个简单的例子中,我有 2 个矩形形状,一个名称为“yes”,一个名称为“no” 当用户单击“是”时,形状的颜色填充变为蓝色(“否”形状保持白色)。如果用户点击“no”,“no”形状变成蓝色,“yes”变成白色。在此示例中,它还在 A1 中填充和回答。
我使用以下代码工作正常(尽管我肯定可以减少一些)但是当我需要多次复制此代码时出现问题。例如,如果我有一个有多个答案的问题,例如数量(答案可能是 1 或 2 或 3 或 4 或 5),那么每个宏(即按钮“1”)都需要一个“活动”的编码器,以及一个“非活动”部分为活动形状和所有其他非活动形状指定颜色。这是非常重复的,代码很快就会变得冗长。我希望有一种方法可以将格式(填充颜色、文本颜色等)保存在一个单独的宏中,例如“Sub Active”和“Sub Non_Active”,而不必一次又一次地重复。我尝试使用“Call”来获取包含格式的宏(如 Call Active),但一直出现错误。
Sub yes_button()
'active
ActiveSheet.Shapes("yes").Select
ActiveSheet.Shapes("yes").Fill.ForeColor.RGB = RGB(85, 142, 213) ' fill: dark blue color
ActiveSheet.Shapes("yes").Line.BackColor.RGB = RGB(198, 217, 241) ' border: light blue color
ActiveSheet.Shapes("yes").TextFrame.Characters.Font.Color = RGB(255, 255, 255) ' text: white color
Range("A1").Formula = "YES" ' fills cell with button value
' nonactive
ActiveSheet.Shapes("no").Select
ActiveSheet.Shapes("no").Fill.ForeColor.RGB = RGB(255, 255, 255) ' fill: light blue color
ActiveSheet.Shapes("no").Line.BackColor.RGB = RGB(198, 217, 241) ' border: light blue color
ActiveSheet.Shapes("no").TextFrame.Characters.Font.Color = RGB(85, 142, 213) ' text: dark blue color
End Sub
Sub no_button()
'active
ActiveSheet.Shapes("no").Select
ActiveSheet.Shapes("no").Fill.ForeColor.RGB = RGB(85, 142, 213) ' fill: dark blue color
ActiveSheet.Shapes("no").Line.BackColor.RGB = RGB(198, 217, 241) ' border: light blue color
ActiveSheet.Shapes("no").TextFrame.Characters.Font.Color = RGB(255, 255, 255) ' text: white color
Range("A1").Formula = "NO" ' fill scell with button value
' nonactive
ActiveSheet.Shapes("yes").Select
ActiveSheet.Shapes("yes").Fill.ForeColor.RGB = RGB(255, 255, 255) ' fill: light blue color
ActiveSheet.Shapes("yes").Line.BackColor.RGB = RGB(198, 217, 241) ' border: light blue color
ActiveSheet.Shapes("yes").TextFrame.Characters.Font.Color = RGB(85, 142, 213) ' text: dark blue color
End Sub
Run Code Online (Sandbox Code Playgroud)
将不胜感激任何建议。谢谢
是的,你是对的,你可以用你的形状作为输入编写一个 Sub,并最终用“是”和“否”事件填充它。例如ClickOnButton MyShape, YesNo,其中 YesNo 可以是触发事件之一的标志。然后你可以为每个按钮调用该 Sub。
我还建议使用一些Withs:With Activesheet.MyShape会很好。最后,请不要使用.Select. 有很多理由不这样做,而且最重要的是,选择不会在您的代码中执行任何操作...是的,放慢速度。
我将举一个例子来更好地解释:您可以编写一个子例程,给出一个形状和一个布尔值(例如)作为输入(这将是变量YesNo)。在子例程中,您可以有条件地将 2 种不同的行为 ( If... Else... End If) 写入YesNo变量(或者,我们想将其称为GreenRed/ActiveInactive吗?)。在这两种情况下,您都可以写任何您想要的内容。以下内容可用于“是”和“否”按钮。
Sub Example(YourShape As Shape, GreenRed as Boolean)
If GreenRed = True Then ' Say we want in this case an "active" button
With YourShape
.Fill.ForeColor.RGB = RGB(85, 142, 213)
.Line.BackColor.RGB = RGB(198, 217, 241)
.TextFrame.Characters.Font.Color = RGB(255, 255, 255)
End With
Else
With YourShape
.Fill.ForeColor.RGB = RGB(255, 255, 255)
.Line.BackColor.RGB = RGB(198, 217, 241)
.TextFrame.Characters.Font.Color = RGB(85, 142, 213)
End With
End If
End Sub
Run Code Online (Sandbox Code Playgroud)
然后,您可以在主程序中编写Example ActiveSheet.Shapes("yes"), True一个按钮来激活它自己并Example ActiveSheet.Shapes("no"), False停用另一个按钮。