Excel (VBA)

Excel VBAに関するフォーラムです。
  • 掲示板への投稿には会員登録(無料)が必要です。会員登録がまだの方はこちら
  • 掲示板ご利用上のお願い」に反するご記入はご遠慮ください。
  • Q&A掲示板の使い方はこちらをご覧ください
トピックに返信
質問

 
(Windows 10全般 : Excel 2013)
クリック操作によるオートシェイプの表示非表示の切り替えについて
投稿日時: 22/10/31 13:46:39
投稿者: twinkle369

初めまして、こんにちは。
超初心者なのですが、エクセルのシート状にあるオートシェイプをクリックする事で
表示、非表示を切り替えたいのですが上手く書けず困っています。
 
クリック操作で表の文字を囲みたかったのですが技術が無いのだから
SelectionChangeを使って最初からある図形を表示、非表示にしなさいと指示され
下記の様に書いてみたのですが、非表示の文字をクリックして囲む際は
問題無いのですが、表示になった図形を消したい際は別の空いているセルを
クリックしなければならないのと、オートシェイプは5か所あるのですが繋げ方も解りません。
どうか助けてください。よろしくお願いします。
 
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'シート上で選択されているセルの範囲が変わった時に実行する’
 
Dim Maru As Shape '図形をMaruとする’
 
Set Maru = ActiveSheet.Shapes("楕円 1") 'Maruに楕円1を代入する’
 
ActiveSheet.Shapes("楕円 1").Visible = Not ActiveSheet.Shapes("楕円 1").Visible
'図形が表示されていたら非表示にし、非表示なら表示にする’
 
End Sub

回答
投稿日時: 22/10/31 14:02:43
投稿者: simple

「検索と選択」の「オブジェクトの選択と表示」で
インタラクティブに表示・非表示が切り替えられますが、
それではまずいのですか?
Excelがそのために特別の機能を提供しているので、それを利用するのがよいと思いますよ。

回答
投稿日時: 22/10/31 14:02:50
投稿者: WinArrow
投稿者のウェブサイトに移動

Worksheet_SelectionChange
は、セルにカーソルが移動したときのイベントを処理するプロシジャです。
 
カーソルが移動したセルは、Target引数で主億できます。
 
なお、セルをクリックし方法うようなイベントは用意されていないで、
対応方法としては、次のいづれかの方法になると思います。
 
1.セルをダブルクリック
2。セルを右クリック
3.別の図形を用意し、クリック
 
お勧めは、3です。

投稿日時: 22/10/31 14:13:19
投稿者: twinkle369

simple様
 
ご回答ありがとうございます。
本当はシート状にある文字をクリックすると丸で囲む様に
したかったのですが、できる頭脳が無いのだから最初から図形を置き
表示と非表示の切り替えで表現しろとの指示でセルをクリックする事で
表示、非表示を切り替えたいです。

投稿日時: 22/10/31 14:18:51
投稿者: twinkle369

WinArrow様
 
お返事ありがとうございます。
当初ダブルクリック操作で〇を挿入する様にしていたのですが
クリックに変更しろとの指示でSelectionChangeにしたのですが
やはりワンクリックで非表示にするのは難しいのですね。
表示されている図形をダブルクリックで非表示にしたい場合、
どのように書いたら良いのでしょうか?
 

WinArrow さんの引用:
Worksheet_SelectionChange
は、セルにカーソルが移動したときのイベントを処理するプロシジャです。
 
カーソルが移動したセルは、Target引数で主億できます。
 
なお、セルをクリックし方法うようなイベントは用意されていないで、
対応方法としては、次のいづれかの方法になると思います。
 
1.セルをダブルクリック
2。セルを右クリック
3.別の図形を用意し、クリック
 
お勧めは、3です。

回答
投稿日時: 22/10/31 15:21:00
投稿者: Suzu

表示されている Shapeをダブルクリックで非表示にするのはできるでしょうけど、
逆に、
表示されていない Shape を正確にダブルクリックできますでしょうか?
 
