• ベストアンサー

Excel VBAでデータを自動処理したい(2)

Excelで大量のデータ処理をしなくてはならないのですが、以下の処理をExcel VBAで自動処理できないでしょうか?どなたかお知恵をお貸しください。 別シートに参照リストと未完成リストがあります。参照リストのA列のデータの並びと未完成リストのA列の並びを同じくして、未完成リストを完成させます。参照リストのA列の並びはこんな風です。1 2 3 3 5 6 7 8 8 10 ・・・(データは昇順ですが必ずしも連番ではなく、同じデータが並ぶこともあります。) そして未完成リストの方は、1 2 3 4 5 7 8 10 ・・・といった風です。未完成リストのA列は1 2 3 3 4 5 7 8 8 10・・・という風にしたいのです。つまり参照リストにあっても、未完成リストにないデータは無視します。(上の例では、6です。)参照リストになくて、未完成リストにあるデータはそのまま残します。(上の例では、4です。)両方に共通のデータで参照リストのようにデータが重複しているときは、未完成リストの方に重複している分だけ行を挿入し、上のデータをコピーします。(上の例では、3と8です。)この処理を例えば、それぞれのA列を比較し、お互い共通していないデータ行をそれぞれのリスト上で不可視にし、そのあと、参照リストのA列のデータを参考に重複してるデータを見つけたら、未完成リストの方に重複している分だけ自動に行を挿入し、上のデータをコピーして、参照リストと未完成リストの共通のデータを同じならびにしたいのです。(このあと、参照リストのB,C,Dのデータを未完成リストにコピーするので、未完成リストにしかないA列のデータは、不可視にしておいて、B,C,Dのデータをコピーするときに行がずれないようにしたいのです。) 以上(1)、(2)の処理を自動にさせるためのVBAが分かる方がいらっしゃいましたら、是非ご教授お願いいたします。

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

  • ベストアンサー
  • nishi6
  • ベストアンサー率67% (869/1280)
回答No.5

充実した昼休みでした! ***追加A*** とコメントがある行はSheet4作成用です。 ***追加B*** はSheet1で無視したデータの先頭セルを赤にします。(記入されていた、未完成リストNo.1上でこれらのデータに赤い色をつける・・・は参照リストを対象にしました) ***追加AB*** は両方に必要な行です。コメント行もありますが。 前回は未完成リストより大きい番号の参照リストデータは無視していましたが、処理対象とするためWhile、Wendを追加しています。 試して見て下さい。うまくいくといいですね。では。 Public Sub KanseiList() Dim rg1, rg2, rg3 As Range '基準とするセル Dim rg4 As Range '基準とするセル ***追加A*** Dim cot1 As Long '参照リストカウンタ Dim cot2 As Long '未完成リストカウンタ Dim cot3 As Long '完成リストカウンタ Dim cot4 As Long '無視リストカウンタ ***追加A*** ' Const copyCol = 3 'コピーする列数(0から) Dim cl As Integer '列カウンタ ' Set rg1 = Worksheets("Sheet1").Range("A1") Set rg2 = Worksheets("Sheet2").Range("A1") Set rg3 = Worksheets("Sheet3").Range("A1") Set rg4 = Worksheets("Sheet4").Range("A1") '***追加A*** Worksheets("Sheet3").UsedRange.Clear Worksheets("Sheet4").UsedRange.Clear '***追加A*** ' '前回赤にしたセルを元に戻しておく(再処理への備え) '***追加B*** Worksheets("Sheet1").Range("A:A").Interior.ColorIndex = xlNone '***追加B*** ' With rg2 While .Offset(cot2, 0) <> "" Select Case True Case .Offset(cot2, 0) = rg1.Offset(cot1, 0) '参照リストと未完成リストが一致 While .Offset(cot2, 0) = rg1.Offset(cot1, 0) For cl = 0 To copyCol '参照リストのAからD列をコピーする rg3.Offset(cot3, cl) = rg1.Offset(cot1, cl) Next cot1 = cot1 + 1 '参照リストを更に調べる cot3 = cot3 + 1 Wend cot2 = cot2 + 1 Case rg1.Offset(cot1, 0) <> "" And .Offset(cot2, 0) < rg1.Offset(cot1, 0) '未完成リストしかない(参照リストはある) While rg2.Offset(cot2, 0) <> "" And .Offset(cot2, 0) < rg1.Offset(cot1, 0) rg3.Offset(cot3, 0) = .Offset(cot2, 0) cot2 = cot2 + 1 '未完成リストを更に調べる cot3 = cot3 + 1 Wend Case rg1.Offset(cot1, 0) = "" '未完成リストしかない(参照リストがない) rg3.Offset(cot3, 0) = .Offset(cot2, 0) cot2 = cot2 + 1 cot3 = cot3 + 1 Case .Offset(cot2, 0) > rg1.Offset(cot1, 0) '参照リストしかない For cl = 0 To copyCol '***追加A*** rg4.Offset(cot4, cl) = rg1.Offset(cot1, cl) '***追加A*** Next '***追加A*** '色(赤色=3)をつける ***追加B*** rg1.Offset(cot1, 0).Interior.ColorIndex = 3 '***追加B*** cot4 = cot4 + 1 '***追加A*** cot1 = cot1 + 1 End Select Wend '参照リストにまだデータがある場合(基準とした未完成リストはデータがなくなった) ***追加AB*** While rg1.Offset(cot1, 0) <> "" '***追加AB*** For cl = 0 To copyCol '***追加A*** rg4.Offset(cot4, cl) = rg1.Offset(cot1, cl) '***追加A*** Next '***追加A*** '色(赤色=3)をつける ***追加B*** rg1.Offset(cot1, 0).Interior.ColorIndex = 3 '***追加B*** cot4 = cot4 + 1 '***追加AB*** cot1 = cot1 + 1 '***追加AB*** Wend '***追加AB*** End With End Sub

