Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


548 / 13645 ツリー ←次へ | 前へ→

【79762】セル値によってオートシェイプの表示非表示 Kazu 18/4/5(木) 16:47 質問[未読]
【79763】Re:セル値によってオートシェイプの表示非... 亀マスター 18/4/5(木) 18:41 発言[未読]
【79767】Re:セル値によってオートシェイプの表示非... Kazu 18/4/6(金) 13:45 質問[未読]
【79769】Re:セル値によってオートシェイプの表示非... マナ 18/4/6(金) 19:41 発言[未読]
【79764】Re:セル値によってオートシェイプの表示非... マナ 18/4/5(木) 19:10 発言[未読]
【79765】Re:セル値によってオートシェイプの表示非... γ 18/4/5(木) 20:46 発言[未読]
【79772】Re:セル値によってオートシェイプの表示非... γ 18/4/8(日) 5:55 回答[未読]
【79774】Re:セル値によってオートシェイプの表示非... Kazu 18/4/9(月) 13:36 お礼[未読]

【79762】セル値によってオートシェイプの表示非表...
質問  Kazu  - 18/4/5(木) 16:47 -

引用なし
パスワード
   初めまして。
題名の件で、以下のVBAを作成してみました。
が、上手く動作しません。
どこが間違ってるのか、教えていただけますと幸いです。

セル番号 C14に【True・False】のどちらかを表示させて
Trueなら表示、Falseなら非表示としたいです。

オートシェイプの名前は、四角1.です。

Sub 入力()

Private Sub Worksheet_Change(ByVal Target As Range)

  If Target.Address = "$C$14" Then
    
    Select Case Range("C14").Value
      
      Case "True"
        ActiveSheet.Shapes("四角1.").Visible = True
      
      Case "False"
        ActiveSheet.Shapes("四角1.").Visible = False
    
    End Select
  
  End If
  
End Sub

よろしくお願いします。

【79763】Re:セル値によってオートシェイプの表示...
発言  亀マスター  - 18/4/5(木) 18:41 -

引用なし
パスワード
   うまくいかないないとは、具体的にどのような状態でしょうか。
エラーが発生するのか?動作は完了するが思っていたのと違う結果なのか?

エラーが発生するのであれば、発生した箇所とエラーメッセージを、
思っていたのと違う結果なら、期待する結果と実際の結果を示した方が
回答がしやすいですよ。

とりあえず、いくつか切り分けて解明していきましょう。

Target.Addressの値が狙ったものになっているか
Range("C14").Valueの値が狙ったものになっているか
"四角1"というオートシェイプはちゃんと存在しているか
動かそうとしているオートシェイプは本当に"四角1"という名前か
直接"四角1"のVisibleプロパティを操作するとどうなるか

このあたりを確認してみてはどうでしょうか。

【79764】Re:セル値によってオートシェイプの表示...
発言  マナ  - 18/4/5(木) 19:10 -

引用なし
パスワード
   ▼Kazu さん:

>オートシェイプの名前は、四角1.です。

"."が最後につくので間違いないですか

>C14に【True・False】のどちらかを表示させて

C14が、数式が入ったセル、ということはありませんか

【79765】Re:セル値によってオートシェイプの表示...
発言  γ  - 18/4/5(木) 20:46 -

引用なし
パスワード
   Sub 入力()
Private Sub Worksheet_Change(ByVal Target As Range)
というのはどうしてですか?

【79767】Re:セル値によってオートシェイプの表示...
質問  Kazu  - 18/4/6(金) 13:45 -

引用なし
パスワード
   亀マスター さん マナ さん Yさん

御助言ありがとうございます。 そして言葉足らずで申し訳ありません。

当方、普段は関数でのみエクセルを活用してましてVBAはまったくの素人です。

今回のもネットで調べて組み合わせて作成しております。


亀マスター さん

>Target.Addressの値が狙ったものになっているか

C14に、True・False を表示させるようにしてます。(但し関数にて)

>"四角1"というオートシェイプはちゃんと存在しているか

オートシェイプの名前を変更して"四角1"としてます。

>発生した箇所とエラーメッセージ

記載させていただいたVBAを走らせますと、End Subを記載しているが
End Subが必要です。 と表示されます。

なので、意味が良くわからずこちらに投稿させていただきました。


マナ さん