私なら
・特定Circleの表示制御用のセルを用意。
 Worksheet_Change イベント で、Targetから、セルの位置を特定し
 Shape("Circle名").Visibke を制御
 
・チェックボックスを用意
 Shape("Circle名").Visibke を制御するマクロを標準モジュールに用意
 チェックボックスのマクロ登録で、先の標準モジュールのプロシージャを指定
 
のどちらかで制御します。
 
 

引用:
本当はシート状にある文字をクリックすると丸で囲む様にしたかった

シート上のセルに入っている文字をクリック? 文字はクリックできませんよ。
セルをクリックなのですか?
その場合、普通にセル選択をマウスで行う事ができませんが良いのでしょうか?
 
それとも、文字を範囲選択した状態でクリックでしょうか?
やるなら、文字範囲を右クリックで出るメニューに その操作をするモジュールを指定でしょうか。
 
何にしても、ユーザーの使い勝手も考えて動作イベントを決めた方が良いですよ。

回答
投稿日時: 22/10/31 15:38:17
投稿者: hatena
投稿者のウェブサイトに移動

引用:
超初心者なのですが、エクセルのシート状にあるオートシェイプをクリックする事で
表示、非表示を切り替えたい
のですが上手く書けず困っています。
 
クリック操作で表の文字を囲みたかったのですが

文字を囲みたいということなら、図形の表示/非表示ではなく、枠線の表示/非表示にすればどうでしょう。それなら、オートシェイプにマクロを割り当てれば、クリックで変更可能です。
 
ただし、オートシェイプの塗りつぶしが「なし」だとクリックできないので、塗りつぶしは「単色」にして透明度を100%に設定しておきます。
 
標準モジュールに下記のマクロを作成します。
Sub LineToggle()
    With ActiveSheet.Shapes(Application.Caller)
        .Line.Visible = Not .Line.Visible
    End With
End Sub

 
オートシェイプを右クリックして「マクロの登録」で上記のマクロを選択します。
他のオートシェイプも同様にします。
 
これだとクリックしてもセルが選択されないので、もし、オートシェイプの下のセルを選択したいのなら、マクロを下記に変更してください。
Sub LineToggle()
    With ActiveSheet.Shapes(Application.Caller)
        .Line.Visible = Not .Line.Visible
        .TopLeftCell.Select
    End With
End Sub

回答
投稿日時: 22/10/31 15:38:55
投稿者: WinArrow
投稿者のウェブサイトに移動

twinkle369 さんの引用:

表示されている図形をダブルクリックで非表示にしたい場合、
どのように書いたら良いのでしょうか?

表示されている図形をダブルクウリック(クリックでも同じ)して
非表示にしたら、表示できなくなってしまいます。
ですから、別の図形を提案しているわけです。
 
参考コード
Sub 別の図形_Click()
    With ActiveSheet
        If .Shapes("楕円 1").Visible Then
            .Shapes("楕円 1").Visible = False
        Else
            .Shapes("楕円 1").Visible = False
        End If
    End With
End Sub
 
 

回答
投稿日時: 22/10/31 16:21:48
投稿者: WinArrow
投稿者のウェブサイトに移動

すみません。参考コードが間違っています。
下記訂正します。
 
Sub 別の図形_Click()
    With ActiveSheet
        If .Shapes("楕円 1").Visible Then
            .Shapes("楕円 1").Visible = False
        Else
            .Shapes("楕円 1").Visible = True
        End If
    End With
End Sub

回答
投稿日時: 22/10/31 16:35:22
投稿者: WinArrow
投稿者のウェブサイトに移動

補足です。
 
「別ン図形」を四角形で作成した場合
四角形の文字列を変更するコードを追加しあした。
 

Sub 別の図形_Click()
    With ActiveSheet
        If .Shapes("楕円 1").Visible Then
            .Shapes("楕円 1").Visible = False
            .Shapes(Application.Caller).TextFrame.Characters.Text = "○を表示する"
        Else
            .Shapes("楕円 1").Visible = True
            .Shapes(Application.Caller).TextFrame.Characters.Text = "○を非表示にする"
        End If
    End With
    
