• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Excel_VBA 2列を比較し、同番号行色付け)

Excel_VBA 2列を比較し、同番号行色付け

kagakusukiの回答

  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.1

 御質問文にある色分けの条件の説明と、画像に写っている色分けの状況が一致していない様に見えます。  そのため、このままでは質問者様が何をやりたがっておられるのかが解りませんので、何故画像の様な色分けになっているのかを御説明願います。  また、質問文に書かれている御説明内容だけでは、質問者様の御要望を実現するために必要となる情報が不足しておりますので、それも併せて御補足して頂く様御願いします。 >1.「D」と「H」列(つまり2販売額)の数字が合致している列をみつけること との事ですが、A列の「番号」が2と6の行も2販売額の数字が合致しているにもかかわらず、特に他と異なる色が付けられている訳ではないのは何故なのですか?  もしかしますと、条件1、条件2、条件3を同時に満たしている行のみGOODは青系の色をつけたい、BADは赤系の色をセルにつけたいという事なのでしょうか?  しかしそうだとすると、2販売額の数字が合致していて、ステータスがGOODとなっているものの内で、日付が最新となっている行はA列の「番号」が6の行であるのにもかかわらず、「番号」が6の行には特に他と異なる色が付けられている訳ではなく、日付が最新ではない「番号」が4の行に色が着いているのは何故なのですか?  もしかしますと、C列のコードが同じものの中で条件1と条件2を同時に満たしている行を探し出して、その行に対してのみ条件3に従った色分けを行うという事なのでしょうか? (C列のコードが同じものの中で条件1を満たしている行で、ステータスがGOODとなっているものとBADとなっているものが両方ある場合でも、例えばBADの方がGOODよりも日付が新しければ、BADの方のもの1行のみに色を付け、GOODの方の行には色を付けない) >4. その最新日付けの行にあるコードと同じ「コード」(C列)を探して、同じなら黄色系の色をつけたい。 との事ですが、C列のコードが同じものの中で条件1を満たしている行が存在していないコードの行に関しては何も色を付けない方が良いと考えれば宜しいのでしょうか? >・黄色をつける行のデータの法則は不明(重要ではないので気にしていない) とは、どういう事なのでしょうか?  「C列のコードが同じものの中で条件1を満たしている行が存在している場合にのみ黄色を付ける」のではないという事なのですか?  法則が不明なのでは色を黄色を付ける行と付けない行を区別する事が出来ませんので、どの様な条件を満たしている行に対してのみ黄色を付けるのかを御説明願います。 >・横幅(色をつける列の右端までの項目数[列数])は吐き出さされるExcelシートによってばらばら。 というだけではどこまで色を付ける様にすれば良いのか判りません。  「番号」~「ステータス」等の各項目名が入力されて行において、何らかの値が入力されている最終列の所まで色を付ければ宜しいのでしょうか?  そうなりますと、項目名が入力されている行が何行目になっているのかが判らなければ、項目名が入力されている最終列を求める事が出来ないという事になりますが、各項目名が入力されている行は、画像に写っている例と同様に、必ず1行目が項目名の行になっているのでしょうか?  それとも項目名が入力されている行の行番号すらも未定で、それすらも自動で見つけ出せという事なのでしょうか?  また、色を付け始めるもっとも左端の列は必ずA列からであると考えておけば宜しいのでしょうか?  それとも項目名が入力されている最初の列すらも未定で、それすらも自動で見つけ出せという事なのでしょうか?  もし、「項目名が入力されている行が何行目になっているのか」という事と「項目名が入力されている最初の列」という事の両方を自動的に検出しなければならない場合において、「表の中で最も右端の列よりも更に右にある列」の中に、「項目名が入力されている行よりも下の行」に文字列データが入力されているセルがもしも存在している場合には、自動的に検出する事が困難になりますが、表よりも右の列で尚且つ「項目名が入力されている行よりも下の行」のセルに文字列データが入力されていない事は保障されているのでしょうか? >ステータス行は右端とは限らない >つまり右端をステータス列とみなすと誤動作する。 との事ですが、ステータス列の列番号すら自動で検出せよという事なのでしょうか?  そうしますと、ステータス列の項目名を基準にして検出するより他にはありませんが、ステータス列の項目名は必ず「ステータス」となっている事が保障されているのでしょうか?  また、各行のデータが御質問の条件を満たしているのか否かを判定するためには、「ステータス列」以外にも、「コード」、「販売額A」、「日付け」、「販売額B」が入力されている列が何列であるのかという情報(列番号の情報)も必要不可欠ですが、これらの列は画像に写っている通りの列に固定されているのでしょうか?  もし、それすらも固定ではなく、自動的に列番号を検出しなければならないとしますと、「ステータス」の場合と同様に、各項目名を基準にして検出するより他にはありませんが、各列の項目名は必ず画像に写っている項目名通りのものとなっている事が保障されているのでしょうか?  兎に角、列や行等に関して不明な点が多過ぎますので、最低限、上記の補足要求程度の事は明確にして頂かなければ、情報不足で回答する事が出来ません。  また、当然の事ながら、上記の補足要求に対する質問者様の御返答内容の状況次第では、更に確認しなければならない点が増える恐れもありますし、場合によっては質問者様の御要望を実現する事が不可能である事が明らかとなる恐れもあります。

