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

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

kagakusukiの回答

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

>A列の3の行(Excelでいう4行目)でいうと、D列「-29600」とH列「29600」は異なるのに、青い色がつくようです。ただ青や赤の色付けの判断はここではないようです。  申し訳御座いません。  意図したものではなかったのですが、 >F列の日付は、9/25が2行あるため、ここで判断しているようです というVBAになってしまっておりました。  取り急ぎ、D列とH列の値が異なっていても赤や青や緑の色が付くという点だけは解消したVBAを御伝えしておきます。  但し、これに関しましても、日付が最終日でD列とH列の値が同じになっている行が複数ある場合には、色変わりの行が複数生じてしまいます。 Sub QNo924060_Excel_VBA_2列を比較し同番号行色付け() Const CodeName = "コード" '「コード」を入力する列の項目名 Const DateName = "日付け" '「日付け」を入力する列の項目名 Const FlagName = "ステータス" '「フラグ」を入力する列の項目名 Const MoneyName1 = "販売額A" '「金額その1」を入力する列の項目名 Const MoneyName2 = "販売額B" '「金額その2」を入力する列の項目名 Const MatchName = "マッチ" '「金額その1」と「金額その2」が異なっている場合に「NO」を入力する列の項目名 Const Flag0 = "NO" '「金額その1」と「金額その2」が異なっている場合に「マッチ」の列に入力されている値 Const Flag1 = "good" '「フラグ」(ステータス)を入力する列に入力されているフラグ用の文字列その1(半角小文字) Const Flag2 = "bad" '「フラグ」(ステータス)を入力する列に入力されているフラグ用の文字列その2(半角小文字) Dim ItemRow As Long, LastRow As Long, FirstColumn As Long, LastColumn As Long _ , CodeColumn As Long, DateColumn As Long, FlagColumn As Long _ , MoneyColumn1 As Long, MoneyColumn2 As Long, MatchColumn As Long _ , myColor As Long, i As Long, tempArray As Variant, buf As Variant For i = 1 To 9 If WorksheetFunction.CountIf(Columns(i), "*?") > 0 Then buf = WorksheetFunction.Match("*?", Columns(i), 0) If buf > ItemRow Then ItemRow = buf End If Next i If ItemRow = 0 Then MsgBox "項目名が入力されている行を見つける事が出来ませんでした。" _ & vbCrLf & "マクロを終了します。", vbExclamation, "項目欄不明" Exit Sub End If tempArray = Array(CodeName, DateName, FlagName, MoneyName1, MoneyName2, MatchName) For i = 0 To 5 If WorksheetFunction.CountIf(Rows(ItemRow), tempArray(i)) = 0 Then MsgBox "「" & tempArray(i) & "」という項目名が入力されている列が見つかりません。" _ & vbCrLf & "マクロを終了します。", vbExclamation, "項目列不明" Exit Sub Else buf = WorksheetFunction.Match(tempArray(i), Rows(ItemRow), 0) Select Case i Case 0 CodeColumn = buf Case 1 DateColumn = buf Case 2 FlagColumn = buf Case 3 MoneyColumn1 = buf Case 4 MoneyColumn2 = buf Case 5 MatchColumn = buf End Select End If Next i FirstColumn = WorksheetFunction.Match("*?", Rows(ItemRow), 0) LastColumn = Cells(ItemRow, Columns.Count).End(xlToLeft).column LastRow = Cells(Rows.Count, CodeColumn).End(xlUp).row If LastRow <= ItemRow Then MsgBox "処理すべきデータが見当たりませんません。" & vbCrLf _ & "マクロを終了します。", vbExclamation, "データ無し" Exit Sub End If Application.ScreenUpdating = False For i = ItemRow + 1 To LastRow If Cells(i, CodeColumn).Value <> "" _ And TypeName(Cells(i, DateColumn).Value) = "Date" _ And TypeName(Cells(i, MoneyColumn1).Value) = "Double" _ And TypeName(Cells(i, MoneyColumn2).Value) = "Double" Then If Cells(i, MoneyColumn1).Value = Cells(i, MoneyColumn2).Value Then If Cells(i, MatchColumn).Value = Flag0 Then Cells(i, MatchColumn).ClearContents ElseIf Cells(i, MatchColumn).Value <> Flag0 Then Cells(i, MatchColumn).Value = Flag0 End If End If Next i For i = ItemRow + 1 To LastRow myColor = RGB(255, 255, 128) If Cells(i, CodeColumn).Value <> "" Then If WorksheetFunction.CountIfs(Columns(MatchColumn), "<>" & Flag0 _ , Columns(CodeColumn), Cells(i, CodeColumn).Value _ , Columns(MoneyColumn1), "<" & 9E+307 _ , Columns(MoneyColumn2), "<" & 9E+307 _ , Columns(DateColumn), "<9999/12/31") > 0 Then If Cells(i, MatchColumn).Value <> Flag0 _ And TypeName(Cells(i, DateColumn).Value) = "Date" _ And TypeName(Cells(i, MoneyColumn1).Value) = "Double" _ And TypeName(Cells(i, MoneyColumn2).Value) = "Double" _ And WorksheetFunction.CountIfs(Columns(MatchColumn), "<>" & Flag0 _ , Columns(CodeColumn), Cells(i, CodeColumn).Value _ , Columns(DateColumn), ">" & Cells(i, DateColumn).Value) = 0 Then Select Case StrConv(Cells(i, FlagColumn).Value, vbLowerCase + vbNarrow) Case Flag1 myColor = RGB(128, 128, 255) Case Flag2 myColor = RGB(255, 128, 128) Case Else myColor = RGB(128, 255, 128) End Select End If With Range(Cells(i, FirstColumn), Cells(i, LastColumn)).Interior .Pattern = xlSolid .PatternColorIndex = xlAutomatic .Color = myColor .TintAndShade = 0 .PatternTintAndShade = 0 End With End If End If Next i Application.ScreenUpdating = True End Sub

ketae
質問者

お礼

ありがとうございます。助かります。

関連する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列使えないようなら幾つかに分割しても構いません。 ご存知の方がおられましたらよろしくお願いします!