プロが教える店舗&オフィスのセキュリティ対策術

VBA初心者です。よろしくお願いします。


[やりたいこと]
 1.結合セル"A1:D1"に何か文字が入力されたら、TextBox1とTextBox2を表示させたい。
 2.同結合セルの文字が削除されたら、TextBox1とTextBox2を非表示にしたい。

[現在のコード]
 Private Sub Worksheet_Change(ByVal Target As Range)
  Select Case Target.Address
  Case "$A$1:$D$1"
   If Target.Cells(1).Value <> "" Then
    TextBox1.Visible = True
    TextBox2.Visible = True
   Else
    TextBox1.Visible = False
    TextBox2.Visible = False
   End If
  End Select
 End Sub


上記コードを書いているのですがA1:D1に文字を入力しても削除してもテキストボックスに変化がありません。
似たような内容でオプションボタンをクリックしたら表示、非表示を切り替えるコードも同じモジュール内に書いているのですが、そちらは正常に動きます。
何が問題なのでしょうか。ご教授頂けると幸いです。

A 回答 (3件)

こんにちは



結合セルの場合、値は一つだけですし、そのアドレスはセル範囲の左上になります。
ですので「$A$1:$D$1」となることはありません。

ついでながら、判断したいケースは一通り(対象セルか否か)だけなので、SELECT CASE
で分岐しなくとも、普通にIF文で分岐すれば十分ではないでしょうか?
If Target.Address = "$A$1" Then
  ' ~~ 必要な処理 ~~
End If
とか。
    • good
    • 1
この回答へのお礼

なるほど、初歩的なことですね・・・。勉強になります。
"$A$1"と改めたら動くようになりました。

さらに申し訳ないことに、言葉が足りておりませんでした。
同様の処理を行いたい入力セルが他にも複数あり、どこに入力されたかでテキストボックスの表示、非表示を切り替えたいためにSELECT CASEを利用しておりました・・・(つまり、このコードはまだ書きかけということになります。)申し訳ありません。

ところで、別な質問となってしまい申し訳ないのですが、動くようになったものの、対象セルをBSキーで削除するとVisibleがFalseになりますが、Deleatキーで削除した時は反応しないようです。これは何故なのでしょうか?

お礼日時:2020/01/16 14:11

No1です



>Deleatキーで削除した時は反応しないようです。これは何故なのでしょうか?
結合セルを扱うことがほとんどないので、見落としていたようです。
失礼いたしました。

調べてみると、Deleteの時だけはTarget.Addressが$A$1:$D$1となっているようです。
(なぜそのような挙動なのか理由まではわかりません)
両方に対応するためには「A1セルを含んでいるか」どうかで判断するか、「最初のセルがA1セルかどうか」で判断すればよさそうです。

前者であれば
If Not Intersect(Target, Range("A1")) Is Nothing Then
  ' ~~ 必要な処理 ~~
End If

後者であれば
If Target.Cells(1).Address = "$A$1" Then
  ' ~~ 必要な処理 ~~
End If
のような感じでしょうか。
    • good
    • 1
この回答へのお礼

度々ありがとうございます。感謝いたします。

ご教授いただいたNot Intersect Is NotingとTarget Addressを見て「なるほど!」となったのですが、現状うまく動いてくれません。
(Visibleが常時Trueになっている)
私の記述が誤っているだけだと思われるのですが・・・元のIf構文を頂いたIfで囲んだだけでは駄目でしょうか。
しつこくすみません。


 Private Sub Worksheet_Change(ByVal Target As Range)
  Select Case Target.Address
  Case "A1"
   If Not Intersect(Target, Range("A1")) Is Nothing Then
    If Target.Cells(1).Value <> "" Then
     TextBox1.Visible = True
     TextBox2.Visible = True
    Else
     TextBox1.Visible = False
     TextBox2.Visible = False
    End If
   End If
  End Select
 End Sub

お礼日時:2020/01/16 15:38

こんな感じの物はいかがでしょうか?



Private Sub Worksheet_Change(ByVal Target As Range)

 Select Case Target.Address
  Case "$A$1"
   If Target.Value = "" Then
    TextBox1.Visible = False
    TextBox2.Visible = False
   Else
    TextBox1.Visible = True
    TextBox2.Visible = True
   End If
  Case "$A$1:$D$1"
   TextBox1.Visible = False
   TextBox2.Visible = False
 End Select

End Sub
    • good
    • 1
この回答へのお礼

ありがとうございます!想定通りの動きになりました。
記述もとても勉強になりました。感謝いたします。

お礼日時:2020/01/16 15:50

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!