[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『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 >
関連する話ならリンクを置いておいたほうが、このトピックから見た人も状況が把握しやすくなるとおもいます。
>例えばD15で入力された項目を<デリートキー>でクリアした場合、対象のE,F(結合セル)8をクリアしたいのですが、マクロで表記することは出来ますでしょうか?
おそらく可能です。
Changeイベントについて調べてみるとよいでしょう。
(もこな2 ) 2022/04/06(水) 20:19
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
>例えば〜
コード全体が見えませんので何ともいえませんが、「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
今更ですけど、 >エクセルが強制終了 について説明しておきましょう。
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.