ketae
質問者

お礼

回答し忘れてました。 >「ステータス列」以外にも、「コード」、「販売額A」、「日付け」、「販売額B」が入力されている列が何列であるのかという情報(列番号の情報)も必要不可欠ですが、 画像に写っている列で、考えていただいてけっこうです。 よろしくお願いします。

ketae
質問者

補足

お世話になります。 「A列の「番号」が2と6の行も2販売額の数字が合致しているにもかかわらず」 のところですが、「F」列をみるとここの行の日付けより後ろ(最新)の日付けが存在するため、最新日付けの4と8の行を、GOODとBADの処理対象にしております。 最新行を見るだけなら、フィルタリングをすればいいのですが、別の人間がデータベースがから吐き出された履歴をみたいとき、最新日付けではない行があることが視覚的にわかるように黄色をつけています。 コードとは画像の横幅が小さくなるので省きましたが、商品コードと考えていただければと思います。 「商品コード1158で、DとH列が合致し、F列の日付けが最新のもの」が4です。 「商品コード2034で、DとH列が合致し、F列の日付けが最新のもの」が8です。 やりたいことは 「DとH列が合致し、F列の日付けが最新のものを見つけて、右端(下記参照)まで色をつける」…★(1) ここまでができれば実は視覚的にはとっても助かるののです。 「その行の商品コードと同じ商品コードの行に別の色(ここでは黄色)をつける」…★(2) ここにステータスという列(K列)がまだあるので、GOODかBADかで色分け (ここでは薄いブルーかピンク)できたら…★(3) と考えました。 なおステータス(K列)のGOODとBADは、その左(J列以左)のデータがいいとか悪いとかの意味はなく(関係なく)、単なるフラグです。AとB、0と1でもなんでもいいのですが、AとBや0と1だと視覚上紛らわしいので、とりあえず説明しやすくGOODとBADにしただけです。データのステータスではなく、別のデータベースから各行につけられたフラグです。 >C列のコードが同じものの中で条件1を満たしている行が存在している場合にのみ黄色を付ける はい、C列のコードで上の文章中の★(1)と同じコードをもつ行に黄色をつけたいのです。★(1)行とは別の色で色分けをしたいという言い方が正しいでしょうか。 「右端」(横幅)や「行」数については 最終行はA列でEnd(xlUp) 右端の列は1行目でxlToLeft).Column でみつかるデータがぎっしり埋まったデータです。 A列(縦方向)と1行目(横方向)の途中に空白セルはありません。 販売額の列はご推測のとおり吐き出されてくるデータシートによって異なるのですが、現状は(わたしではないDB担当者が)過去にいろんな人がつくったいろんなAcessを用い、比較したい列をAceess上でフィールドをクエリで(「販売額」など[フィール名]がクエリデザイン画面に文字(日本語)で表示されるので)、同じフィールド同士をマウスで紐付けて吐き出しているようです。 そのデータがExcelに吐き出された形でわたしのところにくるのですが、Excelではフィールド名で紐付けできないので、吐き出されたデータの列が違うものが手元にきた場合、自分でVBAエディターで、列の変数(または定数)を修正することになると思います。 現状では、D列とH列の比較という形で図をつくりました。 上の「★(1)」ができるだけでもうれしいのですが。 以上よろしくお願いします。 補足が必要なことがありましたが、またご質問ください。 PS:データ抽出だけならExcelの機能でできるのですが、プレゼン資料用にスクリーンショットを撮る人たちが手作業で毎回違う色をつけているので、統一してしまいたいなと思っています。