すみません。 "四角1"です。 点はありません。
訂正してもう一度試してみましたが、結果は同じでした。

>C14が、数式が入ったセル、ということはありませんか

関数にて判断させて、True か False を表示させるようにしてます。


Y さん

>Private Sub Worksheet_Change(ByVal Target As Range)
というのはどうしてですか?

ネットで調べまして、これを使えば思い通りのことができるかな?と
思って使用しており、他意はありません。

特定のセルに、True か Falseのどちらかを表示させて、表示・非表示を
制御したいと考えております。


皆様へ
当方があまりVBAと言うものを理解できておりませんので、言葉足らず
説明不足があると思いますが、よろしくお願いします。

【79769】Re:セル値によってオートシェイプの表示...
発言  マナ  - 18/4/6(金) 19:41 -

引用なし
パスワード
   ▼Kazu さん:

>関数にて判断させて、True か False を表示させるようにしてます。


関数の計算結果が変わっても、Changeイベントは発生しません。
どんな式が入力されているのですか。

【79772】Re:セル値によってオートシェイプの表示...
回答  γ  - 18/4/8(日) 5:55 -

引用なし
パスワード
   > > Sub 入力()
> > Private Sub Worksheet_Change(ByVal Target As Range)
> > というのはどうしてですか?
>
> ネットで調べまして、これを使えば思い通りのことができるかな?と
> 思って使用しており、他意はありません。

質問の意味が通じていませんね。

Private Sub Worksheet_Change(ByVal Target As Range)
というのは、イベントプロシージャーというものです。
これの意味は理解していますか?

セル(たち)の変更を実行したときに、自動で実行されるプロシージャです。
イベントプロシージャはシートモジュールに書く必要がありますが、
そうしていますか?

つまり、
Sub 入力()
というプロシージャの中で使うようなものではないのです。
たぶん、
Private Sub Worksheet_Change(ByVal Target As Range)
がプロシージャの宣言ということが理解されていないのでしょう。

警告の意味は、
Sub 入力()がプロシージャの開始なので、
その終了を示す End Subが不足している、
というものです。理解していますか?

そもそも
Sub 入力()
などというものは不要です。

といった、かなり基本的な事の理解が不足していますから、
これをきっかけにして、テキストで勉強することを薦めます。
簡単にコピペして動かせるようなものではありません。
ちゃんと理屈を抑えることも必要です。
そのほうが却って近道です。
これを良いチャンスに変えることを薦めます。

----------------
以上を理解されたことを前提にコメントするなら、
他の回答者さんが確認質問されているように、
C14の変化そのものをキャッチすることは(通常の手段では)できませんから、
C14で使っているセルが変更されたときに動作するプロシージャにします。

それで、
>どんな式が入力されているのですか。
と確認されているのです。それに基づいて助言されようとしています。

その時に、C14の値に基づいて、表示・非表示を判定して、
Shapeに変更を加えるわけです。

例えば、こんな風にです。
Private Sub Worksheet_Change(ByVal Target As Range)
  '変更されたセルが、C14で使っているセルでなければ抜ける
  If Intersect(Target, Range("C14").Precedents) Is Nothing Then Exit Sub

  Select Case Range("C14").Value
    Case True
      Me.Shapes("Rectangle 1").Visible = True
    Case False
      Me.Shapes("Rectangle 1").Visible = False
  End Select
End Sub

留意点は以下。
(1)このコードを対象のシートのシートモジュールに書き込みます。
  そうしたうえで、C14で使用しているセルの値を変更してみてください。
(2)もっとも、関係がないセルの値がかわっても常に処理を実行させていいなら
  話は別です。一行目の判定は不要になります。 
(3)なお、C14で使用しているセルが別シートであれば、それを変更しても
  イベントプロシージャは起動しません。
 
 

【79774】Re:セル値によってオートシェイプの表示...
お礼  Kazu  - 18/4/9(月) 13:36 -

引用なし
パスワード
   Y さん マナ さん

返答ありがとうございます。

Yさんのおっしゃる通り自分の知識不足を痛感しております。

何年か前に、少し勉強した程度で『できるだろう』と無茶をしました。

今回の御返答の意味を理解できるように、もう一度勉強して

出直ししたいと思います。


こんな素人に返答いただきありがとうございました。


PS・・・Yさん 詳しい回答をありがとうございます。

参考にしながら理解を深めたいと思います。

548 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free