[[20220406193711]] 『deleteキーを押したらセルの値をクリアする方法』(ETM) ページの最後に飛ぶ

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

 

『deleteキーを押したらセルの値をクリアする方法』(ETM)

お世話になります。
先日はお返事頂きありがとうございました。
更に、質問させていただきたいと思います。

現在、「入力シート」と「売上明細書」というエクセルシートがあり、
入力シートのB,C(結合セル)15に入力するとマクロで売上明細書のB,C,D(結合セル)8に転記(コピー&ペースト)される状態にあります。「あいう」と入力したら「あいう」と表示されます。また、同様に
入力シート    売上明細書
D15     =    E,F(結合セル)8
E15    =    G8
H15    =    H,I(結合セル)8
I15    =    J,K(結合セル)8
K15    =    L,M(結合セル)8
L15    =    N,O(結合セル)8
S15    =    P,Q,R(結合セル)8

現在の行数は30行ですのでそれぞれ
〇44        〇37
まであります。
*行追加で今後増える場合もあります。
こちらで、例えばD15で入力された項目を<デリートキー>でクリアした場合、対象のE,F(結合セル)8をクリアしたいのですが、マクロで表記することは出来ますでしょうか?また、デリートするセルはD15からS15や
D15 K15等列を飛ばして削除する場合もありますので、その場合でも出来るようにしたいです。

どうかご教授のほどお願いいたします。

< 使用 Excel:Office365、使用 OS:Windows10 >


前のトピックは↓ですかね。
[[20220403212300]] 『マクロで結合セルのコピー&ペースト』

関連する話ならリンクを置いておいたほうが、このトピックから見た人も状況が把握しやすくなるとおもいます。

>例えばD15で入力された項目を<デリートキー>でクリアした場合、対象のE,F(結合セル)8をクリアしたいのですが、マクロで表記することは出来ますでしょうか?
おそらく可能です。
Changeイベントについて調べてみるとよいでしょう。

(もこな2 ) 2022/04/06(水) 20:19


もこな2さんありがとうございます。
changeイベント調べているのですが、どうしたら良いのか分かりませんでした。
調べている中で
Private Sub Worksheet_Change(ByVal Target As Range)
    If Intersect(Target, Range("A1:B5")) Is Nothing Then
        Exit Sub
    Else
        MsgBox "セルの値が変更されました"
    End If
End Sub

これが使用できるのでは?と思い、
例えば
With Sheets("入力")
.Range("B2").Value = dstSH.Range("G4").Value
とすれば、クリア(入力シートB2値の削除をしたとき、売上明細書G4を削除)と
考えたのですが、エクセルが強制終了してしまっています。

(ETM) 2022/04/06(水) 21:21


訂正
入力シートB2値の削除をしたとき、売上明細書G4を削除→クリアです。
申し訳ございません。
(ETM) 2022/04/06(水) 21:23

>エクセルが強制終了
それはコード側の問題ではないような気がします。
とりあえず実験用のブックを別に作って試されてはどうですか?

>例えば〜
コード全体が見えませんので何ともいえませんが、「dstSH」はどこで取得(設定)しているのですか?

