隐藏在VBA中的自动button的最佳方法

我很好奇,根据单元格的值,在Excel中隐藏/禁用button/形状的最佳方法是什么。

例如:如果“A1”单元格值为1,我希望看到Sheet2上的第一个活动button/形状。 如果“A1”的值是2,我想在Sheet2上看到前两个活动的button/形状,依此类推。

处理它的最好方法是什么? 我宁愿不这样硬编码:

Select Case A1Value Case Is = 1 With Sheet1.Shapes("Rounded Rectangle 1") .Visible = msoTrue With Sheet1.Shapes("Rounded Rectangle 2") .Visible = msoFalse With Sheet1.Shapes("Rounded Rectangle 3") .Visible = msoFalse With Sheet1.Shapes("Rounded Rectangle 4") .Visible = msoFalse Case Is = 2 With Sheet1.Shapes("Rounded Rectangle 1") .Visible = msoTrue With Sheet1.Shapes("Rounded Rectangle 2") .Visible = msoTrue With Sheet1.Shapes("Rounded Rectangle 3") .Visible = msoFalse With Sheet1.Shapes("Rounded Rectangle 4") .Visible = msoFalse Case Is = 3 With Sheet1.Shapes("Rounded Rectangle 1") .Visible = msoTrue With Sheet1.Shapes("Rounded Rectangle 2") .Visible = msoTrue With Sheet1.Shapes("Rounded Rectangle 3") .Visible = msoTrue With Sheet1.Shapes("Rounded Rectangle 4") .Visible = msoFalse Case Is = 4 With Sheet1.Shapes("Rounded Rectangle 1") .Visible = msoTrue With Sheet1.Shapes("Rounded Rectangle 2") .Visible = msoTrue With Sheet1.Shapes("Rounded Rectangle 3") .Visible = msoTrue With Sheet1.Shapes("Rounded Rectangle 4") .Visible = msoTrue End Select 

 For each shp in Sheet1.Shapes If shp.Name Like "Rounded Rectangle *" Then shp.Visible = (shp.Name = "Rounded Rectangle " & A1Value) End If Next 

说明:循环显示Worksheet中的所有形状; 仅查看名称类似“Rounded Rectangle”的形状,并根据括号中的expression式(可生成TRUE或FALSE)设置可见性。

另外请注意,您可以使用“名称”框(单元格上方的公式框的左侧)为每个形状指定一个自定义名称。

通过表单中每个形状的以下步骤忽略不以Rounded Rectangle开头的任何内容,并将最右边的数字设置为不超过所提供值的Rounded Rectangle为可见。 请注意,对于超过1位的圆angular矩形的值,这不起作用。

 For each myShape in Sheet1.Shapes if myShape.Name Like "Rounded Rectangle *" then if Cint(Right(myShape.Name,1)) !> a1Value then myShape.visible= msoTrue end if end if next 

虽然我同意你的看法,应该避免“硬编码”这样的东西,但你却忘了给我们一个select。 有什么可以替代硬编码的名字? 在纸上的特定位置的形状? 他们有一个特定的大小?

如果没有,那么你被他们的名字卡住,@TorbenKlein已经给你一个很好的例子,你可以用less一点的代码来解决这个问题。 然而,我想要考虑这几条额外的路线:

 Public Sub ShowEm() Dim shp As Shape For Each shp In Worksheets("Sheet1").Shapes If shp.AutoShapeType = msoShapeRoundedRectangle Then ' ... and yet again we are stuck with the name of the shape ... Select Case Val(Trim(Replace(Replace(shp.Name, "Rounded", ""), "Rectangle", ""))) = Worksheets("Sheet1").Range("A1").Value2 Case True MsgBox "gotacha!" Case False Debug.Print "you are not the one" End Select ' ... alternatively you can select them by placement (where they are on the sheet Debug.Print shp.TopLeftCell.Address End If Next shp End Sub