[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『DeleteとBACKSPACEの違いを教えてください。』(キュロゴス)
VBA、良くわかっていませんが教えてください。
$V$1がターゲットで、""が条件で斜線を引くようにしたつもりです。
セルに何かを入れると斜線が解除され、BACKSPACEで内容を消すと斜線が現れます。
しかし、DELETEで内容を消すと斜線は現れてくれません。
理由と対処法を教えていただけるとたいへん勉強になります。
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$V$1" Then
If Cells(1, 22) = "" Then Range(Cells(1, 22), Cells(1, 22)).Borders(xlDiagonalDown).LineStyle = xlContinuous Else Range(Cells(1, 22), Cells(1, 22)).Borders(xlDiagonalDown).LineStyle = xlNone End If End If End Sub
こちらで試してみたところは、Backspace でも Delete キーでも斜線は 表示されますが、セルにスペースなど残っていないでしょうか。 (Mook)
セル内の文字列の最初に合わせてDELを押しまくって消すと反応します。
ですが、セルを選択してDELを押してENTERだと反応しません。
(キュロゴス)
バージョンによる違いもあるのかな? WinXP・Excel2003でBS、DELに違いなく斜線表示されます。 次の操作はDELキーでV1をクリアするものを「マクロの記録」したものです。 Range("V1").Select Selection.ClearContents >セルを選択してDELを押してENTER この操作をマクロ記録してその結果のコードを投稿してもらえませんか? (みやほりん)
# おっと、衝突。 2003, 2007, 2010 で確認しましたが、再現しないですね。 お使いのバージョンは何でしょうか。
セルを選択した後であれば、Enter を押さなくとも DEL を押した時点で斜線が出ます。 オプションに何かDELキーの設定があったかなぁ?
他のシートイベントは何もない状態でしょうか。 コードを下記にしても一緒でしょうか(罫線はイベントを発生しないはずなので、 動作が変わる気はしないのですが・・・)。 (Mook)
Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("V1")) Is Nothing Then Exit Sub
Application.EnableEvents = False With Range("V1") If .Value = "" Then .Borders(xlDiagonalDown).LineStyle = xlContinuous Else .Borders(xlDiagonalDown).LineStyle = xlNone End If End With Application.EnableEvents = True End Sub
検証 Private Sub Worksheet_Change(ByVal Target As Range) Debug.Print Target.Address End Sub 「イミディエイトウィンドウ」に実行結果が出力されます。 セルが結合されている場合、 DELキークリアの時とBSキーでセル内容削除の時では、取得されている Targetが違うのが確認できます。 DELキーではセル範囲のクリア、 BSキーでは結合セル範囲の右端上端セルの編集。 そのため、Target.Address = "$V$1" はBSキーの時はTRUE、 DELキーはTarget.Address が "$V$1:$W$2" のように返されるのでFalse。 (みやほりん)
Target = "" と普通書くべきところが >Cells(1, 22) = "" となっていたので、もしかしたら、と。 次のようなコードでどうでしょうか。 結合セルの左上のセルを利用します。 Private Sub Worksheet_Change(ByVal Target As Range) With Target If .Cells(1).Address = "$V$1" Then If .Cells(1).Value = "" Then .Borders(xlDiagonalDown).LineStyle = xlContinuous Else .Borders(xlDiagonalDown).LineStyle = xlNone End If End If End With End Sub さて、表面的な原因は結合セルであろうとは思いますが、 根本的な原因は、「キュロゴスさんのデバッグ不足」です。 ブレークポイントを設けて、ステップ実行する習慣があれば、DELキーの時 If Target.Address = "$V$1" Then から最後のEnd Ifまで抜けてしまいますから、 「この時のTarget.Address は "$V$1" じゃない!」って自分で気づけます。 「コードを作る」スキルはもちろん大事ですが、 「何々のつもり」で書いてみたコードがが間違いなくマクロコードとして 表現されているかどうか、確かめるスキル(デバッグのスキル)も同時に 磨いてください。 (みやほりん)
イベントマクロがうまく動かない時で、どこが間違っているのか
検討がつかない場合、コードの一番最初にブレークポイントをつけてから
ステップ検証をする。
この考え方はあってますか?
(kok)
ブレークポイントをつけてF8を実行するのと
F8のみを実行するのと
どこが違うのでしょうか?
(kok)
ステップ実行はエラー検証の一つの方法ではあるけれども、それだけで十分とは言えません。 ステップ実行「だけ」で確認できるとすれば、コードの流れの検証と 実行時エラー箇所の発見くらいじゃないでしょうか。 他のデバッグ手段も組み合わせて活用すべきでしょうね。 ブレークポイントを設けたところまでは普通に実行されますから、 F8キーを押す回数は間違いなく少なくなります。 ループが何か所もあるものや、何百行もあるプロシージャでは大変ですからね。 (みやほりん)
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.