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

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

このQ&Aのポイント
  • Excel_VBAを使用して、2つの列を比較し、同じ番号の行に色を付けたいと考えています。
  • 色付けする際には、特定の条件を満たす行に特定の色を付けたいです。
  • また、最新の日付の行にある特定のコードと同じコードの行にも色を付けたいです。

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

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

 それで、 >実は1行目のタイトル行は、異なる2つのデータを、アクセスファイルで吐き出す人によって(処理のアクセスファイルが複数ある)、SQLやクエリーで名称を変えて出している場合があるので(複数データ処理アクセスファイルあり、それぞれ過去につくった人が異なる)名称が一定しません。 という事は、御質問の例における「マッチ」、「コード」、「日付」、「販売額A」、「販売額B」、「ステータス」に対応する、項目名が別のファイルでは何という項目名になっているのかは不明ということになりますし、 >販売額の列はご推測のとおり吐き出されてくるデータシートによって異なるのですが という事は、御質問の例における「マッチ」、「コード」、「日付」、「販売額A」、「販売額B」、「ステータス」に対応するデータが、別のファイルでは異なる列に入力されているという事になりますので、項目名も列番号も不明である以上、上記の各項目に対応するデータがどの列に入力されているのかという事を、パソコンという機械に自動的に見分けさせる事は不可能な事という事になります。  しかしそうなりますと、色分けを開始する前に、御質問の例における「マッチ」、「コード」、「日付」、「販売額A」、「販売額B」、「ステータス」に対応するデータがそれぞれどの列に入力されているのかを、一々手動で指定してやるか、或は、元データとするためのExcelBook上での列を、御質問の画像の例と同様の列になる様に並べ替えてから本件のVBAでの処理を行うかのどちらかになるかと思われますが、どちらの場合であっても結構面倒な事ではないでしょうか?  一応、マクロを起動させた際に、最初にInputBoxメソッドを使って、処理に必要となる各データがそれぞれどの列に入力されているのかという事を指定する事が出来る様なVBAとする事もおそらく可能だと思われますが、その様にした方が宜しいのでしょうか?  後それから、 >同じコードの最終行(ここでは4や8)が最新の日付であるデータの吐き出し方は決まっている(動かない)ため、わたしの添付画像のような色付け(それぞれのコードの「最新日の行を1行だけ」)黄色ではない色にして目立たせたかったのでした。 という事は、もしかしますと、(同じコードのデータの中で2つの販売額が一致しているものが1つでも存在しているという条件を満たしている場合には、)万が一、その「同じコードの中での最終行」のデータが2つの販売額が一致していなかったり、同じコードのデータの中で日付が最新のものでなかったりした場合であっても、兎に角「同じコードの中での最終行」でさえあればその1行のみに別な色を付ければ良いという事なのでしょうか?

ketae
質問者

お礼

ありがとうございます。 この質問スレ自体は、CSVデータをExcelで起動した際に、見栄えとして決まった行に色をつけるというだけのものでした。 Excelではデータ(数値)を管理をしておらず、DBからCSVが吐き出されるだけで、ここではデータの確からしさよりも、目的の行の列に色をつけたいというだけでした。 ただ、データ(NOの判定フラグ)のたしからしさについては、人間の目には醜いため、ここは該当部署にリクエストを出してDBチームに今後改善してもらう予定です。 ちょっとやりたいことから幅が増えてしまったため、一度整理してまた質問をたてたいと思います。 いつもお世話になります。 (なお、画像の文字は企業コンプライアンスの関係で常にダミー(意味はない)と思っていただいたほうがよく、列、行などで処理対象をいじっていくのがたぶん大企業で複数のAccess担当者がいるようなところでは、統一ができておあらず、ほかの事務員はExcelしかもっていあにので、Excelではデータを表示して簡単な計算式を入れておわりです。Excelでデータの確からしさをみつけても、DBチームが改修しないなら意味がない)

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (4)

  • 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
質問者

お礼

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

