• ベストアンサー

ExcelのVBAに詳しい人に質問です

B列に品名、C列に個数、D列に『COUNTIF関数』を使って品名が重複した場合に重複と出るようにしている表があります。※画像参照 そこで、個数(C列)が空白の行と、重複がある行を削除したいのですが、 これをVBAで簡単に処理できるようにできないでしょうか。 詳しい方アドバイスお願いします。

  • mzakom
  • お礼率38% (129/338)

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

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

No.1です。 >ちなみにFor文の開始値は、最終行を返すというのは分かるんですが、終了値の「3 Setp-1」というのはどういうことなんでしょうか の件について・・・ B列の最終行から3行目まで、下の行から上に向かって1行ずつループ といった意味です。 なぜ、最終行からなのか?といえば上の行から削除してしまうと 行削除するたびに1行ずつ行が繰り上がってしまいますので、 結果的に本来削除すべき行を飛び越えてループしてしまう可能性がありますので、 行挿入・行削除の場合などは最終行から上に向かって検索するのが 「オーソドックス」といった理由です。 この程度で参考になりますかね?m(_ _)m

mzakom
質問者

お礼

言われた通り上から下に向かっての方法を試してみたら途中で止まりました(;´Д`) なるほどです。そういう意味だったのですね。 丁寧でわかりやすい説明ありがとうございました。 とても勉強になりました。

その他の回答 (2)

回答No.2

VBA使わずとも、オートフィルタで、個数列が空以外、重複列が空の行のみ 抽出すればいいと思いますが。 どうしてもVBAでしたいなら、こんな感じです。 (オートフィルタ使用です) Const HEADER_START_COLUMN As String = "B" Const HEADER_END_COLUMN As String = "D" Const TABLE_START_ROW As Integer = 2 Dim tableEndRow As Integer Dim targetRange As String tableEndRow = Range(HEADER_START_COLUMN & CStr(TABLE_START_ROW)).End(xlDown).Row targetRange = HEADER_START_COLUMN & TABLE_START_ROW & ":" & HEADER_END_COLUMN & CStr(tableEndRow) Selection.AutoFilter ActiveSheet.Range(targetRange).AutoFilter Field:=2, Criteria1:="<>", _ Operator:=xlAnd ActiveSheet.Range(targetRange).AutoFilter Field:=3, Criteria1:="="

mzakom
質問者

お礼

使用方法として「行を削除する」というのは絶対なので、オートフィルタでは駄目なんです。 丁寧な回答ありがとうございました。後学として参考にさせて頂きます。

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

こんにちは! 一例です。 オーソドックスに最終行から検索しています。 Sub 行削除() Dim i As Long For i = Cells(Rows.Count, "B").End(xlUp).Row To 3 Step -1 If Cells(i, "C") = "" Or Cells(i, "D") = "重複" Then Rows(i).Delete End If Next i End Sub こんな感じではどうでしょうか?m(_ _)m

mzakom
質問者

補足

どうも、こんにちは。 回答ありがとうございます。 VBAにそのままコピペしたら見事に思い通りの動きをしてくれました。 ちなみにFor文の開始値は、最終行を返すというのは分かるんですが、終了値の「3 Setp-1」というのはどういうことなんでしょうか。ぐぐってみたのですが、Setp-1がいまいち理解できません。

関連するQ&A

  • エクセルVBAでのまとめ計算

     初めまして、よろしくお願いします。 データーで    A      B     C     D      E ・・・ 1              5     7      2 2              3     7      0 3 4              6     3      6 5              2     8      3 6              0     3      4 ・     ・      ・      ・      ・ ・     ・      ・      ・      ・ 100             3     4      5 という表がありますA列には(C列の値/(D列以降の平均値))をB列には(C列の値-(D列以降の平均値))を表示させたいと思います。たまに3行のような空白の行があります。関数式ではなく、VBAで解る方、よろしくお願いします。

  • エクセル マクロ VBA

    エクセルのマクロについて質問です。 『集計』というブックの『集計開始』というシートに     A列    B列     C列 1行目 見出し  見出し   見出し      (商品名)  (支店)  (個数)         2行目 コメント  空白     空白   3行目 空白   空白     空白 4行目 商品名  支店     個数  5行目 空白   空白     空白 6行目 空白   空白   コメント1 7行目 空白   空白     空白 8行目 空白   空白   コメント2 9行目以降    上記のデータ(見出しを除く)の繰り返し というデータが入っています。 B列の中に『AAA』という文字が含まれていたら、そのセルを空白に置換し、 含まれていなかったら、そこで処理がとまったりエラーが出たりしないで次のステッップへ進み、 C列の中に『B』という文字が含まれていたら、そのセルを空白に置換し、 含まれていなかったら、そこで処理がとまったりエラーが出たりしないで次のステッップへ進み、 (今は、手作業で編集→置換→検索する文字列の中に『B*』と入力し、 置換後の文字列を空白にしてすべて置換ということをやっています。)                            ABC列(データーの入っている行まで)の空白を含む行を一括削除し、 以下のような形にしたいのです。     A列    B列     C列 1行目 見出し  見出し   見出し      (商品名)  (支店)  (個数)         2行目 商品名  支店     個数  3行目 商品名  支店     個数          ・         ・ このようにするマクロ文はどのようになりますでしょうか?

  • エクセル 重複行色付(VBA)について質問です。

    Excelで、2ヶ所の場所を重複しているのかどうかチェックし、重複でしたらその行ごと色を付けたいと思っております。 |    A    |    B   |   C   |   D   |   E   |    田中    1046587920   8/2     8/6    100364987    鈴木    1098463612   8/3     8/5    125698001    森川    1548758743   8/20    8/23    103587410    川島    1046587920   8/22    8/23    100365871    森本    1046587920   8/25    8/26    100364987 例えば、上記の様な一覧があり 「B列」 と 「E列」 とで重複を確かめて、同じであれば色が付く様にVBAを組みたいのですが、現在調べて 「B列」 のみの重複に色付けは出来るようになったのですが、2ヶ所重複に色をつけることで困っております。 上の例で行きますと、田中さんと森本さんの行に色が付く形が理想でして、川島さんの、「B列」は該当しておりますが、「E」列が異なるため、色は付きません。 行数は。2万行前後になるのですが、関数を当てると処理が非常に重くなるため、VBAを試みております。 お知恵をお貸し頂けましたら幸いです。

  • Excel 個数の集計時の重複削除について教えてください。

    COUNTIFを使用し個数を集計したのですが、 同じ値がでてきた時に重複してしまいました。 よい関数を教えてください。 A列  B列(カウント) 111  2 222  1 111 =COUNTIFだとこれも2となってしまうので、行を非表示(または削除)したデータを他シートに表示したい。 333  1 よろしくお願いします。

  • 複数列の中の文字列の検索、個数抽出

    どなたかお力をお貸しください。。 エクセル2003を使用しています。    A列 B  C  D 1  あ  う     あ 2  い  お  か  か 3  う        う 4  え     き  く 5  お  い  う  け Dの文字列のなかでA~C列の中に重複している文字が何個あるかを出したいです。 この場合D列は「あ、か、う、く、け」なので、A~C列にある「あ、か、う」が重複しているので、3個と出したいです。 もしくは重複していない「く、け」で2個と出したいです。 MATCH関数を使うと出来そうなのですが、MATCH関数だと配列の概念がなさそうなので、どうしたものかと。 条件として、 ・一つのセルで関数を使用して出す。 ・マクロ、計算用のセルはできたら使用しない。 ・空白セルもあり、文字列の完全一致のみ個数としてカウント。 ・列の数はだんだん増えてくるので、列数は増えても大丈夫なやり方の方がいいです。 COUNTIFで重複個数を出すと、「う」が複数回出てくるので、重複の個数が増えてしまい困っています。 もしかしたら不可能かもしれませんが、どなたかお知恵をお貸しください。 よろしくお願いいたします。

  • エクセルの条件付きでデータの種類をカウントする関数

    エクセルの条件付きで重複データや空白データをカウントせず、種類数をカウントする関数の書き方を教えてください。 C列の5行目から14行目に「品目」が入力され、D列に「売れた数」が入力されているとします。売れていない場合は「売れた数」は空白。品目等のデータがない行もあります。品目には重複しているものもあります。 ここで、G5セルに「売れた品目の種類数」を表示させる関数をどのように書けばよいか教えてください。 SUMPRODUCTやCOUNTIFまたはMATCH関数を使っていろいろ試してみましたが、うまくいきません。

  • excelの複数シートを検索対象にして重複行を抽出する方法

    ある値が重複する行を抽出したいのですが 抽出元データが600,000行近くあり、1sheetに入らず9シート程に分けました。 countifを使おうとしたのですが検索範囲に複数シート指定が出来ず(3D-参照の対象関数ではないようです)、 =COUNTIF('sheet1:sheet9'!$C:$C,C1)としてみたのですが、重複行があっても全て#VALUE!となってしまうので機能できていないようです。 具体的には sheet1~8に下記のようなデータがあり、C列が重複する行を抽出したい。 A列:id、B列:名前、C列:メアド、D列:xx 宜しくお願い致します。

  • エクセルまたはVBAで重複行を削除

    例えば、 A B 1 1 a 2 2 b 3 3 c 4 4 d 5 4 d 6 5 e 7 6 g 8 6 g といった表があるとします。 A列をキーに、昇順にされた一覧表です。 ここで番号が重複している行、この例では4行目と5行目、7行目と8行目がそうです。 こういった重複した行を検索して、行削除したいのですがどんな方法が可能でしょうか? 最終的にはVBAでのイベントになるでしょうが、それ以前にエクセルで前準備などしておくようなことは必要でしょうか? 表自体はかなり膨大な量のデータベースです。 よろしくお願いします。

  • エクセルの関数について質問です

    エクセルの関数について質問です A列に任意の個数「1」が入り、続けて「2」が任意の個数入力されています。B列に任意の文字列が入力されています。(うまく説明できないので、図を参照してください。) A列に「2」が入力されているB列の文字列を、関数でD列に取り出したいのですが、どのような関数でできるでしょうか? 「1」も「2」も個数は変動します。一度「2」が入力された以降の行に「1」が入ることはありません。「1」と「2」以外がA列に入力されることはありません。 色々考えたのですが、どうもうまくいきません。 VBAを使用すればできるとは思うのですが、どうしても関数でなければいけない事情があります。どなたか助けていただけないでしょうか?

  • Excel VBAで・・・

    こんにちわ。VBA初心者ですが、よろしくお願いします。 下記のような表からの値の取得(値の走査)の処理を考えているのですが、どうも1つ1つのセルを比較して取得するやり方しか考えつかなくて、マクロの実行時間が長くなってしまいます。。。 A列  B列   C列   D列 関東 千葉県 千葉市 中央区 関東 東京都       渋谷区 関東       横浜市 東北 福島県 福島市 関西             伏見区 北陸       新潟市 (A列にはエリア、B列には県、C列には市、D列には区が設定されてます。) 入力値がB,C,D列に全て一致した行のA列を返却させたいと思っています。 例えば、神奈川県横浜市港北区と入力した場合、関東を返して欲しいです。 ただし、空白のセルの箇所は見ない(何でも構わない)ため、 東京都新潟市中央区と入力した場合は北陸を返して欲しいのです。 私が思いつくのは、県を比較して、一致or空白なら次の列(市の比較)へ行き、不一致なら次の行で同じ処理を行うやり方しか思いつきません・・・ 1つ1つの比較以外に何かやり方はございますでしょうか? ExcelのFind関数などの利用も考えたのですが、空白の場合にうまく動かないので。。。 宜しければアドバイスをお願いします。

専門家に質問してみよう