人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

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

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

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

●質問者: yoshifuku
●カテゴリ:コンピュータ
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● cx20
●100ポイント

ざっくりとですが、以下のような感じでしょうか。
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


yoshifukuさんのコメント
完璧に解決できました。 感謝致します。

2 ● きむむ
●100ポイント

セル内容を変更する度にマクロ起動するのではマクロ起動方法にもよりますが、運用性が如何かと思いました。
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のシート名の部分をダブルクリックするとモジュール画面が開きます。
以上、お試しください。


yoshifukuさんのコメント
明日試してみます。ありがとうございます!
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