• 締切済み

2つのシートの比較で更新分だけを色付けしたい

表を管理していて、前月のある日に保存した内容と 翌月のある日に保存した内容を比較して 差分を取りたいのです。 例えば、表を更新した時に行が追加されたりして レコードはひとつ追加になっているけれど 他の内容は変わってないとします。 しかし、同じ位置の同じセルの値を比較だと 追加した行以降全てのセルに色が付いてしまいます。 これを、追加された行(レコード)だけを 色付けるようにしたいのです。 >If s1.Cells(gyou, retsu).Value <> s2.Cells(gyou, retsu).Value Then > > '同じ位置のセルの値が等しくなければ、そのセルを赤で塗りつぶす。 この部分に手を加えればいいのかと思うのですが、解りません。 どのようにすればいいのか教えていただけないでしょうか? お願いいたします。 Sub シート比較()  Dim RETSU_S, RETSU_E, GYOU_S, GYOU_E As Long RETSU_S = 1 RETSU_E = 10 GYOU_S = 2 GYOU_E = 101   Dim s1, s2 As Worksheet  Set s1 = Worksheets("Sheet1")  Set s2 = Worksheets("Sheet2") Dim retsu, gyou As Long 'この変数で列と行を指定する For gyou = GYOU_S To GYOU_E For retsu = RETSU_S To RETSU_E If s1.Cells(gyou, retsu).Value <> s2.Cells(gyou, retsu).Value Then '同じ位置のセルの値が等しくなければ、そのセルを赤で塗りつぶす。 s1.Cells(gyou, retsu).Interior.ColorIndex = 3 s2.Cells(gyou, retsu).Interior.ColorIndex = 3 End If Next Next End Sub

みんなの回答

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

No.1です。 補足の >このSheet1とSheet2を比較したとき >Sheet2のA1に"か"、A3に"き"、A5に"く"に色がつくようにできるとありがたいのです すなわちSheet2のA列データがSheet1のA列にない場合にそのセルの色を付けたい!というコトですね? そうであればごくごく簡単に・・・ Sub シート比較3() Dim i As Long, c As Range, wS As Worksheet Set wS = Worksheets("Sheet1") With Worksheets("Sheet2") .Range("B:B").Interior.ColorIndex = xlNone For i = 1 To .Cells(Rows.Count, "A").End(xlUp).Row Set c = wS.Range("A:A").Find(what:=.Cells(i, "A"), LookIn:=xlValues, lookat:=xlWhole) If c Is Nothing Then .Cells(i, "A").Interior.ColorIndex = 3 End If Next i End With End Sub としてみてはどうでしょうか?m(_ _)m

umezou471
質問者

お礼

さっそく、ありがとうございます。 後で、試してみます! >単純に ってことは、こっちのコードの方が簡単というか、オーソドックスってことなんですかね? 説明が下手で遠回りさせてしまいました。 すみませんでした! でも、ちょっと違う色々なパターンを見れると勉強になるので、ありがたいです。

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

Option Explicit Dim s1 As Worksheet Dim s2 As Worksheet Dim retsu, gyou As Long 'この変数で列と行を指定する Dim gyou2 As Long Dim RETSU_S, RETSU_E, GYOU_S, GYOU_E As Long Dim GYOU_E2 As Long Sub シート比較() GYOU_S = 2 'GYOU_E = 101 RETSU_S = 1 RETSU_E = 10 Set s1 = Worksheets("Sheet1") Set s2 = Worksheets("Sheet2") s1.UsedRange.Interior.Color = vbWhite s2.UsedRange.Interior.Color = vbWhite GYOU_E = s1.Cells(Rows.Count, "A").End(xlUp).Row GYOU_E2 = s2.Cells(Rows.Count, "A").End(xlUp).Row For gyou = GYOU_S To GYOU_E For gyou2 = GYOU_S To GYOU_E2 If s1.Cells(gyou, "A").Value = s2.Cells(gyou2, "A").Value Then '行が一致 Call HowMuch GYOU_S = gyou2 + 1 Exit For Else If s1.Cells(gyou, "A").Value < s2.Cells(gyou2, "A").Value Then '左だけ s1.Range(s1.Cells(gyou, RETSU_S), s1.Cells(gyou, RETSU_E)).Interior.Color = vbRed Exit For Else '右だけ s2.Range(s2.Cells(gyou2, RETSU_S), s2.Cells(gyou2, RETSU_E)).Interior.Color = vbRed End If End If Next If (gyou2 > GYOU_E2) Then s1.Range(s1.Cells(gyou, RETSU_S), s1.Cells(GYOU_E, RETSU_E)).Interior.Color = vbRed Exit For End If Next If Not (gyou2 > GYOU_E2) Then s2.Range(s2.Cells(gyou2, RETSU_S), s2.Cells(GYOU_E2, RETSU_E)).Interior.Color = vbRed End If MsgBox ("Done de Done !!") End Sub Private Function HowMuch() For retsu = RETSU_S To RETSU_E If s1.Cells(gyou, retsu).Value <> s2.Cells(gyou2, retsu).Value Then '同じ位置のセルの値が等しくなければ、そのセルを黄色で塗りつぶす。 s1.Cells(gyou, retsu).Interior.Color = vbYellow s2.Cells(gyou2, retsu).Interior.Color = vbYellow End If Next End Function

