[[20121126164516]] 『DeleteとBACKSPACEの違いを教えてください。』(キュロゴス) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『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

あー分かったような。
V1セル単独じゃなくて、「V1を含む結合セル」じゃないですか。
この場合はDELキーとBSキーでの動作の違いが再現できました。
(みやほりん)

 検証
 
 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。
 
(みやほりん)

mook様、みやほりん様、いろいろありがとうございます。
みやほりん様のおっしゃるとおり結合セルです。説明不足ですみませんでした。(それにしてもそれに気付くとはすごいです。)mook様も色々な可能性をかなり親身にありがとうございます。
会議が終わったらまた挑戦してみます。
(キュロゴス)

 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" じゃない!」って自分で気づけます。
 
「コードを作る」スキルはもちろん大事ですが、
「何々のつもり」で書いてみたコードがが間違いなくマクロコードとして
表現されているかどうか、確かめるスキル(デバッグのスキル)も同時に
磨いてください。
 
(みやほりん)

横入り質問申し訳ありません。
VBA初心者です。
イベントマクロではブレークポイントをつけてからステップ実行するんですね。
初めて知りました。
コードがうまく動かない時にF8を押してのステップ実行は行っていましたが
イベントマクロの時はどうしていいかわかりませんでした。
(コード内でF8を押しても何もおきないので...)

イベントマクロがうまく動かない時で、どこが間違っているのか
検討がつかない場合、コードの一番最初にブレークポイントをつけてから
ステップ検証をする。
この考え方はあってますか?
 (kok)


イベントマクロに限らず、が正解かな。
(みやほりん)

みやほりんさん
有難うございます。
もうひとつ教えていただきたいです。
イベントマクロ以外ではF8だけでもエラー検証できる?? 

ブレークポイントをつけてF8を実行するのと
F8のみを実行するのと
どこが違うのでしょうか?
(kok)


 ステップ実行はエラー検証の一つの方法ではあるけれども、それだけで十分とは言えません。
 
ステップ実行「だけ」で確認できるとすれば、コードの流れの検証と
実行時エラー箇所の発見くらいじゃないでしょうか。
 
他のデバッグ手段も組み合わせて活用すべきでしょうね。
 
ブレークポイントを設けたところまでは普通に実行されますから、
F8キーを押す回数は間違いなく少なくなります。
ループが何か所もあるものや、何百行もあるプロシージャでは大変ですからね。
 
(みやほりん)

解決!
みやほりん様はじめコメントくださった方々、大変ありがとうございました。
正直、ブレークポイントなるものも知りませんでしたので調べてみて勉強になりました。
エクセルを使う機会がそれほど多くないのですがいい経験をさせていただきました。
みなさま貴重なお時間をいただき感謝いたします。
(キュロゴス)

みやほりんさん
>ブレークポイントを設けたところまでは普通に実行されますから、
>F8キーを押す回数は間違いなく少なくなります。
>ループが何か所もあるものや、何百行もあるプロシージャでは大変ですからね。
理解できました。
大変勉強になりました。有難うございました。
 (KoK)

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.