kiroro302
質問者

お礼

nishi6さん、お昼休みの貴重なお時間を割いてまで、私どものわがままな申し出を聞いてくださり、何とお礼を申し上げればよいか分かりません。しかも2通りのプログラムをこんな短時間で作られてしまうなんて、社員一同驚愕しております。先にご回答くださったapril21さんもnishi6さんも何て素晴らしい技術をお持ちなんでしょう!!うらやましい限りでございます。このプログラムはまさに鬼に金棒です。本当に何から何までお世話になり、ありがとうございました。今回のことで私は真剣にプログラミングに取り組んでみようと強く思うようになりました。nishi6さんもapril21さんも私に新たな分野に挑戦するきっかけをくださいました。このことは私の人生にとって大きな意味を持つように思います。昼間nishi6さんのご回答を会社で読んだのですが、午後私は出かける予定があり、プログラムの実行が出来ませんでしたので、明日早速やってみようと思っております。とってもわくわくしております。本当にどうもありがとうございました。

その他の回答 (4)

  • april21
  • ベストアンサー率42% (91/216)
回答No.4

sheet1のデータ、sheet2のデータ、sheet3のデータA列をそのまま使いたいのであれば下記のように書き換えてsheet4のA列に =Sheet2!A1&"は未完成リストで"&COUNTIF(参照リスト,Sheet2!A1)&"件"&IF(COUNTIF(参照リスト,Sheet2!A1)=0,"シート2のみ","") 適当に変更してください。

  • april21
  • ベストアンサー率42% (91/216)
回答No.3

>どのデータが無視されたものなのか後で分かるように nishi6さんが忙しい間、下記数式でどのデータが無視されたものなのか調べてみては? A列に参照リスト(データの範囲に参照リストと名前を定義します) B列に未完成リスト(データの範囲に未完成リストと名前を定義します) 名前の定義の方法は「Excel VBAでデータを自動処理したい」に書いたので省きます。 ■C1など適当なセルに↓の数式をコピーして貼り付けます。 貼り付けたものをコピーしてB列と同数のセルを選択して貼り付けます。 =B1&"は未完成リストで "&COUNTIF(参照リスト,B1)&"件"&IF(COUNTIF(参照リスト,B1)=0,"Bデータのみ","") ■↑と同じく貼り付け =A1&"は参照リストで "&COUNTIF(未完成リスト,A1)&"件"&IF(COUNTIF(未完成リスト,A1)=0,"Aデータのみ","") ↑の数式で「4は未完成リストで0件Bデータのみ」 「6は参照リストで0件Aデータのみ」というように表示されるばすです。 ◎ここからコピーして直貼りするとセルの高さが変になるのでメモ帳とかに貼り付けてコピーしなおしてセルに。 nishi6さん(。・_・。)ノがんばってねぇ~♪ 慣れなれしいすぎ バキッ!☆/(x_x)ごめ

kiroro302
質問者

お礼