関連するQ&A

  • 【Excel VBA】重複行の削除

    はじめまして。 IDの重複を削除し、日付データを横1列にまとめるVBAについてご教示いただけますと幸いです。 ------------------------------------------------------- ▼シート1(データ入力がされているシート)    A   B   C   D   E   F    1   ID 日付 2  1234  1/1  1/6  1/10  1/20   3  1234  2/3  2/20 4  1234  3/2 5  7777  1/10  1/15  1/20 6  7777  2/2   2/12  2/22 7  9876  2/3 ⇓ マクロ起動後 ▼シート2(重複行を削除しまとめたシート)    A   B   C   D   E   F   G   H 1   ID 日付 2  1234  1/1  1/6  1/10  1/20  2/3  2/20  3/2 3  7777  1/10  1/15  1/20  2/2  2/12  2/22 4  9876  2/3 【補足】 列情報  ・A列…ID  ・B-F列…日付(左詰め) ※日付はIDごと月毎に行が変わるため、IDによって複数行存在する場合があります。 ※A列のIDは重複しない場合もあれば、4行以上ある場合があります。 ※シート1のデータはおおよそ1000-5000行です。 ※IDに対して、日付は5つあれば問題ありません。そのためG列以降の日付を削除しても支障はございません。 ------------------------------------------------------ VBAの知識があまりなく、調べて出てきたものをコピペ使用も試みたのですが、 上手く動かす事ができませんでした…。 お力添え頂けますと幸いです…。 Windows10でエクセル2016を使用しております。 何卒宜しくお願いいたします。

  • VBA Excel 特定の記号を含む行で

    Excel VBAにて、質問します。お手数ですが宜しくお願いします。 画像の様に、E列に特定の記号"●"や"▲"含んだ行以外、抽出し 印刷のシート名に貼り付けしたいと思います。 ですが、条件がありまして、その条件とは、InputBoxを使って 抽出したい日付を入力し、入力した日付、時刻までの記号"●"や"▲"以外 を抽出できる様にしたいです。 例えば実行時の日付が8/21日ならば InputBoxに、8/28 20:00と入力したら、入力した日付、時刻までの 記号"●"や"▲"以外を抽出となります。 画像の様に、1行目の見出し名も貼り付けできる様に、VBAを使って できませんでしょうか? ※ 画像ではSheet1のみ載せましたが、 Sheet2とSheet3とSheet4とSheet5とSheet6まで似た内容のデータがあるので シート名を指定して動作できると良いです。 Array("Sheet1","Sheet2","Sheet3","Sheet4","Sheet5","Sheet6")見たいな 感じでできますでしょうか? どの様なコードを書けば良いでしょうか? 御面倒お掛けしますが宜しくお願いします。

  • 2つの表を比較して、重複する行を色づけするマクロ

    下記の様な日付の名前の2つのシートが有るのですが、表2の機種を参照して、B~T列全てが一致する場合、U列チェック欄に○と入力する様なマクロを作成したいのですが、何か良い方法が有りましたらご教授下さい。 マクロコードは簡単なものや定番のものなら読めますが 自分ではあまり書けません。 どなたかよろしくお願いいたします。 (日付シート1)              (日付シート2)  B~T列       U列        B~T列      U列 機種 機番 製造日 チェック     機種 機番 製造日 チェック    A-1  00  0000   ○      A-1  00  0000  ○ A-2  01  0001   ○      A-2  01  0001  ○ A-3  02  0002   ○      A-3  02  0002  ○ A-4  03  0003   ○      A-4  03  0003  ○  A-5  04  0004   ○      A-5  04  0004  ○ B-1  00  0000           C-1  00  0000 B-1  01  0001           C-2  01  0001   B-3  02  0002

  • エクセル2つのブック列の比較 VBAや関数について

    Aと言うブックとBと言うブックがあるとして、 Aのブックは共有ファイルではなく、Zサーバー上にあるエクセルファイルです。 Aのブックに色々な人が行の挿入、商品名の書き換え等をしていて、いつ挿入されたのかが分からないため、VBAや関数を使って調べたいのですが、 Aのブックは10シートあり、サイズ別で行も並べられているため、新しい情報を特定するのが困難です。 BのブックはAと同じシート名を作り、必要箇所だけコピーしているデータです。(オリジナルブック) やりたいことは、Aのブックから探してBのブックに追加されていない情報、一致していない情報があれば、色を付けてわかりやすくするか、Bのブックの新しいシートに結果を出すようなことがしたいのですが、可能でしょうか? AのブックはA列-IC列まであるのですが、必要な部分は全シートB列(商品コード)とE列(商品名)のみです。 Bのブックには同じシート名にして、A列に商品コード、B列に商品名としております。 AのブックのB列、E列を参照して、BのブックのA列、B列になければ、結果を表示したいです。 もし出来る方法があれば、教えてほしいです。 今はシートごとに左右比較して、見ていってるのですが、10シートの中に、行数は2000行くらいあるため、それで半日おわってしまいます。 もし分かるかた、マクロを組める方がいれば教えて頂きたいです。宜しくお願い致します。

  • 【Excel VBA】データの最終行について

    Excel2003を使用しています。 ある一覧表形式のデータSheet1をSheet2に値のみコピーして、このSheet2を“印刷用”として、ページ設定等をして、印刷のみに使用しようと思っています。 Sheet2のI列、J列、K列には数値が入力されていて、I列、J列、K列のデータの最終行の1行下に、それぞれ6行目からデータ最終行までの合計の数式が入力されるよう、コードを追加したのですが、数式は入力されるものの、入力したい行に数式が入力されません。 マクロを実行して、数式が入力された行を見てみると、301行目に入力されていました。 Sheet1は別のシートのデータを数式により表示していて、数式が300行まで入力されているので、Sheet2の元になっているSheet1の影響(?)なのかな~?と…。こういう場合、どうすればいいでしょうか? コードは下記のようになっています。 よろしくお願いします。 ---------------------------------------- Sub 印刷用作成() Dim i As Integer Dim j As Long Sheets("Sheet1").Activate Range("B6:L6", Range("L6").End(xlDown)).Select Selection.Copy Sheets("Sheet2").Select Range("B6").PasteSpecial xlPasteValues Application.CutCopyMode = False For i = 9 To 11 j = Application.Max(j, Cells(65536, i).End(xlUp).Row + 1) Next For i = 9 To 11 Cells(j, i).FormulaR1C1 = "=SUM(R2C[0]:R[-1]C[0])" Next i End Sub

  • VBA Excel 特定の記号を含んだ行

    Excel VBAにて、質問します。お手数ですが宜しくお願いします。 画像の様に、E列に特定の記号"●"や"▲"含んだ行以外、抽出し 印刷のシート名に貼り付けしたいと思います。 ですが、条件がありまして、その条件とは、InputBoxを使って 抽出したい日付を入力し、入力した日付、時刻までの記号"●"や"▲"以外 を抽出できる様にしたいです。 例えば実行時の日付が8/21日ならば InputBoxに、8/28 20:00と入力したら、入力した日付、時刻までの 記号"●"や"▲"以外を抽出となります。 画像の様に、1行目の見出し名も貼り付けできる様に、VBAを使って できませんでしょうか? ※ 画像ではSheet1のみ載せましたが、 Sheet2とSheet3とSheet4とSheet5とSheet6まで似た内容のデータがあるので シート名を指定して動作できると良いです。 Array("Sheet1","Sheet2","Sheet3","Sheet4","Sheet5","Sheet6")見たいな 感じでできますでしょうか? 御面倒お掛けしますが宜しくお願いします。

  • VBA 100行ごとに列を変更してコピーする。

    Winは7、Excelは2013を使用しています。 A列とB列のデータを100行毎に列を変えてコピーしたいと思っています。 (画像参照願います。) それで、別シートにコピペするサンプルコードを見つけたのですが、 同シート内でする様に変更する知識がなく、苦戦しています。 申し訳ありませんが、ご教示願います。 別シートにコピペするサンプルコード Sub データを100行ごとに分割する() Dim シート As Worksheet, 元 As Worksheet '元は元データのあるシート Dim 総行数 As Long, 回数 As Long, i As Long, 開始行 As Long Const コピー行 = 100 Set 元 = ActiveSheet '変数の元をActiveSheetにセットする 総行数 = 元.UsedRange.Rows.Count 回数 = Int(総行数 / コピー行) + IIf(総行数 Mod コピー行 > 0, 1, 0) 開始行 = 1 For i = 1 To 回数 Set シート = Sheets.Add シート.Name = 開始行 & "~" & 開始行 + コピー行 - 1 元.Rows(開始行 & ":" & 開始行 + コピー行 - 1).Copy シート.Range("A1") Columns("A:F").AutoFit 開始行 = 開始行 + コピー行 Next i End Sub

  • 日付と時刻を比較して一致した行を抜き出す。

    【Sheet1】             【Sheet2】     A        B        A         B 1 2008/1/2   00:00      1 2008/1/1   22:00 2 2008/1/2   01:00      2 2008/1/1   23:00 3 2008/1/2   02:00      3 2008/1/2   00:00 4 2008/1/2   02:00      4 2008/1/2   01:00 【Sheet1】のA行セルと【Sheet2】のA行セルの文字列を比較し、 一致しない場合は【Sheet2】のセルを一つずらしA3【一致】するセルと比較するまで ループを続ける。 ※ 上記例の場合だと日付一致は【Sheet1】A1 ⇔ 【Sheet2】A3 一致した時点で一致した【Sheet1】のAセルの隣B列と比較して、 【Sheet1】の日付、時刻が一致した列を検出する。 ※ 最終的に条件が一致して抜き出すのは 結果 : 【Sheet1】のA1行 そんなマクロを作っているのですが、 何かもっと簡潔に作れるやり方ってありますでしょうか? ヒントだけでもいいのでご教授していただけたら幸いです・・。 わかりにくくてすいません; ----------------------------------------------------------------------------------------------------- Dim Com As Integer Dim Com2 As Integer Dim Storage As String Dim i As Long ' Month関数を使う Do Until Month(Cells(i, 1).Value) = 11 For Com = 1 To 100 'Com = 日付 ' 【Sheet1】の指定されたAセルが【Sheet2】の指定されたAセルが一致しているかどうか If CDate(Worksheets(Sheet1).Range("A" & Com)) = CDate(Worksheets(Sheet2).Range("A" & Com)) Then ' 一致すれば【Sheet1】のAセルの文字列をStorage変数に格納 Storage = ActiveCell.Value Else ' Falseの場合、1行改行する ActiveCell.Offset(1, 0).Select End If Next Loop ----------------------------------------------------------------------------------------------------

  • マクロ【シート間での文字列比較及び指定セルに置換】

    いつも大変御世話になります。 【D:\test】フォルダ内に、1つのエクセルファイル(Excel2003)があります。 ・エクセルファイル名は【test.xls】。 ・シート【起動シート】・【マスタ】・【中間マスタデータ】があります。 今回悩んでいるのはシート名【起動シート】内にあるマクロボタンに入れるマクロです。 ★シート【マスタ】には、日々、不定期に作成されるテキストファイルのデータ状態を記録したマスタシートです。 データ状態は記号で入力され、下記の4つになります。 ・サイズのある良いデータの行には【○】 ・サイズのある悪いデータの行には【×】 ・サイズのない0件データの行には【0件】 ・今回作成されなかったデータの行には【-】 シート【マスタ】には、以下のように入力されます。 A B C D E ←列 1 2 テキスト名 1日 2日 3日 4日 5日 3 L2001.txt ○ ○ ○ ○ ○ 4 L2002.txt ○ × ○ ○ ○ 5 L2015.txt ○ ○ ○ × ○ 6 L2101.txt ○ 0件 ○ ○ ○ 7 L2A05.txt ○ ○ ○ - ○ ↑行 B2から右横に日付がふられ、すでに来年分までふられています。 ★シート【中間マスタデータ】には、当日入力分のみのデータ振り分け結果が入力されています。 シート【中間マスタデータ】には、以下のように入力されます。 A B C D E ←列 1 2 GOOD 0_FILE BAD 3 L2001_20081206.txt L2015_20081206.txt L2A05_20081206.txt 4 L2002_20081206.txt L2101_20081206.txt ↑行 GOODの列・・・サイズのある良いデータの記号【○】に該当 0_FILEの列・・・・サイズのある悪いデータの記号【×】に該当 BADの列・・・サイズのない0件データの記号【0件】に該当 この【_20081206】は12月6日は12月6日分のデータという意味で、日によって日付でリネイムされています。 上図のデータを使用すると、例えば、6日なら【中間マスタデータ】を参照し、【マスタ】に入力すると以下のようになります。 A B C D E ←列 1 2 テキスト名 1日 2日 3日 4日 5日 6日 3 L2001.txt ○ ○ ○ ○ ○ ○ 4 L2002.txt ○ × ○ ○ ○ ○ 5 L2015.txt ○ ○ ○ × ○ × 6 L2101.txt ○ 0件 ○ ○ ○ × 7 L2A05.txt ○ ○ ○ - ○ 0件 ↑行 3つの記号を一瞬で入力し、入力列は一番右端の空行の列、【今回作成されなかったデータの記号【-】】は残った空セルに入力。 これを一気に入力可能なマクロコードがどうしても書けません。 シート間の文字列比較をして、記号に変換する。 何かサンプルコードとかご提示いただけると助かります。 宜しくお願いいたします。

  • エクセルデータの列と行を入れ替える方法をご存知の方、教えて下さい。

    エクセルデータの列と行を入れ替える方法をご存知の方、教えて下さい。 今、A列(1行目から1,000行目位まで)に日付、B~F列にそれぞれ数値のデータを入れていますが、それを1行目に日付、2~6行目に数値のデータと言うように、いわゆるタテとヨコを入れ替えたいのですが、何か良い方法は無いでしょうか。 1,000日分位のデータがあるため、手で打ち換えるのもちょっと・・・ データは日付列が1列、データ列が5列、数値のみで数式などは入っていませんし、セル結合もしていません。単純に6列×1,000行位のエクセルデータです。 また、入れ替えるのでなく別のシートに入力し直す方法でも、同じシートの未使用スペースにコピーアンドペーストする方法でも構いませんし、(エクセルが何列使えるか知りませんが)1,000列使えないようなら幾つかに分割しても構いません。 ご存知の方がおられましたらよろしくお願いします!