• ベストアンサー

マクロで、決まった範囲内の一定値のみの消去法は?

エクセルでVBAを使って、図のようにある範囲において、指示した値(W)のセルを を削除し、下図のように、上方向に移動させるのにはどのようにしたら良いでしょうか。 同一範囲を別な位置に =IF(B2="W","",B2) をコピーする形を作って、作られた範囲を さらに値のみコピーして後、その範囲を、空白セルを上方向に削除しようとしても、 見かけ上の空白セルで実際は削除されません。 マクロで作ろうとしましたがVBA初心者なので、わかりません。教えていただけないでしょうか。

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

  • ベストアンサー
  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.4

マクロで逐一削除してった方が簡単そうです。 E1に記入されてる内容を,B2:E7の範囲から削除する: sub macro1()  dim c as range  dim a as variant  a = range("E1").value  set c = range("B2:E7").find(what:=a, lookin:=xlvalues, lookat:=xlwhole)  do until c is nothing   c.delete shift:=xlshiftup   set c = range("B2:E7").find(what:=a, lookin:=xlvalues, lookat:=xlwhole)  loop end sub 別のマクロ:一括削除してみる sub macro2()  range("B2:E7").replace what:=range("E1").value, replacement:="", lookat:=xlwhole  range("B2:E7").specialcells(xlcelltypeblanks).delete shift:=xlshiftup end sub #「削除したくない空白」が「指定範囲」に紛れている場合は,空白ではなく例えば「エラー値」などに置換して削除する #一応指摘しておきます ANo2さんのマクロでは,縦に2つW,Wと繋がっていると漏らします。

qwer098123
質問者

お礼

お答え有難うございます。 試させていただきました。どちらもきっちりです。 またFINDの使い方をはじめて知りました。 随分簡明に書けているのに感心しました。 また答えを二つ有難うございます。 二つ目も非常に短い構文で表現され、勉強になります。

その他の回答 (4)

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.5

No.2です。 No.4さんのご指摘通りでした。 検証せずに投稿してごめんなさいね。 (No.4さん、どうもありがとうございました。) 一気に削除するコードを載せてもNo.4さんの二番煎じになりますので、 別のコードにしてみました。 今回も範囲指定した後にマクロを実行してみてください。 Sub Sample2() Dim i As Long, j As Long For j = Selection(1).Column To Selection(Selection.Count).Column For i = Selection(Selection.Count).Row To Selection(1).Row Step -1 If Cells(i, j) = Range("E1") Then Cells(i, j).Delete shift:=xlUp End If Next i Next j End Sub ※ 削除の場合は後ろから!という基本的なコトを忘れていました。m(_ _)m

qwer098123
質問者

お礼

試させていただきました。 Wを連ねてもパッチリです。 このような表現の仕方もあること、なるほどです。 新しいお答え有難うございます。

  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.3

手抜きマクロですがこんな感じでどうでしょう。 Sub Sample()   Dim nFlg, rOne, rTarget As Range   For Each rOne In Range("B2:E7")     If rOne.Value = Range("E1").Value Then       'E1と同じ値のセルが入っているセルを覚えておく       If rTarget Is Nothing Then         Set rTarget = rOne         nFlg = 1       Else         Set rTarget = Union(rTarget, rOne)       End If     End If   Next rOne   '覚えておいたセルを削除(上方向へシフト)   If nFlg = 1 Then rTarget.Delete Shift:=xlUp End Sub

qwer098123
質問者

お礼

お答え有難うございます。 試してみましたら、きちっと求めている表示になりました。流石です。 まだVBAの勉強不足ですべて理解しきっておりませんので、 あわてずに、しっかり自身で組めるようにしたいと思います。

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.2

こんばんは! 一例です。 必ず範囲指定してマクロを実行してみてください。 Sub Sample1() Dim c As Range For Each c In Selection If c = "W" Then c.Delete shift:=xlUp End If Next c End Sub こんな感じではどうでしょうか?m(_ _)m

qwer098123
質問者

お礼

お答え早速試させていただきました。 こんなに簡明なマクロで期待どおりの配列が 得られました。 有難うございます。

noname#203218
noname#203218
回答No.1

VBAの知識が無いのであれば、関数で処理可能です。 ご参考まで。 B10に下記式コピペ =INDEX(B:B,SMALL(IF(B$2:B$7=$E$1,99,ROW(B$2:B$7)),ROW(B1)))&"" 上記式は配列式なので、シフトキー及びコントロールキーを押しながらエンターキーを押します。 B10の式が{}で括られてるのを確認出来たら式が完成です。 {=INDEX(B:B,SMALL(IF(B$2:B$7=$E$1,99,ROW(B$2:B$7)),ROW(B1)))&""} 括弧でくくられない場合は、B10セル選択し、数式バーにカーソルを合わせてくだい。 B10の式をE15までコピペで完了です。

qwer098123
質問者

お礼

素早いお答え有難うございます。 マクロを使わずに配列式だけでできるとは! あとでしっかり式を理解したいと思います。 今後の中で利用させていただきたいと思います。

