2016-05-30 8 views
1

セルの値に応じて、Excelでボタン/シェイプを非表示/非表示にするにはどうすればよいのでしょうか。VBAに隠れている自動ボタンに最適な方法

例: "A1"のセルの値が1の場合、Sheet2の最初のアクティブなボタン/シェイプが表示されます。 "A1"の値が2の場合、最初の2つのアクティブなボタン/シェイプをSheet2に表示したいと思います。

これを処理する最善の方法は何ですか?私はむしろそのようにそれをハードコーディングしません:

  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 
+1

配列にそれらの名前を格納し、その後で:しかし、私は検討のため、これらのいくつかの余分なラインで投げたいのですがあなたのCaseステートメントは、シェイプ名の番号と照合します。 –

答えて

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

説明:ワークシート内のすべての図形をループ。 「丸みのある矩形」のような名前の図形のみを表示し、カッコ内の式に基づいて可視性を設定します(TRUEまたはFALSEを返します)。

名前ボックス(セルの上にある数式ボックスの左側)を使用して、各図形にカスタム名を付けることもできます。

+0

それはほぼ完璧なおかげだ。もし私がセルの値が4なら、1,2,3,4の形を見たいと思っています。そして、5から私はそれらを隠したいと思っています。これどうやってするの? – Twi

+0

編集:私はそれを解決する方法を考え出しました。ありがとうございました! – Twi

1

シート上の各シェイプの次のステップは、丸められた矩形で始まらないものをすべて無視し、右端の数値が指定した値よりも大きくない丸い矩形を表示するように設定します。これは、1桁以上の丸められた長方形の値に対しては機能しません。

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 
1

私はそれが「ハードコード」あなたは私たちに選択肢を与えることを忘れているようなものに避けるべきであることをあなたに同意しないが。名前をハードコードする代わりに何ができますか?シェイプはシート上の特定の場所にありますか?彼らは特定のサイズを持っていますか?

もしそうでなければ、あなたはそれらの名前に悩まされています。@ TorbenKleinは、少し少ないコードでそれをどうやって動かせるかの良い例を与えてくれました。 、あなたは「それぞれの」とSheet1の形状をループおそらく思い

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 
関連する問題