april21さん、前回の質問に引き続きこちらの方もご回答くださりありがとうございます。数式だけでもこのようなことが出来るのですね。ご参考にさせていただきます。

  • nishi6
  • ベストアンサー率67% (869/1280)
回答No.2

過分なお言葉恐縮しています。皆さんのお役に立ててうれしく思います。追記の件ですが了解しました。何行か追加すれば可能と思います。ただ、明日(25日)はサボリの時間がもてそうにないので1日程度お待ちください。では皆さんがんばって下さい。

kiroro302
質問者

お礼

nishi6さん、本当ですか?お忙しい中、お引き受けくださるとは!!前回のご回答に対するお礼を申し上げたことで、かえってnishi6さんに、余計な負担をおかけしてしまったようで恐縮しております。申し訳ありません。本当にお時間があるとき、気が向いたときで結構なのですよ。どうぞ無理をしないでくださいませ。

  • nishi6
  • ベストアンサー率67% (869/1280)
回答No.1

何度か読んでやりたいこと(かな?)を作ってみました。主旨を汲んでいなければお許しを。 参照リスト、未完成リスト、未完成リストの完成版が必要とお思いますので、それぞれSheet1,Sheet2,Sheet3に 対応して作りました。また、未完成リストの完成後フィルタを使ったりしてのコピー作業があるようなのでそれも組み込んでみました。コピーしたい列数-1をcopyColにセットします。私見ですがVBAで対応する場合は手作業を極力排除した方がいいと思います。質問ではA列の最後がどのようになっているか想像できませんでしたので、参照リスト個数>=<未完成リスト個数の3パターンに対応しています。(つもりです) Public Sub KanseiList() Dim rg1, rg2, rg3 As Range '基準とするセル Dim cot1 As Long '参照リストカウンタ Dim cot2 As Long '未完成リストカウンタ Dim cot3 As Long '完成リストカウンタ ' Const copyCol = 3 'コピーする列数(0から) Dim cl As Integer '列カウンタ ' Set rg1 = Worksheets("Sheet1").Range("A1") '参照リスト Set rg2 = Worksheets("Sheet2").Range("A1") '未完成リスト Set rg3 = Worksheets("Sheet3").Range("A1") '未完成リスト完成版 Worksheets("Sheet3").UsedRange.Clear ' With rg2 '未完成リストを順に調べる While .Offset(cot2, 0) <> "" Select Case True Case .Offset(cot2, 0) = rg1.Offset(cot1, 0) '参照リストと未完成リストが一致 While .Offset(cot2, 0) = rg1.Offset(cot1, 0) For cl = 0 To copyCol '参照リストのAからD列をコピーする rg3.Offset(cot3, cl) = rg1.Offset(cot1, cl) Next cot1 = cot1 + 1 '参照リストを更に調べる cot3 = cot3 + 1 Wend cot2 = cot2 + 1 Case rg1.Offset(cot1, 0) <> "" And .Offset(cot2, 0) < rg1.Offset(cot1, 0) '未完成リストしかない(参照リストはある) While rg2.Offset(cot2, 0) <> "" And .Offset(cot2, 0) < rg1.Offset(cot1, 0) rg3.Offset(cot3, 0) = .Offset(cot2, 0) cot2 = cot2 + 1 '未完成リストを更に調べる cot3 = cot3 + 1 Wend Case rg1.Offset(cot1, 0) = "" '未完成リストしかない(参照リストがない) rg3.Offset(cot3, 0) = .Offset(cot2, 0) cot2 = cot2 + 1 cot3 = cot3 + 1 Case .Offset(cot2, 0) > rg1.Offset(cot1, 0) '参照リストしかない cot1 = cot1 + 1 End Select Wend End With End Sub

kiroro302
質問者

お礼

nishi6さん、早々のご回答ありがとうございます。早速やってみました。大成功でした。会社の皆で大喝采でした。本当にありがとうございます。今日は会社の仲間たちの顔が皆晴れやかで社内がパッと明るくなりました。ところでnishi6さん、ご相談のですが、こんなすばらしいプログラムを提供していただいて、恐縮なのですが、このプログラムに以下の機能を追加することは可能でしょうか?参照リスト(sheet1のデータ)にあって、未完成リストNo.1(sheet2のデータ)に無いデータは、未完成リスト完成版(sheet3)には反映されず無視されますよね。実はこの無視されたデータは後で、別の未完成リストNo.2と照し合せる必要があるのです。そこで、どのデータが無視されたものなのか後で分かるように,未完成リストNo.1上でこれらのデータに赤い色をつけるとか、またこのデータだけをsheet4に抽出する等(どちらか1つでいいのですが・・・)出来ますでしょうか?これが出来ると本当に鬼に金棒なのですが・・・。でもこのプログラムでも私たちにとっては本当に大助かりでございますので、もしnishi6さんが気が向いたら、ご返答いただければ・・・と図々しくもお願いした次第です。でもどうか気になさらないでくださいませ。ご迷惑でしたら、どうぞ無視されて結構です。まずは社員一同お礼心よりお礼申し上げます。では・・・。