関連するQ&A

  • マクロにて空白のセルを一括して消去でなく削除したい

    空白のセルを一括して、空白セルについた色も含めてマクロで全て削除したい。 現在のデータ(仕様)について 1.Sheet2に列ごとにセルに色をつけ、データもあるとします。 2.A列10行・B列6行・C;列18行というように、列によってデータの入った範囲が違います。 3.どの行も途中に空白セルはなく、詰めたデータです。 以上です マクロで一括処理したいと思いますが、このようなことができるコードを教えて頂けませんか。よろしくお願いします。

  • 空白なら入力、入力されていたら削除のマクロ

    A1セルに、B1セルに入力した文字をコピーするマクロを作りたいです。 ただし、常にB1セルに入力した文字をコピーするのではなく、A1セルに何も 入力されていなかった時だけ文字をコピーして、逆に何か入力されていた時はそれを 認識して、A1セルを空白にするマクロです。マクロの記録でうまくいかなかったので、お知恵を貸していただければ幸いです。。 (例) A1セルは空白 B1セルに あいうえお とかかれているとする    マクロボタンを押すと、 A1セルにあいうえお と入力される    もう一度同じマクロボタンを押すと、A1セルが空白になる(あいうえおが削除される)    更にもう一度同じマクロボタンを押すとA1セルにあいうえお と入力・    これの繰り返しです。

  • VBAでの選択範囲内の削除方法。

    Excel2003でVBAを使っています。 まず、VBAである範囲(例えば、A1からK20)を指定した後、その範囲内にある値の中で、aaaとbbb以外の値のセルを空白セルにしたいのですが、どのようにしたらよいのでしょうか? aaaとbbbの入っているセルを空白セルにする場合と、aaaとbbb以外の値が入っているセルを空白セルにする方法を教えてください。 宜しくお願いします。

  • マクロで空白セルに貼り付ける

    エクセルで表を作っていますが、マクロを使って、空白セルの左隣の値をコピーし、空白セルに貼り付けをしたいのですが、うまくいきませんでしたので、教えてください。

  • [マクロ]値に変換しても、空白のセルがカウントされてしまいます。

    式が入っているセルを値に変換し、値が入ってるセルだけをカウントさせたいのですが、もともと式が入っていた空白になっているセルもカウントしてしまいます。 値の変換の仕方が間違っているのでしょうか? それともカウントの仕方が良くないのでしょうか。 値に変換するのは自動記録のマクロを作成しました。 カウントは、COUNTA関数をVBAで使用しています。 空白のセルをカウントさせない方法を教えてください。 マクロ・VBA初心者なので、値に変換するVBAも合わせて教えていただけると勉強になります。 よろしくお願いいたします。

  • マクロ:範囲内のセルを1つずつ編集する

    EXCEL2003を使っています。 マクロは全くの初心者です。 VBはVB.NETを少しかじった程度です。 A1:A30に値1、B1:B30に値2が入力されています。 (1)B1の値がA1より大きい場合セルの背景色を青色に変更。 (2)B1の値がA1より小さい場合セルの背景色を赤色に変更。 (1)(2)の動作をB1からB30まで順番に行いたいのです。 条件付書式のやり方は分かります。 ですが条件付書式の場合単独のセルを指定する方法しか分かりません。 範囲内のセル全てに1つずつ条件付書式を適用するマクロを組みたいのです。 どなかた知恵を貸して下さい。 宜しくお願いします。

  • エクセル(2013)の繰り返し処理マクロについて

    以下のような処理をマクロで行いたいのですが、どなたかお詳しい方教えて頂けませんでしょうか。 1.[シート(1)]A1を検索値にする 2.[シート(2)]のB3を範囲指定する。 3.一致しない場合→次行を検索 4.一致する場合、C3をコピーし、[シート(2)]のC10に値で貼り付ける。 5.[シート(2)]のB4を範囲指定する。 6.一致しない場合→次行を検索 7.一致する場合、C4をコピーし、[シート(2)]のC11に値で貼り付ける。 以下B列が空白セルになるまで繰り返し お手数ですが、ご教授頂けますようお願い致します。

  • エクセルで指定セル範囲内の画像・オートシェイプ・値をマクロを使って削除したい

    エクセル2003のマクロについての質問になります。 "B2:D2,B3:F10"を指定範囲として,その中に存在する画像・オートシェイプ及び, 同範囲内のセルに入力されている値を一度に削除するマクロを教えてください。 画像・オートシェイプは指定範囲に一部でも掛かっていれば削除対象にしたいと思っています。 なお,指定範囲には罫線,結合セル,入力規則(プルダウン),マクロ登録オートシェイプ,数式が存在しますが,それらは残したままにしたいと思っています。 (マクロ登録オートシェイプと数式については,残したままにすることは困難に感じるので,無理そうならそれらは除外してお願いします。) マクロについて初心者ですので,コピーペーストでそのまま使用できる状態で回答頂けると助かりますm(__)m よろしくお願いします。

  • マクロを使って範囲選択したい

     エクセルのセルにランダムに入力されたデータについて、データが入力されたセル(データが入っていない空白部分も含めて)全てを範囲選択したいのですが、マクロを利用してできますでしょうか。  その後、コピーペーストする予定なのですが、シート全体を選択する方法は駄目です。あと、空白セルも存在するので、入力された1つのセルを選択して、ctrl+Shift+*も駄目です。  もともとのデータは、OCRソフトで読み込こんだデータをエクセルにしたものなので、基本ぐちゃぐちゃにデータが入力された状態になっています。  わかりずらい質問かもしれませんが、回答願います。

  • エクセル2010 繰り返しマクロ

    (1)g列の空白の最上行に =SUMPRODUCT(min((a:a>=f2)*(a:a<f2+730)*e:e)) と入力。 そのセルをコピーし、同じセルに値を上書き貼り付け ↓ (2)a列に(1)のセルの左隣のセル以下の数値がある行の、b列を削除 (画像の場合、(1)のセルがg1の場合、b2,b3を削除する) というのを、f列に数値がある行だけ繰り返すマクロの構文を教えてください。 大変お手数おかけいたしますが、どうぞよろしくお願いします。

専門家に質問してみよう