エクセル2000です。
以下のワークシートチェンジイベントがうまくいきません。
Targetに値が入る場合は問題ないのですが、TargetをクリアしてもRange("F5").MergeAreaがクリアされません。
Targetをクリアした後、TargetをダブルクリックしてからEnterキーを押せばRange("F5").MergeAreaがクリアされるのですが、いちいちそうさせるわけにもいきません。
どうしたらよいのでしょうか?
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address <> "$C$5" Then Exit Sub
If Target.Value <> "" Then
Range("F5").Value = Range("D42").Value
Else
Range("F5").MergeArea.ClearContents
End If
End Sub
No.1
- 回答日時:
こんにちは。
もしかして、「Delete」キーを使えないように設定されていないですか?
Application.OnKey "{DEL}", "" '←「Delete」キーが使えない
↓
Application.OnKey "{DEL}" '←「Delete」キーを使えるようにする
さっそくありがとうございます。
「Delete」キーでTargetのC5セルをクリアできてますので、「Delete」キーを使えないように設定されていないと思います。
今、あたらしいBOOKにまったく同じコードを入れて試したら「Delete」キーだけでもちゃんと作動しました。
どうやらできなかった特定のBOOKに問題があるようです。
どんな原因が考えられますでしょうか?
No.2
- 回答日時:
エクセル2000で試してみましたが、再現しませんね。
クリア後のチェンジイベントは、カーソルがそのセルから移動した時に発生しますが、そういう意味ではないですよね?
(ただし、デリートキーでセルをクリアした時は、その瞬間にイベントが発生するみたい)
デバッグ方法としては・・・
Range("F5").MergeArea.Select
Msgbox("Check")
Selection.ClearContents
などとしてみれば、どちらが効かないのかわかるかも。
あるいは、PC固有の問題の可能性もあるので、別のPCが近くにあれば、そちらで試してみるとか・・・
それでもダメなら、対処療法ですが・・・
上の行でF5に代入できているので、F5が結合の左上になっているのだと推測して、Range("F5").Value = ""と直接クリアしてしまえばなんとかなりませんか?
(根本解決ではないので、気持ち悪いけど)
ありがとうございます。
No1のお礼にも書きましたが、特定のBOOKの問題のようです。
If Target.Value <> "" Then
Range("F5").Value = Range("D42").Value
MsgBox ("AAA")
Else
Range("F5").MergeArea.ClearContents
MsgBox ("BBB")
End If
とチェックしてみましたが、C5をDelキーでクリアしてもどちらのメッセージもでないのでイベントが発生していないのだと思います。(値が入力された場合はちゃんとAAAのメッセージが出ますが)
どんな原因が考えられますでしょうか?
No.3
- 回答日時:
No1です。
そうですね。失礼しました。
他のBOOKでは、問題なく動作するならば、正しく動作しないブックの問題かも知れませんね。
何かの設定がされているかも・・・
実際BOOKを見ないと分かりませんが・・・
最終的な方法としては、別のBookにするとか・・・
やっとわかりました!!
TargetのC5セルがD5セルとMergeしているのが原因のようです。
結合を解除したところちゃんと作動しました。
ただ、レイアウト上、やはりD5と結合させたいのですが、Targetが結合セルの場合、コードをどう直せばいいのでしょうか?
No.4
- 回答日時:
Sub test()
Application.OnKey "{DEL}", "CellClear"
End Sub
Sub CellClear()
If ActiveSheet.Range("C5") Then
ActiveSheet.Range("C5").MergeArea.ClearContents
End If
End Sub
No.5
- 回答日時:
統合セルには、Deleteキーの イベントが発生しないようで
コードはそのままにして、以下のマクロを追加してみてください。
Sub test()
Application.OnKey "{DEL}", "CellClear"
End Sub
Sub CellClear()
If ActiveSheet.Range("C5") Then
ActiveSheet.Range("C5").MergeArea.ClearContents
End If
End Sub
No.6
- 回答日時:
失礼しました。
以下のように変えてみてください。
Private Sub Worksheet_Change(ByVal Target As Range)
If Len(Target.Address) > 4 And Target.Address <> "$C$5:$D$5" Then Exit Sub
If Len(Target.Address) = 4 And Target.Address <> "$C$5" Then Exit Sub
If Cells(5, "C") <> "" Or Cells(5, "D") <> "" Then
Range("F5").Value = Range("D42").Value
Else
Range("F5").MergeArea.ClearContents
End If
End Sub
標準モジュール
Sub test()
Application.OnKey "{DEL}", "CellClear"
End Sub
Sub CellClear()
If ActiveCell.Address = "$C$5" Then
ActiveSheet.Range("C5").MergeArea.ClearContents
End If
End Sub
No.7ベストアンサー
- 回答日時:
こんにちは。
> If Target.Address <> "$C$5" Then Exit Sub
結合セル(例:$C$5:$D$5)の値を消した場合、Target.Address は
$C$5:$D$5 になりますので、Exit Sub しちゃいそうですが...
結合セルであっても Change イベントはちゃんと発生します。
If Target.Address <> "$C$5:$D$5" Then Exit Sub
としてみるとか。
また結合セルは複数のセルなのですから、Target.Value は、配列を
返します。したがって、単純に
If Target.Value <> "" Then
と比較することはできません。
Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Range("C5")) Is Nothing Then Exit Sub
Application.EnableEvents = False
If Application.CountA(Target.Value) > 0 Then
Range("F5").Value = Range("D42").Value
Else
Range("F5").MergeArea.ClearContents
End If
Application.EnableEvents = True
End Sub
ぱっと見なので、違ってたらスルー願います。
KenKen_SPさま、いつもありがとうございます。
MsgBox Target.Address として試したところ、結合セルの場合、値を入力すると $C$5、Deleteだと $C$5:$D$5 と変わることが判明しました!
そのため、If Target.Address <> "$C$5:$D$5" Then Exit Sub では片方が作動しません。
また、Target.Value では、配列を返すとのことなので以下のようにしたらうまくいきました。
助かりました。ありがとうございます。
Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Range("C5")) Is Nothing Then Exit Sub
If Range("C5").Value <> "" Then
Range("F5").Value = Range("D42").Value
Else
Range("F5").MergeArea.ClearContents
End If
End Sub
No.9
- 回答日時:
こんにちは
オマケ程度の話ですが、、、
元のコードのまま、
Target
を
Target.Cells(1, 1)
Target.Cells(1)
Target.Item(1, 1)
Target.Item(1)
Target(1, 1)
Target(1)
のうちの何れかひとつと置き換えるだけでも、
元の狙い通りの結果になる筈です。
(私自身が最近教わった記述を含めて紹介しました)
(配列ではなく、コレクションのインデックスを指しています)
以上を元にして、手を加えるなら、
.Count > 2 と、.Row <> 5 と、.Column <> 3 で
範囲を判別するのがお奨めです。
(#7さんのように複数範囲の変更を捕える場合は別です。)
イベントプロシージャでは、なるべく
"既定のプロパティ"
(大雑把にいえばローカルウィンドウで確認できる類の純粋な意味でのプロパティ)
を優先して用いる方が好ましいかなぁと。
イベントプロシージャに関する回答では「学習者向け」の
内容を書くことも多いのですが、上に挙げたのは、
私自身実践で用いている方法です。
他、
Range("F5").MergeArea.ClearContents
が必須なのか、
Range("F5").Value = ""
で代用できるのか、、、
イベントプロシージャでの記述としては気になります。
または、仮に、非VBAで可能なことをイベントで処理するということなら
原則、私は消極的な考えです。
まぁ気になるという程度の話ですが、、、。
書きたいこと、伝えたいこと、他にも色々ありますが、
今回は要点(各論)だけのコメントにて、失礼させて頂きます。
ありがとうございます。
If Range("C5").Value <> "" Then でうまくいきましたが、Target(1)の方がスマートですね。
いろいろありがとうございました。勉強になります。
No.10
- 回答日時:
あ、すみません
"既定のプロパティ"
は、用語と誤解されそうなので、
一般語としての
「既存のプロパティ」
に読み替えてください。
念の為、
Target(1)を、#7のお礼欄にあるコードで使うとしたら、
無理があります。
Targetの中で最も左、最も上、にあるセルという意味なので、
例えば、A1:D5に貼付けを行うと、A1セルを参照してしまいます。
(セルの結合を適用した範囲に貼付けというのも限られた話ではありますが)
つまり、前稿は、
結合セルC5:D5のみの値変更に限定した内容になっています。
以上、訂正と補足です。
失礼しました。
それでは、また
> 例えば、A1:D5に貼付けを行うと、A1セルを参照してしまいます。
If Intersect(Target, Range("C5")) Is Nothing Then Exit Sub にしたのでその通りでした。
If Range("C5").Value <> "" Then のままにしておきます。
わざわざありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) エクセルのVBAでダブルクリックでチェックを入れたあと 1 2022/10/26 20:30
- Visual Basic(VBA) 【再投稿】VBAで動作しなくて困っています 2 2022/10/11 11:05
- Visual Basic(VBA) 【再々投稿】VBAのプログラムで動作しなくて困っています 8 2022/10/14 09:06
- Excel(エクセル) VBAについて 3 2022/06/19 18:19
- Visual Basic(VBA) excel2021で実行できないマクロ。どこを直したらいいのか 2 2022/03/28 03:40
- Visual Basic(VBA) [Excel VBA] このコードでは行の挿入や行の消去をすると13のエラーが出てしまう。 3 2022/12/09 00:29
- Visual Basic(VBA) VBAのトグルボタンでのマクロについて質問です 3 2022/10/10 17:23
- Excel(エクセル) エクセルのイベントプロシージャーでF列の最終行のセルの入力をトリガーにしたいのですが 1 2022/10/14 09:36
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 2 2022/05/26 17:19
- Visual Basic(VBA) VBAで重複した値のセルに色付けをしたい 1 2022/11/02 16:12
このQ&Aを見た人はこんなQ&Aも見ています
-
性格の違いは生まれた順番で決まる?長男長女・中間子・末っ子・一人っ子の性格の傾向
同じ環境で生まれ育っても、生まれ順で性格は違うものなのだろうか。家庭教育研究家の田宮由美さんに教えてもらった。
-
Excel VBAでのWorksheet_Changeが動作しない原因
Excel(エクセル)
-
VBA:結合されたセルに対する「Target」について
Access(アクセス)
-
エクセル イベントマクロ Changeイベントを複数作りたい
Access(アクセス)
-
-
4
Worksheet_Changeの内容を標準モジュールから実行するには?
その他(プログラミング・Web制作)
-
5
Changeイベントでの複数セルのクリアの処理について
Visual Basic(VBA)
-
6
エクセルvba (ByVal Target As Range)について
Excel(エクセル)
-
7
エクセルVBAでTargetのセルに設定された「名前の定義」の取得方法は?
Excel(エクセル)
-
8
エクセルVBAのDeleteキーによるエラー
Excel(エクセル)
-
9
他のシートの特定のセルが変わると、自動実行されるマクロについて
Excel(エクセル)
-
10
複数処理 Worksheet_Change(ByVal Target As Range)
Visual Basic(VBA)
-
11
エクセルVBA intersect columnsの複数列のやり方
Visual Basic(VBA)
-
12
ExcelのVBAでエラー13が出てしまいます。(泣き)
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
パワポで曲がった両矢印の簡単...
-
パワーポイントの表
-
音声マークを一括非表示にしたい。
-
パワーポイント2019 図の透...
-
パワーポイント「スライドショ...
-
PowerPointで、作成されたファ...
-
エクセル・パワーポイントなど...
-
PowerPointで保存のところに変...
-
you tubeにパワポで作った動画...
-
PowerPointVBAでスライドマスタ...
-
USBとは?至急です! 大学でプ...
-
パワーポイント2016でデザイン...
-
PowerPointのアニメーションで...
-
卒論発表があります。5分ほどの...
-
PowerPointについて質問です。 ...
-
officeのプロダクトキーを紛失
-
パワーポイントでの印刷時の枠...
-
パソコン初心者です。 Windows...
-
PowerPointでスライドマスタの...
-
パワーポイントで、全てのスラ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
パワポで曲がった両矢印の簡単...
-
音声マークを一括非表示にしたい。
-
パワーポイント「スライドショ...
-
パワーポイントの表
-
PowerPointでスライドマスタの...
-
エクセル・パワーポイントなど...
-
PowerPointVBAでスライドマスタ...
-
PowerPointのアニメーションで...
-
PowerPointで、作成されたファ...
-
エクセルでA3の大きさに資料...
-
ExcelのグラフをPowerPointに貼...
-
パワーポイントで資料を作る時 ...
-
パワーポイントのアニメーショ...
-
【パワーポイントのフォントが...
-
プレゼン時のポインター
-
PowerPoint2010、2021のスライ...
-
パワーポイントで、全てのスラ...
-
パワーポイントで説明しながら...
-
PowerPointのオプションの設定...
-
PowerPointの背景について
おすすめ情報