• ベストアンサー

エクセルVBAで、行削除⇒別シートに自動入力をしたい

いつもお世話になります。よろしくご指導お願いします。 VBA初心者です。最近随分皆様に助けていただいています。尚、業務の関係でお助けください。 エクセルで名簿形式のデータベースシートがあります。 (山田太郎 ○○市○○町 911-1234 ・・・) 例えば、この山田さんが解約したり死亡されたりすると「行削除」をします。そのとき、別シート(シート名「解約者台帳」)に自動的に削除した行の全データをもっていきたいのです。 ★解約者台帳のフィールドは、元シートと基本的に同じですが、A~AG列のデータが必要。AH列以降のデータは不要です。 解約者台帳に追加していく(新しい行=何も入力されていない行への自動入力)等のVBAのイメージを含めて、私の力ではやはりさっぱりです。どうかまたまたお助けください。お待ちしています。

質問者が選んだベストアンサー

  • ベストアンサー
  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.4

> マクロの実行ボタン等を押さず、『行削除を実行することで、自動で解約者台帳に退避(データ移行)する』イメージのVBAは可能でしょうか? では、ご要望の「イベント」で。 データベースシートのモジュールに以下のマクロで可能と思います。 1行全部が選択された場合のみ、メッセージを表示し、確認の上で実行します。 Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Selection.Columns.Count = 256 And Selection.Rows.Count = 1 Then ans = MsgBox("選択した行のデータを契約者台帳に移行し、" _ + Chr(&HD) + Chr(&HA) + " このシートから削除していいですね?", vbYesNo) If ans = vbYes Then With Sheets("契約者台帳") R = .Range("A65536").End(xlUp).Row + 1 MsgBox "契約者台帳" & R & "行に移動します。" .Rows(R).Value = Selection.Value End With Selection.Delete Shift:=xlUp End If End If End Sub

yastaro
質問者

お礼

merlionXXさん、何度もお手間を頂き、解決策をご回答をいただきまして、感謝いたします。要望内容に対して充分に動作でした。本当にありがとうございます。

すると、全ての回答が全文表示されます。

その他の回答 (5)

  • imogasi
  • ベストアンサー率27% (4737/17070)
回答No.6

よくわかっておられる方の回答の後に、非力の小生が書くのは気が引けますが、 エクセルVBAで、行削除を行われたとき、それを察知して、飛んできてくれる、、イベントにWorkSheet_Lines_Delete のようなものが設けられていないとできないのではないですか。 やるとすると、コマンドボタンを1つ削除専用に設け、そのクリックイベントに Private Sub CommandButton1_Click() Selection.EntireRow.Copy Worksheets("sheet10").Activate d = ActiveSheet.Range("a65536").End(xlUp).Row ActiveSheet.Cells(d + 1, 1).Select ActiveSheet.Paste Worksheets("sheet2").Activate Selection.EntireRow.Delete End Sub でとりあえずどうでしょうか。 少数例ではテスト済み。 Sheet2が元シートで、削除分の累積がSheet10の例です。 だめでしょうかね?

yastaro
質問者

お礼

imogasiさん、いつもありがとうございます。ご回答を感謝いたします。

すると、全ての回答が全文表示されます。
  • banker_U
  • ベストアンサー率21% (17/78)
回答No.5

>このエクセルファイルの作業をする担当の者がエクセル >そのもの初心者であること等から、・・・ 相手が素人となると、簡単な方法では何をやっても難しいかと・・・ Wendy02さんのおっしゃる方法が、確実な方法となるんでしょうが、そこそこちゃんとVBAがかけるスキルが必要ですよね(すべての削除機能を殺すとかはそれなりの実務経験がないと難しいと思う)。 わたしなら、この場合削除自体をさせません。 間違って、他のデータを消されたら取り返しがつかなくなることがあるからです。 実際にはフラグを立てておくだけと言う運用をします。具体的には、一列「解約・死亡」とでも列を作っておいて、そこに1とか入力してもらうだけにします。 データは残したままでもいいし、一定の期間で、フラグの立っている行をまとめて別シートに移してもいい(これは自分でやる)。 いちばん簡単で安全な解決策と思いますがどうでしょう?

yastaro
質問者

お礼

ご回答ありがとうございます。Wendy02さんとbanker_Uさんのアドバイスを受けて慎重に検討させていただくつもりです。確かに解約者のデータを残したままという方法も安全であり、オートフィルタ等さえ担当者が使えばクリアできる問題かもしれません。ありがとうございました。

すると、全ての回答が全文表示されます。
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんにちは。Wendy02です。 >『行削除を実行することで、自動で解約者台帳に退避(データ移行)する』イメージのVBAは可能でしょうか?イベント? 書いても無駄になってしまうかもしれませんので、ヒントだけ書いておきます。 行の削除ボタンは、いくつかある上に、ワークシートの淵(行番号の灰色の場所)からの削除もありますから、通常のイベントでは役に立ちません。WithEvents で、行の削除ボタンのいくつかに、インスタンスを設けます。 ただ、私個人は、そういう方式のマクロは作りません。あくまでも、シート上のどこかに、例えば、メニューに削除ボタンを別につけます。他の人が使う場合は、本来の機能のある行の削除ボタン全てを、使えないようにしておきます。

yastaro
質問者

お礼

Wendy02さん、いつもご指導ありがとうございます。 初心者の私にはご指導内容が難しくて消化不良気味ですが、いつもやさしいご回答を感謝申し上げます。

すると、全ての回答が全文表示されます。
  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.2

名簿形式のデータベースシートで削除する行全体を選択し、下記のマクロを実行します。 Sub TEST() With Sheets("契約者台帳") R = .Range("A65536").End(xlUp).Row + 1 MsgBox "契約者台帳" & R & "行に移動します。" .Rows(R).Value = Selection.Value End With Selection.Delete Shift:=xlUp End Sub

yastaro
質問者

補足

ありがとうございます。動作の確認ができました。 ただ、このエクセルファイルの作業をする担当の者がエクセルそのもの初心者であること等から、マクロの実行ボタン等を押さず、『行削除を実行することで、自動で解約者台帳に退避(データ移行)する』イメージのVBAは可能でしょうか?イベント?というものでしょうか?ご指導お願いいたします。

すると、全ての回答が全文表示されます。
  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.1

Sheets("Sheet1").Select Rows(1).Cut '切り取る行番号(行削除) Sheets("Sheet2").Select Rows(2).Insert Shift:=xlDown '挿入する行番号 Range("AH2:AG2").Clear Range("AH2")=Date '削除日 とすると、最新の削除データを上の行に置くことが出来ます。

yastaro
質問者

お礼

hana-hana3さん、ご回答をありがとうございます。お礼が遅くなって申し訳ありませんでした。

すると、全ての回答が全文表示されます。

関連するQ&A