ExcelのVBAで、オートシェイプ(直線)を、条件により表示・非表示を切り替える方法をお伺い致します。


今、リンク先の通り、8箇所にオートシェイプ(直線)があります。左上から順に、
J25が空白ならばオートシェイプ(直線)を表示、空白でないならば非表示
J32が(以下同じ)
J40が(以下同じ)
J48が(以下同じ)
AB30が(以下同じ)
AB44が(以下同じ)
CA46が(以下同じ)
というようなことを実現したいです。

初心者質問で申し訳ないことかぎりですが、お力いただければ幸いです。
どうぞよろしくお願い致します。

https://drive.google.com/drive/folders/0BzkvwuFCJtLEcU9VcXBBbzF4N3M?usp=sharing

回答の条件
  • 1人1回まで
  • 登録:
  • 終了:2017/04/10 20:00:03
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答2件)

id:cx20 No.1

回答回数607ベストアンサー獲得回数108

ポイント100pt

ざっくりとですが、以下のような感じでしょうか。
J25が空白なら斜線を表示し、値が入っていたら斜線を非表示にするサンプルです。

Private Sub Worksheet_Change(ByVal Target As Range)
    If Range("J25").Value = "" Then
        ActiveSheet.Shapes.Range(Array("斜線1")).Line.Visible = msoTrue
    Else
        ActiveSheet.Shapes.Range(Array("斜線1")).Line.Visible = msoFalse
    End If
End Sub

オートシェイプのオブジェクト名については、シートの上部にある「名前ボックス」で確認できるかと思います。
f:id:cx20:20170404005811p:image

id:miku1973

完璧に解決できました。
感謝致します。

2017/04/04 19:59:32
id:kimuram No.2

回答回数27ベストアンサー獲得回数11

ポイント100pt

 セル内容を変更する度にマクロ起動するのではマクロ起動方法にもよりますが、運用性が如何かと思いました。
 VBAを標準モジュールに記述ではなくシートモジュールに記述することで、セル内容が変更されるとほぼ同時に斜線のオン/オフが出来るように考えてみました。

提示されたサンプルの場合なら、以下の二つのプロシジャをそのまままとめて、当該ワークシートのシートモジュールに転記すれば、そのまま動作すると思います。



Private Sub Worksheet_Change(ByVal Target As Range)
'対象セルが変更されたときに斜線のオン/オフを行う
If Target.Cells(1).Address = "$J$25" Then
Call myLineCtrl(Target, "斜線1")
ElseIf Target.Cells(1).Address = "$J$32" Then
Call myLineCtrl(Target, "斜線2")
ElseIf Target.Cells(1).Address = "$J$40" Then
Call myLineCtrl(Target, "斜線3")
ElseIf Target.Cells(1).Address = "$J$48" Then
Call myLineCtrl(Target, "斜線4")
ElseIf Target.Cells(1).Address = "$J$56" Then
Call myLineCtrl(Target, "直線コネクタ 4")
ElseIf Target.Cells(1).Address = "$AB$30" Then
Call myLineCtrl(Target, "斜線5")
ElseIf Target.Cells(1).Address = "$AB$44" Then
Call myLineCtrl(Target, "斜線6")
ElseIf Target.Cells(1).Address = "$CA$46" Then
Call myLineCtrl(Target, "斜線7")
'ElseIf Target.Cells(1).Address = "$??$??" Then
' Call myLineCtrl(Target, "斜線???")
'
'
'
End If
End Sub


Sub myLineCtrl(prmTarget As Range, prmShapeName)
'斜線の表示オン/オフを行うサブプロシジャ
If prmTarget.Cells(1).Value = "" Then
'当該セルが値が入っていないなら斜線を表示する
ActiveSheet.Shapes(prmShapeName).Visible = True
Else
'当該セルに値が入っていたら斜線を表示しない
ActiveSheet.Shapes(prmShapeName).Visible = False
End If
End Sub


補足
 はじめのプロシジャのIf~Call~のセットで、判定対象とするセルの絶対アドレスと、そのときに制御されるシェイプ名をセットで指定します。
対象とするセルが結合セルの場合はその1番目(左上隅)のセルのアドレスを指定します。
シートモジュール :
 VBAエディタ画面のVBProjectのシート名の部分をダブルクリックするとモジュール画面が開きます。
以上、お試しください。

id:miku1973

明日試してみます。ありがとうございます!

2017/04/04 19:59:48

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません