• ベストアンサー

削除範囲が変わる場合の対処方法

日々データ入力をしており、昨日はセルB2~D10に入力したとします。 昨日のシートをコピーして、B2~D10のデータを消し、 今日はデータ入力範囲を広げて、B1~E12に入力しました。 明日は、B1~E12のデータを消すことになります。 このデータを消す作業をマクロでやりたいのですが、日々データの入力範囲が変わってしまいます。 このような場合、どのようなマクロで対応すればよいのでしょうか?

  • gennya
  • お礼率90% (924/1026)

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

  • ベストアンサー
回答No.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、 というのもありますが・・・ こちらは比較的ややこしいかもしれません。 とはいえ、必要なキーワードはこの段落にほぼ入れていますので、 ご興味がおありでしたら調べてみると面白いかもしれません。

gennya
質問者

お礼

回答ありがとうございます。 質問に具体性が欠けていましたので、いったん締め切りとさせてください。

その他の回答 (1)

  • kuma56
  • ベストアンサー率31% (1423/4528)
回答No.1

もうちょっと、シートの構造が判るほうが、よりよいアドバイスが貰いやすいと思いますよん・・ 例えば、最初に入力するセルは。B1かB2セルなのか? それともB列のどこかなのか? それともその他の列になる事もあるのか? B1セル以外の場合、B2セルからデータがあったとして、B1には消してはいけないデータがあるのか? もし、B1に何もない・・・もしくは消しても構わないデータなら、消し始めはB1からと決め打ちすればいいだけだし、終わりにしても日々の入力範囲のmaxの位置で決め打ちできないのか? その辺で、vbaの対応方法も変わってくるかもよん・・・・

gennya
質問者

お礼

回答ありがとうございます。 質問に具体性が欠けていましたので、いったん締め切りとさせてください。

関連するQ&A

  • エクセルマクロ 不定範囲へのコピー

    B列のデータが入力されている最終行(添付画像では10行)まで、「data」シートの「E1」セルのデータをA列にコピーする方法をご教示願います(つまり、A1~A10まで)。B列のデータ数は不定なので、マクロで対応したいと思っています。 〈条件〉 B1には必ずデータは入力されていて、B列のデータは連続しています。

  • VLOOKUPで他のシートを参照する場合

    シートが(1)「値表示」と(2)「データ」の2種類があります。 (2)にはB1:D4、B5:D8、B9:D12というように、セル12個分にそれぞれ独立したデータ表があり、このデータが全部で10個あります。 そして、このデータから任意の値を(1)「値表示」シートに表示したいので、(1)のセルA1に「=VLOOKUP(A2,データ!,B1:D4,2,FALSE)という式を入れます。 これで、(1)のA1(2)のシートのデータ表から任意の値が表示されるのですが、このA1に入力した式をコピーして、A10までそれぞれの表に対応したVLOOKUPの数式を入れたいのですが、普通にコピーするとA2以降に入力される式はデータの参照範囲がA1の範囲から1セル分だけずれたB2:D5となっています。A2が参照する範囲は本来はB5:D8にしたいので、一つずつデータの参照範囲を修正しないとならないのですが、このような場合は、やはり一つずつ修正するしか方法がないのでしょうか。 もっと、素早く参照先を変更できる方法がありましたら教えてください。

  • EXCELで指定した範囲の切り取り貼り付け

    Excelで シート1のA1~E1000までデータがあります。 B列には0~1500の数値データがあり昇順で並んでいます。 このB列のデータの700~1000の数値データのA~E列全ての範囲を「切り取り」・シート2に「形式を指定して貼り付け」(値)という作業をマクロにてできませんか? 尚、1つセルが下がるごとに1数字があがるとは限りません。 大変困ってます。詳しい方ご教授ください。

  • VLOOKUPで他のシートを参照する場合

    数式に間違いがあったので、前回の質問をいったん締め切って、再度投稿いたします。 シートが(1)「値表示」と(2)「データ」の2種類があります。 (2)にはB1:D4、B5:D8、B9:D12というように、セル12個分にそれぞれ独立したデータ表があり、このデータが全部で10個あります。 そして、このデータから任意の値を(1)「値表示」シートに表示したいので、(1)のセルA1に「=VLOOKUP(B1,データ!,B1:D4,2,FALSE)という式を入れます。 これで、(1)のA1(2)のシートのデータ表から任意の値が表示されるのですが、このA1に入力した式をコピーして、A10までそれぞれの表に対応したVLOOKUPの数式を入れたいのですが、普通にコピーするとA2以降に入力される式はデータの参照範囲がA1の範囲から1セル分だけずれたB2:D5となっています。A2が参照する範囲は本来はB5:D8にしたいので、一つずつデータの参照範囲を修正しないとならないのですが、このような場合は、やはり一つずつ修正するしか方法がないのでしょうか。 もっと、素早く参照先を変更できる方法がありましたら教えてください。

  • Excelで範囲内にあるデータを引用して表示させる方法

    こんばんわ。いつもお世話になります。 また、皆様のお知恵を借りたくて質問させていただきます。 今回下記のような、2つのシートがあり、メインシートのA1のセルに任意の数値を入れるとサブシートに既にマスタとして入力されてある表のDセル、Eセルの間の範囲にある行のAセル、Bセル、Cセルの値をメインシートで表示をさせたいのですが良い方法はありますでしょうか。 例えば、メインシートA1セルに「135」の数値をいれるとサブシートのD、E各列から範囲に適応する行(130以上~150未満)のA3、B3、C3のセルの値をメインシートのB1、C1、D1のセルに表示させたいのです。 サブシートのデータ数は約50行程あります。 申し訳ありませんがよろしくお願いします。説明不足なところはその都度補足させていただきます。 メインシート(Sheet1) A B C D 135 140 ウ c 107 100 ア a サブシート(sheet2) A B C D E ア a 100 90以上 110未満 イ b 120 110 130 ウ c 140 130 150 シートがうまく表示できてませんが、よろしくです。

  • 複数シートの対象範囲セルを1つのシートに集約

    共通の条件で作成された複数シートの対象範囲セルを1つのシートに集約したく望んでおります。 月毎の身体測定結果を集約することが目的で、不特定の人数、名前の情報を管理しております。 (人数の最大は10名程度) 既存ブック(測定結果.xls)を予め設け、内部に「表紙」と「集計」シートを作成。 提出されたファイル内の各シートは測定結果.xls内に全て格納。(シート名は全て氏名です) 「表紙」シートに氏名の入力欄を設定(D列2行目から下方へそれぞれ入力) 入力された氏名からブック内のシートを検索し、対象となるシートの指定セルを「集計」シートの指定セルへコピー 説明が解り辛いと思いますので、例を伴ってご説明致します。 当月の身体測定結果をAさん・Bさん・Cさん・Dさん・Eさんの5名が提出したとします。 ※各人の測定結果はそれぞれのシート名「Aさん」、「Bさん」、「Cさん」、「Dさん」、「Eさん」で構成され、シート内の記載配列等も全て同様としております。(共通する書式フォーマットで作成) これらのシートは全て測定結果.xls内に存在するものとします。 1列目はタイトル、2列目から入力された必要数値となります。 A列には日付(A2セルから1日→A32セル=31日まで) B列には体温(B2から数値記載) C列には体重(C2から数値記載) D列には体脂肪率(D2から数値記載) E列にはBMI(E2から数値記載) F列には血圧(F2から数値記載) ※ ブック内の「集計」シートにタイトルやA列の日付も予め入力。 (1) ブック内「表紙」シートの氏名入力欄に測定者名を入力 (例:D2セル=Aさん、D3セル=Bさん、D4セル=Cさん、D5セル=Dさん、D6セル=Eさん) (2) マクロ実行 (3) 入力された測定者名から合致する対象シートを検索 (4) 「表紙」シートの氏名入力欄D2セルの対象であるAさんの情報(シート内B2::F32までの範囲)を「集計」シートB2::F32へコピー (5) D3セルの対象であるBさんの情報(同じくシート内B2::F32までの範囲)を「集計」シートG2::K32へコピー(コピー先を5列毎変える) (6) 優先順位に従い、動作を繰り返して全ての情報を「集計」シートに集約 ※ コピー先への優先順位は「表紙」シートの氏名入力欄上部より判定(D2→D3→D4・・・) このような動作をマクロ化したく望んでおります。 マクロの記録や相談箱を参考に何度かチャレンジしているのですが、コードの意味が理解できず、近づくことすら出来ません。 恐れ入りますが、ご教授いただきたくお願い致します。 以上

  • 同じシート内で違うセル範囲の保護方法はありますか?

    はじめまして。 Microsoft Office Excel2007を使用しています。 下記の内容を設定出来る方法はあるのでしょうか?? あれば教えて下さいm(_ _)m シートを開いた時に、一部のセル範囲は誰でも(以下<A>とします)入力可能。 別のセル範囲を、一部の人だけ(以下<B>とします)入力可能。←出来ればパスワードを設定したいです。 すべての編集等の入力は私(以下<C>とします)だけが可能。←パスワード必須 在庫管理表を作っています。 支店があり、各拠点の倉庫は別です。 ですので、各拠点ごとに在庫管理者<B>がいます。 取り置きなどもあるので、取り置き希望者<A>が入力出来るセル範囲を、常に入力可能セルとして開けておきたいです。(以外は選択不可) <B>が入出庫数を入力する時は、そのセル範囲を入力可能にしたいです。(又は、それ以外は選択不可) 全ての編集可能者は<C>のみで、必ずパスワードを設定したいです。 シートの保護は知っていますが、マクロ&VBAは使ったことがありません。 ですが、それらを利用して出来るならやってみたいです。(もちろん簡単な方がイイのですが…^^;) ちなみにですが、この様な設定をしたブックは、この設定のままコピー可能でしょうか?? これは難しいなら、マクロを使って各コピーしたシート又はブックを設定してみます。 よろしくお願いします。

  • すばやく 削除したい。

    エクセルでデーター入力後、指定のセルだけすばやく消す方法を教えてください。 たとえば、1月のデーターも入力し、明日から2月という時、今までは→範囲を指定し、デリートで消してましたが・・・ ctrl+Dとかで消えませんか(これってマクロですか)    初心者です。何卒よろしくお願いします。

  • 式だけのセルを範囲指定から除外したい

    Excel365 windows10 使用の超初心者です。 (1) マクロ記載用A.xlsm データ用のB.xlsx C.xlsxでマクロ作成中です。 (2) データ用ブックのB.xlsx には、DシートとEシート(他に40枚)があります。 (3) Dシートには表には、B4からB33まで(4月21日から5月20日までの30個)のデータがあります。 (4)このデータを、行列を入れ替えてEシートの表に持っていきたいです。 (5)上のデータを貼りつけると時間かかる(=自分はそう思っている。)ので Eシートの表には最初から31個のセルに、=VLOOKUP(A58,計算データ,2,FALSE)関数が入れてあります。 (6)なのでDシートのデータが変わると、すぐにEシートの表も同時に変更されます。 (7)いまEシートを見ると、4月は30日しかないので、5月20日までは表示されていますが、次行のセルには関数式だけで、何も表示されていません。 (8)やりたいことは、この日付が4月21日~5月20日の行までを選択したいです。 (9)CurrentRegionでは、式だけの空欄の所も範囲指定されてしまいます。 何時間も試行錯誤しましたがお手上げです。よろしくお願いします。

  • vlookup数式をコピーをすると範囲が変わってしまう

    こんばんは。非常に基本的なことかも知れませんが、下記のことで非常に悩んでおります。明日の月曜日に仕事で必要になりますので、お手すきの方いらっしゃいましたらどうぞご教授願います。 ●エクセルシートのデータ● A列…社員番号/B列…氏名 A1…001/B1…斉藤 A2…002/B2…飯田 A3…003/B3…伊藤     l A395…395/B395…中川 というようにデータが入っています。 C1に003が入っている場合、D1には、その社員番号003に相対する氏名「伊藤」が入るようにしたかったのでD1に入れた式は =VLOOKUP(C1,A1:B4,2,FALSE) としました。この結果はうまくいったのですが、これをD395までコピーをしたら範囲がプラス1ずつ増加してしまって#N/Aという結果が出てきてしまうのです。 コピーのやり方ですが、フィル ハンドル (選択範囲の右下隅にある黒い四角形) を、コピー先の範囲にドラッグという方法を取りました。そしてこれでダメだったので単純にD1セルをコピーしてD2-D395までを選択して貼り付け、という作業でもやってみたのですが結果は同じで、範囲がどんどん1ずつ増加してしまうのです。 これはどのように対処すれば上手く全てのセルにvlookupの数式が入るのでしょうか。 因みにエクセルを開いてすぐに作業したので書式設定などは全くいじっておらず、表示形式は「標準」になっております。 どうぞ宜しくお願い致します。

専門家に質問してみよう