(もこな2) 2022/04/06(水) 22:51


 横から失礼。

 # 無限連鎖を起こして終了したのでしょうか。ま、それはともかくとして。

 前のスレッドで、
 ・「入力」シートから、
 ・「売上明細書」シートに一括して転記するコードを書かれたわけですよね。

 今回、「消去」する処理があっても、そのつど反映せずに、
 「消去」が終わった段階で、一括転記処理を再実行すれば済む話ではないですか?
 「消去」のほか、「修正」があっても同じく売上明細書にも反映するんでしょう?
 「消去」は 「""への修正」と考えて、「修正」=「一括転記処理の再実行」で
 よさそうに思いますが、いかがですか?

 (1) もちろん、Changeイベントプロシージャを書くことはできます。(例えば、末尾のような)
 (2) しかし、そのイベントプロシージャは、通常の入力作業の時も動作しますよ。
     消去の時だけ(つまり、Target(1).Value が""の時だけ)売上計算書の該当部分を消去すればよいとは言え、
     無駄な感じはしませんか?
 (3) それに、任意の範囲での消去は、結構面倒なものになり、メンテナンスも負荷になりえます。
 (4) また、マクロで消去を行うと、もとに戻せません。
     マクロ実行には元に戻すという概念がないので。
     つまり、いったん消去を行うと、マクロで売上明細書を元に戻すということはできません。
     内容をよく確認したうえで"一括して再実行"、というほうが安全な気がします。

 物事はできるだけ仕組みを簡単なものにしておいたほうが、
 何かと都合が良いと思いますがいかがですか?
 #   この議論はなにか既視感があるんですよね。個人的にですが。

 (参考コード)
 入力シートのイベントプロシージャ(消去があったら、売上明細書も対応して消去)

 Private Sub Worksheet_Change(ByVal Target As Range)
     Dim ary1, ary2
     Dim checkRange  As Range
     Dim myRange     As Range
     Dim clearRange  As Range
     Dim lastRow     As Long
     Dim r           As Range
     Dim k           As Long

     ary1 = Array(2, 4, 5, 8, 9, 11, 12, 19)    '入力シートの対象列
     ary2 = Array(2, 5, 7, 8, 10, 12, 14, 16)    '売上明細書シートの対象列
     lastRow = Cells(Rows.Count, "B").End(xlUp).Row

     'checkRange(=入力シートの消去をチェックすべき対象セル範囲)の作成
     Set checkRange = Cells(15, ary1(0))
     For k = 1 To UBound(ary1)
         Set checkRange = Union(checkRange, Cells(15, ary1(k)))
     Next
     Set checkRange = Intersect(Rows("15:" & lastRow), checkRange.EntireColumn)

     'myRange(= checkRangeのうち、実際に変化があったセル)
     Set myRange = Intersect(Target, checkRange)
     If myRange Is Nothing Then Exit Sub

     'それらの各セルごとに、消去されていたら、対応する売上明細書のセル範囲を消去
     For Each r In myRange
         k = Application.Match(r.Column, ary1, 0)
         If IsEmpty(r) Then
             Set clearRange = Worksheets("売上明細書").Cells(r.Row - 7, ary2(k - 1))
             clearRange = Empty
         End If
     Next
 End Sub

(γ) 2022/04/07(木) 05:38


>「消去」が終わった段階で、一括転記処理を再実行すれば済む話ではないですか?
そういわれればそうですね。
 勝手に脳内で「売上明細書」を消したら「入力」側を消す話に変換しちゃってましたけど、そうじゃないですね

ちなみに、よく考えると【繰り返さない部分】も【繰り返し処理】もシートと行の関係性が固定されているので、例えば↓のように数式を書けばよいだけのような気がします。
(数値の場合はちょっとまずいですが)

 売上明細書シートのA8セル =入力!A15&""

踏まえて、そもそもマクロで処理する必要があるのでしょうか?

(もこな2) 2022/04/07(木) 06:35


まあ、それも考えましたが、「入力」シートはたぶん使いまわすでしょうから、
ひも付きにしておくわけにもいかないと思いました。
(γ) 2022/04/07(木) 06:52

 今更ですけど、
 >エクセルが強制終了
 について説明しておきましょう。

    Changeイベントプロシージャの中で、入力シートのセルを変更
 →その変更処理によって、Changeイベントプロシージャが走り、
 →その結果セルが変更され、
 →その変更処理によって、Changeイベントプロシージャが走り、
 と、これが無限に繰り返してしまっているからでしょう。

 スタックオーバーフローに類した状況になり、
 Excelが耐え切れなくなって、プッツンしたものと思います。

 このように、イベントプロシージャは注意を要する点が結構あります。

 また、当初は想定していなかった動作になることもあり
 (例: クリックしたときのことを思ってSelection_Changeに処理を書いたが、
        カーソルを移動するたびに重い処理が走ってしまって困るとか)、
 使いこなすのは結構難しい面もあります。
 必要最低限にしておいたほうが良いと思います。

 # ところで、あなたの所望するChangeイベントプロシージャのコードも提示しましたし、
 # 私の代替策も提示しています。
 # 質問されたまま放置される理由がわかりませんね。
 # 急ぎの用事ができたらできたで、簡単にメモを入れるのが普通かなと思いました。
(γ) 2022/04/11(月) 13:29

コメント返信:

[ 一覧(最新更新順) ]


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