umezou471
質問者

お礼

ありがとうございます。 PCが使えない為、まだ試していませんが コードをよく読んで理解したいと思います。 本来、実行してからお礼申し上げるべきですが 取り急ぎ、お礼させて頂きます。

全文を見る
すると、全ての回答が全文表示されます。
  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.1

こんばんは! すでに色がついているセルの色は消す必要はないのですね? >2つのシートの比較で更新分だけを・・・ というコトですので、考え方としては Sheet1の最終行とSheet2の最終行の比較で行数の少ないSheetの最終行+1行目~行数の多いSheetの最終行までループしてみてはどうでしょうか? 一例です。 Sub シート比較2() Dim i As Long Dim j As Long Dim Gyou1 As Long Dim Gyou2 As Long Dim minGyou As Long Dim maxGyou As Long Dim s1 As Worksheet Dim s2 As Worksheet Set s1 = Worksheets("Sheet1") Set s2 = Worksheets("Sheet2") Gyou1 = s1.Cells(Rows.Count, "A").End(xlUp).Row Gyou2 = s2.Cells(Rows.Count, "A").End(xlUp).Row minGyou = WorksheetFunction.Min(Gyou1, Gyou2) maxGyou = WorksheetFunction.Max(Gyou1, Gyou2) If minGyou <> maxGyou Then For i = minGyou + 1 To maxGyou For j = 1 To 10 If s1.Cells(i, j) <> s2.Cells(i, j) Then s1.Cells(i, j).Interior.ColorIndex = 3 s2.Cells(i, j).Interior.ColorIndex = 3 End If Next j Next i End If End Sub ※ 両SheetともA列で最終行を取得していますので、A列には何らかのデータが必ず入るという前提です。 ※ 変数の宣言で >Dim RETSU_S, RETSU_E, GYOU_S, GYOU_E As Long のようにしてしまうと、 RETSU_S RETSU_E GYOU_S の3つは何も宣言していないので「Variant」型になってしまいます。 大勢には影響ないのですが、厳密にいえば一つ一つちゃんと宣言してやる習慣をつけた方が良いと思います。 こんな感じではどうでしょうか?m(_ _)m

umezou471
質問者

お礼

ありがとうございます。 今、PCが使えない(家族と共用なので)ので、マクロを実行していないのですが、よく読んで理解します。 試してから、お礼申し上げたいのですが・・・取り急ぎお礼申し上げます。

umezou471
質問者

補足

マクロの動作確認しました。 ちょっと、私がイメージしていたのとは違っていて‥ でも、どうアレンジしたらいいのか解らずです。 イメージでは、 Sheet1の、A1に"あ"、A2に"い"、A3に"う" と入力した表があって それをコピーした表Sheet2には、新しい情報を加えるので A1に"か"、A2に"あ"、A3に"き"、A4に"い"、A5に"く"、A6に"う" となります。 このSheet1とSheet2を比較したとき Sheet2のA1に"か"、A3に"き"、A5に"く"に色がつくようにできるとありがたいのです。 もう少し、お付き合い頂いて教えて下さると嬉しいです。 お聞きするばかりで、本当に申し訳ありません。 よろしくお願い致します。

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