関連するQ&A

  • Excel VBAでデータを自動処理したい

    Excelで大量のデータ処理をしなくてはならないのですが、以下の処理をExcel VBAで自動処理できないでしょうか? どなたかお知恵をお貸しください。 (1)A、B、C列からなるリストがあります。A,B列にはそれぞれオートフィルタが設定してあり、C列は空白です。A列、B列にそれぞれ条件を設定し、抽出したデータのC列(空白)に特定のデータを入力します。A列、B列2つの条件の組み合わせが100通りくらいあり、現在手動でオートフィルタを設定し、C列にデータを入力しております。例えばA,B列の条件の組み合わせと、それに対応するC列に入力するデータを表にしたテーブルを別に作り、A,B列の条件を自動に設定して、抽出し、C列にデータを自動に入力することを、テーブルの一番上の行から最後の行まで繰り返す、というようなことをVBAでExcelにしてもらいたいのです。自分でちゃんと勉強し、調べて、それでも分からなかったらお聞きするというのが筋だと思うのですが、今この仕事に追われて、時間がありません。(ほとんど毎日午前様です。)この仕事が片付いたら、じっくりVBAを勉強したいと思っております。どうぞよろしくお願いいたします。

  • Excel VBA 外部データ(CSV)の自動読込について 

    VBAに関して昨日基本書を読み始めたばかりの初心者です。 業務の効率化が急務であるという手前勝手な都合により、 さっそくの他力本願で失礼とは思いますが 以下のケーススタディについてアウトラインだけでも助言をいただけないでしょうか。 帳票[yyyymmdd].csv ←末尾に年月日 日毎にCSVファイルが存在する A1:A10 B1:B10 C1:C10 の範囲の値を 期間集計.xlsx のそれぞれシート別のyyyymmdd列1行~10行にコピーする sheet1の[yyyymmdd]列1行:10行 ←A1:A10の値 sheet2の[yyyymmdd]列1行:10行 ←B1:B10の値 sheet3の[yyyymmdd]列1行:10行 ←C1:C10の値 過去数年分の日毎帳票を一括で自動処理したいと思い、 マクロの記録機能を使用したのですがどうしてもうまくいきませんでした。 特にわからないポイントが ・CSVファイルを開かずに参照する処理  (Excelで開かずにどうしてセルの範囲を指定できるのかという矛盾が生じてる気はするのですが・・・) ・自動的に帳票[yyyymmdd].csvを昇順に参照する処理 ・それをyyyymmddに対応した列にコピーする処理  以上のVBA処理についての助言をいただけますようよろしくお願いします。 Excelのバージョンは2007です。

  • エクセルで処理を繰り返す。Excel VBAで質問です。

    次のようなマクロを考えています。 “シート1”で県名をリストから選ぶと“シート2”のデータ(文字) を“シート3”に入れていく、というものです。 “シート1” C11セルがリストになっていて県名が選べる “シート2” A列に県名 1 東京都 ああああああ 2 dddd 3 4 てててててて 5 ggggggggggg 6 神奈川 つつつつつつ 7 qqqqqqqqqqqq 8 かかかかかかか 9 aaaaaaa B列にデータが文字列であります。A列では空白になっていますが、 B列では1から5行目までデータがあります(東京都の場合)。ただ 3行目のように空白になってい場合もあります。 ここでやりたいのは、例えばシート1のリストが東京都の場合、 ・シート2のA列に東京都を見つけて、 ・シート2のA列が次の県名になるまでB列のデータを ・シート3のB17から下にコピーする というものです。分からず困っていますがどなたか教えていただけないでしょうか。 ※画面の設定がうまくいかないんですが、A列が県名、それ以外はB列に入っています。

  • エクセルVBAで重複データの削除

    A列、B列、C列・・・とデータが入っていて、B~D列の5行目から10行目が関連の有るデータのかたまりとします。 C~D列の全てのデータが重複している場合に、最初のほうのデータ(行番号が小さいほう)を残すものとして、重複データを削除したいのです。 削除するときは、 B~Dの範囲で削除する。A列等は削除しない。 削除したらデータは上に詰める。 データはソートしない。 ということをやりたいのですが、簡単に出来ますでしょうか? 良く覚えていないのですが、ネット上で色々探してみても、必ずソートしている気がしたので、ソートしない方法が知りたいのですが。

  • エクセルのセル内重複データの処理について

    下記のような雪だるま式に増え続けるエクセルの 重複データの処理で困っています。 ただし重複部分を削除したデータの文字数は 一定ではありません。 A列 あいうえお あいうえおかきくけこ あいうえおかきくけこさしすせそ    ・    ・    ↓ あいうえお かきくけこ さしすせそ    ・    ・ 以上のように処理できないでしょうか。 よろしくご回答をお願いします。

  • EXCELで分かれたシート間の同一データ行を自動削除して結合したい

    EXCELで、シート1、シート2に分かれたデータがあります。 それぞれのシート間でC列~F列の値が重複している行、シート1側のG列の数値がマイナス になっている行を自動で削除してからデータを1つのシートに結合する方法を探しています。 条件は、シート1側の重複データ行のみを削除し、シート2側のデータが必ず残る方法であ る必要があります。G列のマイナス行を削除するのはシート1側のみです。 シート1がA列~I列、約3万行、シート2がA列~K列、約1千行くらいです。 シート2側のみJ列~K列(数値データが入っています)が存在しますが、シート1側は空欄です。 列の数は変わりませんが、行数が都度変動しますのでマクロでコピー先のセル位置を決め打ちする 事が出来ません。 1つのシート上で重複するデータを削除する方法は見つける事が出来たのですが、残す方のデータ が指定出来ないのと、複数のシート上の重複データを削除する方法が見つかりませんでした。 何か良い方法がありましたら、ご教授下さい。

  • エクセルVBA 重複データから1種類ずつ抽出

    いつもお世話になります。 5万行のエクセルデータで、A列に20種類のデータが重複しています。 このデータを、別シートのA1~A20に1種類ずつコピーしたいのです。 オートフィルタ→フィルタオプション→重複するレコードは無視するでチャレンジしてみたのですが、5万行だとデータ量の関係で時間がかかりすぎるので、VBAでもっと短時間で出来ないかと思い、投稿させていただきました。 よろしくお願いいたします。

  • Excel 2007 マクロ 同列のデータの重複チェック

    Excel 2007 マクロ 同列のデータの重複チェック A列で重複しているデータをチェックします。 重複しているデータについて、B列にフラグをつけます。 フラグはどの行とどの行が重複しているのかわかるようにしたいです。 そのため重複している行同士ごとにフラグをつけます。 上記の内容はマクロで実現できるのでしょうか。 元データと完成形の画像を添付します。 よろしくお願いします。

  • エクセル 複数シートのデータをまとめたい

    他の質問を参照したのですが、できないのでお願いします。 新しいシート(ブックでもいいです)に次のデータを ひとまとめにしたい。 外国語テストのデータです。 (1)ひとつのブックにシートが十枚ある (2)列a2~h2 行2~29までデータがある。 (3)列a番号(a2が1、a29が28)  列b空欄  列c日本語  列d外国語 この構造を倍にしているのでa~hにデータが並んでいる。 これを、 つまり、8×28のデータが各シートにあるわけですが 【ひとつ】 できればシート1のデータの下 29行目からシート2のデータ、58行目からシート3… というように並べたい。 【ふたつ】 更にできるならa~dの下にe~hを持ってきて 4×56の並びにして 57行目からシート2のデータ…というように並べたい。 データの並びは列a列eの番号順を保持できたらうれしいです。 どうぞよろしくお願い致します。

  • Excel 2007 重複データのチェックについて

    Excel 2007 重複データのチェックについて A列にあるデータ(約100件)で重複している値がある 行についてB列にフラグをつけます。 やりたいことはどの行とどの行が重複しているのかを すぐに分るようにしたいです。 添付画像のように重複している行に番号をつけていくことは可能でしょうか。 番号は1から順番に増えていきます。 自分は下記を考えましたが、これでは重複している行に「重複データ」と入る だけでわかりづらいです。 =IF(COUNTIF($A$2:A2,A2)>1,”重複データ”,”○”) よろしくお願いいたします。

専門家に質問してみよう