[[20221107165910]] 『図形の表示/非表示の自動切換え』(たま) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『図形の表示/非表示の自動切換え』(たま)

初めまして、宜しくお願いします。
エクセルの初心者ですみません。

図形の表示/非表示を自動で制御したいです。

例えば

A1が「1」の場合、図形の「グループ化1」が表示状態となり
A1が「0」の場合、図形の「グループ化1」が非表示状態となる

様にしたいです。

調べたところVBAを使えば出来る様なのですが、
プログラミングは初心者の為、よく判ていません。
宜しくお願いします。

< 使用 Excel:Excel2016、使用 OS:Windows10 >


 こんばんは...出来るかどうかわかりませんが^^;

 因みに、お聞きしますが...その図形は手動で既に作成されたものですか?
 それとも、図形もVBAを使用して作成するのでしょうか?

(あみな) 2022/11/07(月) 20:23:20


[[20161010064648]]
参考にしてみてください。
(はてな) 2022/11/07(月) 20:24:48

>因みに、お聞きしますが...その図形は手動で既に作成されたものですか?
>それとも、図形もVBAを使用して作成するのでしょうか?
図形を「グループ化1」として作成済みで A1 の値によって表示/非表示にするということですよ。
(はてな) 2022/11/07(月) 20:34:01

 参考です
 シートモジュールで有効
 Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Range("A1").Value = 1 Then
       ActiveSheet.Shapes("グループ化 22").Visible = True
    Else
       ActiveSheet.Shapes("グループ化 22").Visible = False
    End If
 End Sub
(はてな) 2022/11/07(月) 21:28:19

既に、ご案内が有ったようですが。。。
Shape.Typeプロパティを ちょっと調べてみました。。。^^
    |[A]        |[B]         |[C]                
 [1]|名前       |形態        |msotype列挙体戻り値
 [2]|Picture 11 |png         |                 13
 [3]|Graphic 13 |svg         |                 28
 [4]|Oval 14    |エクセル図形|                  1
 [5]|3D Model 15|3D画像      |                 30
 [6]|Picture 17 |jpg         |                 13

Gruopになっていましたら、6 が返るようですよ。^^;
m(_ _)m
(隠居Z) 2022/11/07(月) 21:51:44


msotype

MsoShapeType
だと思います。似たような名前でMsoAutoShapeType
というのがある様ですが、こちらは
【AutoShapeオブジェクトの図形の種類を指定します。】
だ、そぉです。
(隠居Z) 2022/11/07(月) 22:06:10

 (はてな)さんの 2022/11/07(月) 21:28:19 の案ですと、
 A1セル以外にカーソルを動かしても、常にそれが動作してしまうので
 少し無駄かもしれません。

 こんな作りにすることが考えられます。
 ・A1セルの値を修正した時にだけ、表示・非表示を切り替える。
 ・A1セルには、表示,非表示 を「入力規則」を利用して選択できるようにしておく。
   (もちろん、1,0 でもかまわないですが、
     このほうが自分以外のユーザーがいる場合は使いやすいかも知れない。)

 上記の入力規則を設定したうえで、
 シートモジュールに以下のコードをコピーペイストしてください。

 Private Sub Worksheet_Change(ByVal Target As Range)
     Dim shp As Shape

     If Intersect(Target, Range("A1")) Is Nothing Then Exit Sub
     Set shp = Me.Shapes("ここは図形名にしてください")
     Select Case Target
         Case "表示": shp.Visible = True
         Case "非表示": shp.Visible = False
     End Select
 End Sub
  
(γ) 2022/11/07(月) 22:46:39

皆様、様々な誤情報及びご提案有難うございました。

(はてな)様と(γ)様よりありましたVBAを双方、試させて頂きましたが
(はてな)様VBAは動作しましたが、(γ)様VBAは動作しませんでした。

今回は、(はてな)様VBAを使用させて頂きたく、誠に有難うございました。
(たま) 2022/11/08(火) 09:50:26


 修正です。
 Private Sub Worksheet_SelectionChange(ByVal Target As Range)
   If Range("A1").Value = 1 Then ActiveSheet.Shapes("グループ化 22").Visible = True
   If Range("A1").Value = 0 Then ActiveSheet.Shapes("グループ化 22").Visible = False
 End Sub