End Sub

回答
投稿日時: 22/10/31 23:41:06
投稿者: simple

(1)
hatenaさんの
> オートシェイプの塗りつぶしが「なし」だとクリックできないので
のところは、私の手元のExcel2019ではクリックができるようです。
 
こんな形の図形を書きました。以下がそのマクロ記録です。

Sub Macro1()
    ActiveSheet.Shapes.AddShape(msoShapeOval, 271.5, 31.5, 42, 36).Select
    Selection.ShapeRange.Fill.Visible = msoFalse
    With Selection.ShapeRange.Line
        .Visible = msoTrue
        .Weight = 2.25
    End With
End Sub
(2)
それで、既に回答がありますように
Sub ovalLineToggle()
    With ActiveSheet.Shapes(Application.Caller)
        .Line.Visible = Not .Line.Visible
    End With
End Sub
というマクロを、各図形に登録する案に賛成です。
(3)
なお、そのマクロ登録は、手作業でやってもいいですし、
以下のようにマクロを走らせてもいいでしょう。
Sub マクロの登録()
    Dim shp As Shape
    For Each shp In ActiveSheet.Shapes
        shp.OnAction = "ovalLineToggle"
    Next
End Sub
留意点は、shapeの中には入力規則だったり、メモなんかも対象になってしまうので、
それを除外するには、shp.Typeで判断することになりますね。
必要ならヘルプで調べてみてください。

回答
投稿日時: 22/11/01 07:24:20
投稿者: simple

最後のところは、以下でもよかったですね。
楕円だけを相手にマクロ登録をします。

Sub マクロの登録()
    Dim ov As Oval
    For Each ov In ActiveSheet.Ovals
        ov.OnAction = "ovalLineToggle"
    Next
End Sub

回答
投稿日時: 22/11/01 10:35:42
投稿者: WinArrow
投稿者のウェブサイトに移動

話が元に戻り、申し訳ありませんが、
  

引用:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'シート上で選択されているセルの範囲が変わった時に実行する’

 
この復習になります。
このプロシジャは、カーソルが別セルに移動した時に
実行されます。
カーソルは、マウスクリックだけではなく、矢印キーでも移動します。
従って、
カ―ソルが存在するセルをクリックしても、プロシジャは実行されない。
マウスクリックと矢印キーを判別できない。
ということで、セルをクリックは、目的に合致しない
ということを理解するしましょう。
既に納得しているかもしれませんが・・・
 
次に、図形の「○」、これをクリックする案についいて
 
図形そのものを非表示にした場合、その図形をクリックできないから、表示に切り替えることはできません。
図形の枠線の表示/非表示で、図形非表示を代用する案
はテクニックとしては成立するが、
その操作を開発者以外の操作者が問題なく操作できるのか?
という疑問が残る。
キチンと操作してもらうのには、操作を目視可能な説明が必要ではないか?
ということです。
テクニック論だけではなく、操作する人ファーストで検討すべき
 
 
 
 
 

回答
投稿日時: 22/11/01 13:52:23
投稿者: simple

念のために申し上げると、hatenaさんの案(を借用した私の案もそうです)では、
・非表示にしても、図形があるはずの文字のうえにカーソルを載せると、
  マウスカーソルが「指差し」の形態に変わるので、図形の存在が目視で確認できます。
・そして、非表示でもその図形のクリックは可能です。

回答
投稿日時: 22/11/02 08:41:56
投稿者: simple

念のためさらに補足。
(1)図形描画のマクロ記録のコードは、説明用のものであり、大きさ、位置等は架空のものです。
   それを使って下さいという意図はまったくありません。
   文字列を囲むような図形を既に作成ずみでしょう。
(2)図形の「非表示」と書いていますが、正確に言うと、
   ・フチの線が書かれた、塗りつぶしのない図形のフチを非表示にしているだけで、
   ・図形そのものが非表示になっているわけではありません。
   だから、マウスカーソルを近づけると「指差し」形になるのはある種当然です。