全文を見る
すると、全ての回答が全文表示されます。
  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.3

 尚、C列の「コード」が同じで、尚且つ2販売額の数字が合致しているものの中で、F列の日付けが最新の日付となっている行の「ステータス」の項目が、もしも「GOOD」でもなければ「BAD」でも無かった場合には、取り敢えず薄い緑色を付ける様にしております。  又、「マッチ」の項目にNOが入力されているか否かというデータを色付けの判定基準の一部に利用している都合で、もしも「コード」、「販売額A」、「日付け」、「販売額B」の各項目が入力されている行で、「マッチ」の項目が間違っている場合には、先にその間違いを自動的に修正してから、色付けを行う様になっております。(「コード」、「販売額A」、「日付け」、「販売額B」の各項目が正しく入力されていない行は無視します)

ketae
質問者

補足

追加での補足ありがとうございます。わたしも気がついたので補足いたします。 B列の「NO」はたしかに意味的にはD列とH列の不一致の意味で合致はしていますが、これはアクセスのテーブル表示上でそれを示しているだけで、ここを見ているのはアクセスを使う人達です。 Excelでの質問をたてていますが、実はこのデータは最初CSVデータでとどくので、単なる文字の「NO」入っているだけで計算式はB列にはまったく入っていません。というか、CSVなのですべてのセルに計算式は入っていません。

全文を見る
すると、全ての回答が全文表示されます。
  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.2

 回答No.1です。  一応、項目名が画像の通りのものとなっていて、 表がH列よりも左にある列から始まっている場合で、 尚且つ、表の左端の列よりも左にある列で表の項目名欄よりも下になる行には文字列が入力されているセルが存在していない場合には、 項目名が入力されている行の行番号や、 「マッチ」、「コード」、「販売額A」、「日付け」、「販売額B」、「ステータス」の項目がどの列に入力されているのか という事を自動的に検出して行の色分けを行う様なVBAのマクロになっておりますので、御確認願います。 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 TypeName(Cells(i, DateColumn).Value) = "Date" 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
質問者

お礼

実際にコードを動かしてみて気が付きましたが、D列とH列の数字が絶対値で同じとみているようです。 A列の3の行(Excelでいう4行目)でいうと、D列「-29600」とH列「29600」は異なるのに、青い色がつくようです。ただ青や赤の色付けの判断はここではないようです。 で、F列の日付は、9/25が2行あるため、ここで判断しているようです、2つの9/25を A列が3の行(Excelでいう4行目)の日付け(F列)を9/25 A列が4の行(Excelでいう5行目)の日付け(F列)を9/26 にすると、A列が4の行だけ色がつきます。 ただ日付けは吐き出す側でなんらかの別の処理で必要なために、同じ日付けが2行ならぶことがあるので、DとHの列の数字が同じであることの判定がまず先に必要と思いました。

ketae
質問者

補足

ありがとうございます。 実は1行目のタイトル行は、異なる2つのデータを、アクセスファイルで吐き出す人によって(処理のアクセスファイルが複数ある)、SQLやクエリーで名称を変えて出している場合があるので(複数データ処理アクセスファイルあり、それぞれ過去につくった人が異なる)名称が一定しません。ただ読めば、ターゲットの項目であることは、わたしは理解しています。 (わたしはアクセスファイルを修正する権限がありません) このためこのExcelにおいては >現状では、D列とH列の比較という形で図をつくりました。 >画像に写っている列で、考えていただいてけっこうです。 と「列」で探す方向にこだわって考えていました。 あと説明が足りなかったのでが、たとえばA列で「1、2、3、4」も「」5、6、7、8」はC列でどちらも同じ商品コードですが、上から下方向に見るとき、同じコードの最終行(ここでは4や8)が最新の日付であるデータの吐き出し方は決まっている(動かない)ため、わたしの添付画像のような色付け(それぞれのコードの「最新日の行を1行だけ」)黄色ではない色にして目立たせたかったのでした。 現状いただいたVBAのプログラムでは、3、4が同じ色、7、8が同じ色、と2行づつ同じ色がつくようです。 ステータス列もGOODとBAD以外の文字や空欄はなく、かならずGOODかBADが入っています。 ともあれ、ヒントをいただいたので、(急ぎではないので)わたしも今週考えてみます。 質問は開けておきますので、行き詰まったらまた質問させていただくと思います。いつもお世話になりっぱなしで、ありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。
  • 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列使えないようなら幾つかに分割しても構いません。 ご存知の方がおられましたらよろしくお願いします!