- ベストアンサー
削除範囲が変わる場合の対処方法
日々データ入力をしており、昨日はセルB2~D10に入力したとします。 昨日のシートをコピーして、B2~D10のデータを消し、 今日はデータ入力範囲を広げて、B1~E12に入力しました。 明日は、B1~E12のデータを消すことになります。 このデータを消す作業をマクロでやりたいのですが、日々データの入力範囲が変わってしまいます。 このような場合、どのようなマクロで対応すればよいのでしょうか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
ちょっとだけ、一般機能を思い出してみてください。 ※手も動かしてみると解りやすいかもです。 B2セルにフォーカスを置き、 ジャンプ(Ctrl+GまたはF5)機能を動かします。 「セル選択」のボタンをクリックすると、 「選択オプション」というダイアログが出ます。 このうち「最後のセル」を選択、OKを押します。 すると、「使用している(形跡がある)一番右下のセル」に フォーカスが飛んでいくのを確認できると思います。 マクロでコレを使ってみます。 「マクロの記録」を使って上記の作業をすると、 Range("B2").Select Selection.SpecialCells(xlCellTypeLastCell).Select と記録されますので、少しだけ手を加えます。 例えば、 Msgbox(Range("B2").SpecialCells(xlCellTypeLastCell).Address) を動かしてみるとどうでしょう。 質問文中の例示だと「$E$12」というメッセージボックスが出てきます。 ※状況によってはアドレスが変わるかもしれません。 E13セル辺りに何かを入力して、削除していたりすると メッセージボックスに「$E$13」が出ます。 前述「使った形跡があるセル」とはそういう感じです。 さて、メッセージだけ出してもしょうがないですね。 上記で「最後のセルのアドレス」を取得できましたから、 コレをRangeに渡してやりましょう。 とりあえず、予備知識として Range(Range("B1"), Range("D2")).Select こんな回りくどい書き方をしてやると、B1:D2の範囲を選択できる、 というのを理解しておきましょう。 そんなわけで、 Range(Range("B2"), Range((Range("B2").SpecialCells(xlCellTypeLastCell).Address))).Select ※改行されて見えますが、1行にまとめてくださいね。 こんな書き方をしてやると 「B2セルから最後のセルまでを選択」 という命令として使えそうです。 そんなわけで、あとは「.Select」を 「.Delete Shift:=xlToLeft」にしてやれば削除して左に詰める 「.Delete Shift:=xlToUp」にしてやれば削除して上に詰める 「.EntireColumn.Delete」にしてやれば列全体を削除 「.ClearContents」にしてやれば消去(Deleteキーの挙動) をしてくれますね。 目に見える「最後のセル」以降の行・以降の列に何も無いなら、 この手段がなんとなく解り易いのではないかな?と思います。 ただしこの「最後のセル」は 削除をした後、ファイルを保存して開きなおさないと更新されない という弱点があったりします。 理解しつつ使わないとどこかで引っ掛かるかもしれません。 あとは、ご自身で思考錯誤なさってくださればと思います。 その他の手段として考えやすいモノがあるとすると・・ 同じく「セル選択」から「アクティブセル領域」を選択し、 範囲内の列数・行数をカウント、B2から必要分Resize、 というのもありますが・・・ こちらは比較的ややこしいかもしれません。 とはいえ、必要なキーワードはこの段落にほぼ入れていますので、 ご興味がおありでしたら調べてみると面白いかもしれません。
その他の回答 (1)
- kuma56
- ベストアンサー率31% (1423/4528)
もうちょっと、シートの構造が判るほうが、よりよいアドバイスが貰いやすいと思いますよん・・ 例えば、最初に入力するセルは。B1かB2セルなのか? それともB列のどこかなのか? それともその他の列になる事もあるのか? B1セル以外の場合、B2セルからデータがあったとして、B1には消してはいけないデータがあるのか? もし、B1に何もない・・・もしくは消しても構わないデータなら、消し始めはB1からと決め打ちすればいいだけだし、終わりにしても日々の入力範囲のmaxの位置で決め打ちできないのか? その辺で、vbaの対応方法も変わってくるかもよん・・・・
お礼
回答ありがとうございます。 質問に具体性が欠けていましたので、いったん締め切りとさせてください。
お礼
回答ありがとうございます。 質問に具体性が欠けていましたので、いったん締め切りとさせてください。