(3)必要であれば、シートに、「A1,B2,・・・セルの文字列には、その上に図形が書かれていて、
   それをクリックすることで、表示→非表示→表示と反転させることができます」と
   説明書きしておけばよいかと思います。

回答
投稿日時: 22/11/02 11:05:39
投稿者: hatena
投稿者のウェブサイトに移動

simplelさん
> hatenaさんの
> > オートシェイプの塗りつぶしが「なし」だとクリックできないので
> のところは、私の手元のExcel2019ではクリックができるようです。
 
今、試してみたら、問題なくクリックできますね。前、試したときはできなかったような気がしたけど
勘違いだったようです。
 
さて、今回の質問の要件は下記のようなことだと理解しています。
 
シート上の特定の文字とは、特定の文字が入力してあるセル。
そのセルの上に図形(楕円)が配置してある。
この特定の文字をクリックする(=図形をクリックする)と楕円が表示/非表示と切り替わる。
 
私の案(さらに私の案を拡張したsimpleさんの案)で上記の要件を満たしていると思います。
特定の文字の上にカーソルを持ってきたらポインターが指に変わりクリックできることをユーザーは認知できますので。
 
UIとしてどうなのかについては、質問者さんが目的や用途を明示していないの判断は難しいですが、
おそらく下記のような目的・用途だと思います。
 
ある項目が該当するかどうか、
あるいは、複数ある選択肢から該当するものを選択する、
上記の目的で該当するものを○で囲む。
また、それを印刷する。
 
役所などに提出する書類でそのような書式のものはよくありますね。
説明なしに初めてその画面を見たユーザーには分かりませんので、
「該当する項目をクリックすると○で囲まれます。」と説明を入れておいた方がいいでしょう。
 
 
ただ、WindowsやWEBなどの共通のUIとして項目を選択する場合は、チェックボックス、ラジオボタンというものがあります。デジタルデバイスになれたユーザーなら説明なしに直感的に用途を理解できるでしょう。
項目の横にこのようなコントロールを配置しておいて、チェックすることで○で囲むという設計もいいでしょう。印刷時はチェックボックスやラジオボタンは表示にします。
 
 
目的や用途、また、想定するユーザーによって適切なUI設計は変わってきますね。

回答
投稿日時: 22/11/02 14:01:39
投稿者: WinArrow
投稿者のウェブサイトに移動

余計な心配
 
文字を○で囲むことは、見た目、分かりやすいと思います。
しかし、これだけでは、データとして利用できません。
データとして認識するには、別の手段が必要になります。
(例えば、○図形を解析して、文字列を紐付けるマクロ)
 
しかし、他のオブジェクトを利用することで、簡単に実現可能です)
例えば、文字列セルの右隣にチェックボックスを配置します。
チェックの結果は、リンクセルで設定可能ですから、データとして利用可能になります。
チェックの結果を受け取り、文字列上の「〇」の表示/非表示を制御します。
このマクロは、いままでのレスを参考にすれば作成できるでしょう。
 
質問者さんは、明示されていないのですが、
「ある質問に対して「ある」「ない」のどちらかを回答する」といった場合、
「ある」「ない」各々に○を付けることになりますが、
チェックボックスを利用すると、○図形を一つ用意し、ON:「ある」、Off:「ない」に移動する。
というようなことが考えられます。
 
以上・・・・・余談でした。

回答
投稿日時: 22/11/02 14:51:06
投稿者: hatena
投稿者のウェブサイトに移動

WinArrowさんの心配ももっともなことだと思いまず。
 
データを活用する(集計、フィルタとか)ことを考えると、図形の表示/非表示では、非常に面倒なことになります。
チェックボックス(またはオプションボタン) でセルとリンクさせておくと、簡単に集計やフィルタリングができます。
図形のクリック時に表示/非表示を切り替えると同時にセルにOn/Offを入力しておいてもいいでしょう。

トピックに返信