関連するQ&A

  • 空白セルと0値を識別させたい。(VBA)

    すみません、誰か教えていただけますか。 シートの53、54、55行目にそれぞれ値入っています。 それを3行目にビジュアル的に表現させています。 55行目はセルの色で、53行目は数値があり同じ値が 続く部分の合計を出しています。 しかし、下記の記述ですと数値が0(変数D=0)の時に うまくいきません。空白セルと認識されてしまうと思います。 何か、良い方法があれば教えて頂けませんでしょうか。 宜しくお願いします。 Sub 表示() Dim a As Long Dim c As Long Dim D As Long Dim e As String Dim f As String c = 3 For a = 3 To 64 With Worksheets("Sheet1") If .Cells(53, a) <> .Cells(53, a + 1) Then .Range(.Cells(53, c), .Cells(53, a)).Select D = WorksheetFunction.Sum(Selection) e = D f = Selection(1).Offset(1, 0).Value G = Selection(1).Offset(2, 0).Value If D <> 0 Then Selection(1).Offset(-50, 0).Value = f + "//" + e .Range(.Cells(53, c), .Cells(53, a)).Offset(-50, 0).Select Selection.Interior.ColorIndex = G End If If Selection(1).Value = "" Then .Range(.Cells(53, c), .Cells(53, a)).Offset(-50, 0).Select Selection.ClearContents Selection.Interior.ColorIndex = xlNone End If c = a + 1 End If End With Next End Sub

  • VBAのプログラムでうまく動かなくて困っています。

    VBA初心者です。 エクセルのVBAのプログラムでうまく動かなくて困っています。教えていただける方がいらしたら、ぜひ教えて下さい!よろしくお願いします。エクセルの内容は以下のとおりです。 (内容) セル    E H J L N P R・・・ 8行目100 200 50 40 30 80 9行目130 350 10 50 60 120 110 ・ ・ (1)列Hの値が列Eの値より大きい場合その下に行を追加します。 (2)セルJ+セルL+セルN+・・をしてセルEの値を超えたセル以降の値を追加した行のセルJ列から順にコピペする処理です。 上のセルの1行目の内容でいいますと、 (1)列Hの値「200」が列Eの値「100」より大きいのでその下に行追加 (2)セルJ、L、N「50」+「40」+「30」でセルEの値「100」より大きいので、追加した行のセルJ列にセルN、Pの値をコピペするです。 以下が私が書いたプログラムです。 Sub test() Dim x As Integer Dim s As Integer Dim t As Integer x = Range("B8").End(xlDown).Row r = Range("J8").End(xlToRight).Column '8行目から最終行までループ For i = x To 9 Step -1 If Cells(i, 5) < Cells(i, 8) Then ☆【For r = y To 11 Step -2 Cells(s, t).Value = Cells(i, r) + Cells(i, r + 2) If Cells(i, 5).Value < Cells(s, t).Value            Then Exit For Next】 Rows(i + 1).Insert Shift:=xlDown '超えたセルをコピーして、1行下の"J列以降"に代入 ★ x = x + 1 End If Next i End Sub 上記プログラムで★の部分がうまく書けません。☆の部分も間違っているような気がします。よろしくお願いします。

  • Excel VBA データの入っているセルの取り出し

    Excel VBA データの入っているセルの取り出し Excel2007使用です。 大きなセル範囲の中にデータが点在している場合に、そのデータを一か所にまとめるマクロを作りたいです。セル範囲は決まっています(A1:Q100)。最終的には隣のセルの1列にまとめたいです。 以下のようなマクロを作ってみましたが、いずれも作動しませんでした(エラーメッセージも出ず) NullをEmptyに変えてみても同じでした。 (ややこしいですが、アクティブセルはSheet2、Sheet1へ貼り付けたい) (とりあえずシート内で列上部にまとめようとした) Dim myRange As Range For Each myRange In Range("A1:Q100") If myRange.Value = Null Then myRange.Delete xlShiftUp End If Next myRange End Sub (1行1列ずつの参照をループさせて「空白でない」セルを切り取り-貼り付けさせようとした) Worksheets("sheet2").Activate Dim Gyou As Integer Dim Retsu As Integer For Gyou = 1 To 100 For Retsu = 1 To 17 If Cells(Gyou, Retsu).Value = Not Null Then Cells(Gyou, Retsu).Cut Destination:=Worksheets("sheet1").Cells(5, 2) End If Next Retsu Next Gyou End Sub また、以下のマクロは、実行すると現状のままSheet1のE列以降に移るだけで、データのあるセルだけがまとまるという状態にはなりません。 Range("A1:Q100").SpecialCells(xlCellTypeVisible).Cut Destination:=Worksheets("Sheet3").Range("E1") End Sub 以下は某サイトで、まさに「空白セルを削除しデータの入ってるセルを上詰めにする」というマクロが紹介されていたので、加工してやってみましたが、「RangeクラスのDeleteメソッドが失敗しました」という実行時エラーが出てできませんでした。 Dim WS As Worksheet Dim myRng As Range Dim Lrow As Long Set WS = Worksheets("Sheet1") Lrow = WS.Range("A" & CStr(Rows.Count)).End(xlUp).Row Set myRng = WS.Range("A1:A" & CStr(Lrow)) myRng.SpecialCells(xlCellTypeBlanks).Delete xlShiftUp End Sub データの入っているセルだけを取り出して一つの列にまとめたいのですが、どうしたらいいのでしょうか。

  • EXCELで4色の色をつけるVBA(既存)を最後のシートまで実行するには?

    エクセルのVBAで質問です。 現在、下記のVBAにて、エクセルに4色の色をつけています。 内容 ・処理範囲内(D5:AI50)の列の値が、 ・指定した行(4行目)の値から見て、 ・+5、+10、-5、-10の場合、それぞれ指定した色をつけています ・ただしC列の値が30未満の行は色付けなし 現状では、このマクロはアクティブシートのみで使えるため、 100シートあれば、それぞれのシートにおいて そのつどマクロを実行しています。 これを、一度の実行で最終シートまで実行できるようにしたいのです。 VBA初心者のため、見よう見まねでループを試してみたものの、 どうもうまく動きませんでした。 なにとぞご教授のほど、お願いいます。 ●以下、現在使用しているVBA Sub 条件付4色の標本数1() Dim 処理範囲 As Range Dim 先頭の行番号 As Long Dim 全体の行数 As Long Dim 各セル As Range Dim 差分 As Single Dim 標本数 As Single Set 処理範囲 = Range("D5:AI50") For Each 各セル In 処理範囲 標本数 = Cells(各セル.Row, "C").Value If 標本数 >= 30 Then 差分 = 各セル.Value - Cells(4, 各セル.Column).Value    Select Case 差分 Case Is <= -10 各セル.Interior.ColorIndex = 37 'ペールブルー 各セル.Font.ColorIndex = 1 Case Is <= -5 各セル.Interior.ColorIndex = 34 '薄い水色 各セル.Font.ColorIndex = 1 Case Is >= 10 各セル.Interior.ColorIndex = 6 '黄37 各セル.Font.ColorIndex = 1 Case Is >= 5 各セル.Interior.ColorIndex = 19 '薄い黄 各セル.Font.ColorIndex = 1 Case Else 各セル.Interior.ColorIndex = xlNone '無色 End Select End If Next End Sub

  • VBAで別の列のセルにも色付け~2

    WINDOWS XP EXCELL 2003です。 いつもお世話になります。 ご迷惑とは重々と承知しながら再度質問させていただきます。 1 御指導を賜りたいのは、 現在A列には月度を示す 01~12 が入力され月別にセルの背景色を塗りつぶしていますがこれをA列用のマクロを工夫してF列にも同様に適用したい。 例えば参照図で言うと A7 05 ピンク  A8 05 ピンク A9 06 ライトブルー  A10 07 草色 等のように ※ 参照図のF列のセルには背景色は適用していません。 2 参照図のそれぞれの設定は、   ※ 計画 と 生産はセル位置だけの違いで生産の方は割愛します。 D1 ユーザー定義 mm/dd D2 ユーザー定義 200000 D3 数値 A7 ユーザー定義 mm マクロ ボタン「計画入力」 Sub 計画入力() Dim GYOU '追加 GYOU = Range("C65536").End(xlUp).Row + 1 Cells(GYOU, 2).Value = Range("D1").Value Cells(GYOU, 3).Value = Range("D2").Value Cells(GYOU, 4).Value = Range("D3").Value End Sub ボタン「セルセット」 Sub 計画セル()    Range("D1,D2,D3,D1").Select End Sub A列のセル塗りつぶし Private Sub Worksheet_Change(ByVal Target As Range) If Target.Row >= 8 And Target.Address = Cells(Rows.Count, "C").End(xlUp).Address Then Target.Offset(0, 0).Value = Date End If Dim c As Integer If Target.Column <> 2 Then Exit Sub If Target.Value = "" Then c = 0 Else On Error GoTo line Select Case Month(Target.Value) Case 1: c = 46 Case 2: c = 4 Case 3: c = 39 Case 4: c = 6 Case 5: c = 7 Case 6: c = 8 Case 7: c = 43 Case 8: c = 3 Case 9: c = 44 Case 10: c = 24 Case 11: c = 40 Case 12: c = 17 End Select End If Target.Offset(0, -1).Interior.ColorIndex = c Target.Offset(0, -1).Font.ColorIndex = IIf(c = 1, 2, 0) Exit Sub line: Target.Offset(0, -1).Interior.ColorIndex = 0 Target.Offset(0, -1).Font.ColorIndex = 0 End Sub 御指導よろしく御願いします。

  • エクセルVBAでのセルの扱い

    If Cells(retsu(n) + 3, zentai(n)).Value + 10 < Cells(retsu(n) + 3, zentai(n) + gyou(n)).Value Then 二つのセルの大きさを比較する分を作ったのですが、オブジェクトの定義エラーと表示されます。いったいどこがだめだかさっぱりわからないのですが、皆さんの知恵を貸してください。。

  • 通し番号(連番)を返すマクロ

    エクセルで -------------------        | Retsu1 | Retsu2 | ------------------- Gyou    |    1 |    1  | -------------------         |    1  |    2  | -------------------        |     1 |    3  | -------------------        |     2 |    1  | このようにRetsu1には1~Xの数字が入っています。 データはRetsu1で並べ替えをしているため、その数字は、しばらく1が続いたら、次は2が続き、その次には3が続くというような並び方をしています。X(最終の数字)が続いた後は空白です。 そこで、Retsu2には1,2,3・・・というように連番を書き込みたいと思います。 これはRetsu1の同一数字内で連番にしたいのです。 つまり、Retsu1の値が2になれば、また新たに1,2,3・・・というような感じです。 最後にはRetsu1の値がXで1,2,3・・・と連番の書き込みが終わったら(Retsu1が空白になったら) Retsu2への書き込みも終了とします。 マクロ初心者のため Dim Gyou As Integer Dim Retsu1 As Integer Dim Retsu2 As Integer までしかできていません。 この続きのマクロを教えてください。お願いします。

  • エクセル2003 VBAマクロにて 背景色 白色の抽出

    エクセル2003のマクロでセル背景色にて抽出したいのですが 背景色が白色(空白)の抽出ができません。 背景色別に 他セルに文字を自動記入したいのですが、 背景色が白(collorindex=0)の認識をしてくれません。 カラーインデックスでは、白は「0」か「2」になっているので その値でマクロを組んでも認識してくれないようです。 どのようにすればよいのでしょうか? 以下に私(素人)のマクロ文(一部)です。ご指摘お願い致します。 Dim 行番号 As Integer 行番号 = 7 Do Until Cells(行番号, 1).Value = "" If Cells(行番号, 9).Interior.ColorIndex = 5 Then Cells(行番号, 14).Value = "3号機"   ElseIf Cells(行番号, 9).Interior.ColorIndex = 7 Then Cells(行番号, 14).Value = "4号機" ElseIf Cells(行番号, 9).Interior.ColorIndex = 0 Then Cells(行番号, 14).Value = "未加工" End If 行番号 = 行番号 + 1 Loop

  • 同一セル内での複数条件による抽出

    セルの背景色で条件抽出をしております。 A1背景色=赤→A3に「OK」書き出し、という具合です。 背景色がある場合の抽出はできるようになったのですが 同一セルで 「背景色なし」かつ「文字が記入されている」 ときに 他セルに「NG」などの文字が出るようにしたいのですが VBAで可能でしょうか? 以下の部分まで(背景色がある場合)は出来たのですが。 御教授宜しくお願いいたします。 Dim 行番号 As Integer 行番号 = 7 Do Until Cells(行番号, 1).Value = "" If Cells(行番号, 9).Interior.ColorIndex = 5 Then Cells(行番号, 14).Value = "教えて" ElseIf Cells(行番号, 9).Interior.ColorIndex = 7 Then Cells(行番号, 14).Value = "GOO" End If 行番号 = 行番号 + 1 Loop

  • エクセル マクロ 複数セルの色付けについて

    マクロ初心者で苦戦しており、教えていただけると大変ありがたいです。 エクセルの複数のシートに、問2_1 、問2_2 、問2_10 (全部で問は2_28まであります)等の文字列があり、その文字に合わせて、そのセルだけ色を付けたいと考えております。 今書いているコードだと、ワークシートのA列にある場合は色が付けられるのですが、それ以外に色が付けられません。どこが間違っているでしょうか? どうぞご指導お願いいたします。 Sub 色つけ() Dim Maxrow As Long Dim i As Long Maxrow = Cells(Rows.Count, i).End(xlUp).Row For i = 1 To Maxrow If InStr(Cells(i, 1), "2_1 ") > 0 Then Cells(i, 1).Interior.ColorIndex = 6 If InStr(Cells(i, 1), "2_2 ") > 0 Then Cells(i, 1).Interior.ColorIndex = 6 If InStr(Cells(i, 1), "2_23 ") > 0 Then Cells(i, 1).Interior.ColorIndex = 23 If InStr(Cells(i, 1), "2_13 ") > 0 Then Cells(i, 1).Interior.ColorIndex = 4 If InStr(Cells(i, 1), "2_6 ") > 0 Then Cells(i, 1).Interior.ColorIndex = 7 Next i End Sub

専門家に質問してみよう