(はてな) 2022/11/08(火) 10:00:21

 > (γ)様VBAは動作しませんでした。
 ああ、そうですか残念ですね。
 私は動作確認したうえで投稿しましたが。
 A1セルを変更しないと動作はしませんよ。念のためですけど。

 (はてな)様のマクロは、例えば、A1からA10までカーソルを移動すると、
 10回、表示設定する動作が行われるけれど、気にはなりませんか?
 私は絶対にやりませんけど、まあ些事ですかね。
 富豪になったと思えば、けち臭いことを考えないというのもあるかもですね。
  
(γ) 2022/11/08(火) 10:10:58

 >気にはなりませんか?
 気にしなくても大丈夫です。
(はてな) 2022/11/08(火) 10:54:22

 > >気にはなりませんか?
 > 気にしなくても大丈夫です。

 私は気になりますね。
不必要にプロシージャが実行されるのもそうですが、必要な時に実行されない可能性があるのも気になります。

 例えば、A1セルを変更して、Ctrl+Enterでセル移動なしに確定しても反応しない。
 A1セルを変更して、ファイル保存しても反応しない。そのまま閉じて、次に開いたとき、A1セルの値と図形の表示/非表示が一致しない場合がありえる。

 まあ、セル移動させれば反映しますので気にならなければいいですが、私は気になります。

 ちなみに、γさんのコードは、A1セルの値が"表示"か"非表示"かで図形の表示を切り替えていますので、そこを 1 と 0 に変更すれば動作します。

(hatena) 2022/11/08(火) 11:21:47


 hatenaさん、フォローありがとうございました。

 リクエストどおりの1,0を使ったものは以下です。
 Private Sub Worksheet_Change(ByVal Target As Range)
     Dim shp As Shape
     If Intersect(Target, Range("A1")) Is Nothing Then Exit Sub
     Set shp = Me.Shapes("ここは図形名にしてください")
     Select Case Target
         Case 1
             shp.Visible = True
         Case 0
             shp.Visible = False
     End Select
 End Sub
  
(γ) 2022/11/08(火) 13:42:09

回答者y必死すぎw
採用されないからって嫌味言い放っててw
(ww) 2022/11/08(火) 14:22:47


 そう言う詰まんない方向に話を持って行くなよ。

 この機能を実現するのに、どっちのイベントが適切かってことだ。

 因みに、私は、SelectionChangeは実務では使えたものじゃないと思う派。
 鬱陶し過ぎるので。

(半平太) 2022/11/08(火) 16:24:58


 SelectionChangeイベントプロシージャが有効な例は、
[[20200606192625]]
 の中で書いた、使い方くらいですかね。

 「カーソルのある行(や列)を特定の色で塗りつぶしたい」という目的で、
 「条件付き書式」と「SelectionChangeイベントプロシージャ」を巧妙に組み合わせる
 "アンドリューの方法"と呼ばれる手法に関連したものです。↓参考。
https://www.relief.jp/docs/001406.html

 この方法では、SelectionChangeイベントプロシージャのなかで、 
 Application.Screenupdating=True を実行することで、
 画面更新を強制的に実行し、カーソルの状態にあった条件付き書式を更新させています。

 これは他のイベントプロシージャにはまねのできない効果を持ちます。
 これくらいですかね。

 ●たいていは、クリックしたときに動作させたい、といった誤解から
 SelectionChangeイベントプロシージャを使う人が多いです。
 SelectionChangeは、「選択状態が変わる」ことがトリガーとなることの理解が
 足りない質問者さんが結構多かったです。
 同じセルの上で何度もクリックしても効果はありません。

 シートのどこにカーソルを動かしても一定の動作が必要になるなどというのは
 結構稀なことです。半平太さんのポリシーもご尤もな話です。

 ●イベントプロシージャは、副作用に対する細心の注意が必要です。
 効果はできるだけ限定的なものにする必要があるのです。(Changeイベントプロシージャで特に顕著)
 ミダス王の有名な話があるでしょう?
 触るものがすべて黄金になると言って喜んでいたら、パンも何もかも黄金に代わってしまうという話。
 それと同じ類の話は結構起きがちです。
 イベントプロシージャは結構注意が必要な技術ということになります。
  
(γ) 2022/11/08(火) 18:29:02

 >イベントプロシージャは結構注意が必要な技術ということになります。
 1回目に書いたコードがそれですか。
 指摘されて書き直したのが2回目のコードですか。
 どこに注意を払ったのですか。
(NONPRO) 2022/11/08(火) 21:18:43

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.