• ベストアンサー

全シート内の差分比較とそのセル色塗りつぶしマクロ

Excelファイルデータの差分比較とそのセル塗りつぶしのマクロを作成したいのですが、今の自分には、下記のマクロでとどまっており、 マクロを実行するファイル内シートにデータをコピーしたり、 マクロ内でその都度、シート名の記載の変更、差分比較データ範囲の変更が必要になり、大変不便で困っております。 やりたい事は、マクロでユーザがExcelのファイルを選択出来て、 そのファイルの中の全シートのデータについて、差分比較とそのそのセルの塗りつぶしをして、塗りつぶしをファイルへ反映させて保存させることです。 どうか、お分かりの方がいらっしゃいましたら、ご教示をお願い出来ますと大変助かります。 各シート内のデータは、列、行共にほぼ同じフォーマットで値が入っています。 それらのシート内のデータで修正した箇所を見つける為、差分比較がしたいです。 例えば、シートが3つの場合は、 1つ目のシートは修正前のデータ、 2つ目のシート内は1つ目のシートの値を部分的に修正したものです。 3つ目のシート内のデータも、1つ目のデータの値を更に再修正したものです。 この3つのシート内のデータを差分比較したいです。 シートの数は、選択したファイルによって異なります。 Sub TEST1() Dim s1, s2 As Worksheet 'Worksheetsオブジェクト用 Set s1 = Worksheets("修正前S装置検索システム") '比較元シート名 Set s2 = Worksheets("修正後装置検索システム") '比較先シート名 Dim arr1 As Variant, arr2 As Variant arr1 = s1.Range("$A$2:$W$548").Value arr2 = s2.Range("$A$2:$W$548").Value For i = 1 To UBound(arr1, 1) For j = 1 To UBound(arr1, 2) If arr1(i, j) <> arr2(i, j) Then '塗りつぶし処理 s1.Cells(i + 1, j).Interior.Color = RGB(255, 0, 0) s2.Cells(i + 1, j).Interior.Color = RGB(102, 255, 51) End If Next Next End Sub

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

  • ベストアンサー
  • kkkkkm
  • ベストアンサー率65% (1615/2454)
回答No.17

> 出力ファイルのシート1(修正前データ)で塗りつぶしセル(修正後の差分部分)のフォントの色を黒字から白色の文字へ変更するコード 修正前データのシートだけでしたら s1.Cells(i + 1, j).Interior.Color = mColor(k) が2か所ありますのでそこに文字色を白にするコードを追加します s1.Cells(i + 1, j).Interior.Color = mColor(k) s1.Cells(i + 1, j).Font.Color = vbWhite '←これを追加 テストしていて思ったのですが 比較先シートを選択した時点で選択したタブの色が分からなくなって、たとえば4回目以降くらいになると過去の色が混在していた場合、その回に変更した色が何なのかが即わからない感じがしました。 そこで、1行目は修正対象ではないので差分で色が変わらないと思いますから、比較先シートの1行目のセルの色をタブの色と同じ色にして、ウィンドウ枠の固定で1行目をスクロールしないようにしておけば分かりやすい気もします。 ただし、既に1行目に色がついていたりウィンドウ枠の固定をしていた場合は設定が変更されてしまいます。 利用する場合は 最後の方で '色見本のセルにシート名を記述 ThisWorkbook.Sheets("Sheet1").Cells(k + 1, "A").Value = s2.Name Set s2 = Nothing Set sP = Nothing If k = 9 Then となっている間に入れる感じでコードを追加してください。 '色見本のセルにシート名を記述 ThisWorkbook.Sheets("Sheet1").Cells(k + 1, "A").Value = s2.Name '-------ここから '1行目のセルの色をタブの色と同じ色にして、ウィンドウ枠の固定 s2.Activate s2.Range("A2").Select ActiveWindow.FreezePanes = False ActiveWindow.FreezePanes = True s2.Range(s2.Range("$A$1"), s2.Cells(1, mCol)).Interior.Color = mColor(k) s1.Activate '------ここまでを挿入 Set s2 = Nothing Set sP = Nothing If k = 9 Then

nnirosan
質問者

お礼

お願い致しました要望に対応して下さり、私が気づけなかったタイトル行の固定と色塗りつぶしについても、ご教示を頂きまして有難うございました。ご教示通りにマクロで実行出来ました。 これまでも、タイトル行を固定してデータを確認していますので、手間が省けて大変便利になりました。 これで、今回の質問は完了とさせて頂きます。本当に有難うございました。

その他の回答 (16)

  • kkkkkm
  • ベストアンサー率65% (1615/2454)
回答No.16

Sub Test3_3() Dim Wb As Workbook Dim s1 As Worksheet, s2 As Worksheet, sP As Worksheet Dim i As Long, j As Long, sCount As Long, k As Long Dim arr1 As Variant, arr2 As Variant, arrP As Variant Dim FullPath As Variant, FileName As String Dim mRow As Long, mCol As Long Dim mRng As Range Dim mColor() As Variant 'ここでフォルダを指定しておくとそのフォルダでファイルを開くダイアログがでます。 'ChDir "C:\Ok" FullPath = Application.GetOpenFilename(FileFilter:="Excelファイル,*.xls*") If FullPath = False Then Exit Sub End If '色見本のセルから色の取得 k = 0 For Each mRng In ThisWorkbook.Sheets("Sheet1").Range("A1:A10") ThisWorkbook.Sheets("Sheet1").Cells(k + 1, "A").Value = "" ReDim Preserve mColor(k) mColor(k) = mRng.Interior.Color k = k + 1 Next '色見本セルを使わずに直接色番号を指定する場合 'mColor = Array(11854022, 15189684, 10086143, 14408667, 11389944, 13285804, 9359529, 14395790, 6740479, 13224393) Workbooks.Open FullPath FileName = Mid(FullPath, InStrRev(FullPath, "\") + 1) Set Wb = Workbooks(FileName) Set s1 = Wb.Worksheets(1) '比較元シート '比較元シートのセルの塗りつぶしをクリアします s1.Range(s1.Range("$A$2"), s1.Cells.SpecialCells(xlCellTypeLastCell)).Interior.ColorIndex = xlNone k = 0 mRow = s1.Cells.SpecialCells(xlCellTypeLastCell).Row mCol = s1.Cells.SpecialCells(xlCellTypeLastCell).Column For sCount = 2 To Wb.Sheets.Count Set s2 = Wb.Worksheets(sCount) '比較先シート '過去最大となる行番号と列番号を変数に設定 If mRow < s2.Cells.SpecialCells(xlCellTypeLastCell).Row Then mRow = s2.Cells.SpecialCells(xlCellTypeLastCell).Row End If If mCol < s2.Cells.SpecialCells(xlCellTypeLastCell).Column Then mCol = s2.Cells.SpecialCells(xlCellTypeLastCell).Column End If arr1 = s1.Range(s1.Range("$A$2"), s1.Cells(mRow, mCol)).Value arr2 = s2.Range(s2.Range("$A$2"), s2.Cells(mRow, mCol)).Value If sCount > 2 Then Set sP = Wb.Worksheets(sCount - 1) '比較先のひとつ前のシート arrP = sP.Range(sP.Range("$A$2"), sP.Cells(mRow, mCol)).Value End If For i = 1 To UBound(arr1, 1) For j = 1 To UBound(arr1, 2) If arr1(i, j) <> arr2(i, j) Then '塗りつぶし処理 If sCount > 2 Then If s1.Cells(i + 1, j).Interior.ColorIndex <> xlNone And arr2(i, j) = arrP(i, j) Then '修正前データが塗りつぶされていて前回と値が同じなら前回の色で s2.Cells(i + 1, j).Interior.Color = sP.Cells(i + 1, j).Interior.Color Else s1.Cells(i + 1, j).Interior.Color = mColor(k) s2.Cells(i + 1, j).Interior.Color = mColor(k) 'タブの色を塗りつぶしと同じ色に変更 s2.Tab.Color = mColor(k) End If Else s1.Cells(i + 1, j).Interior.Color = mColor(k) s2.Cells(i + 1, j).Interior.Color = mColor(k) 'タブの色を塗りつぶしと同じ色に変更 s2.Tab.Color = mColor(k) End If '-------------------- ElseIf sCount > 2 Then '前回までの変更が修正前データに戻されていた場合それ以降変更されるまでのシートの同一セル '及び最大に達していないシートの過去最大の行までの塗りつぶし If s1.Cells(i + 1, j).Interior.ColorIndex <> xlNone Then s2.Cells(i + 1, j).Interior.Color = vbYellow End If '-------------------- End If Next Next '色見本のセルにシート名を記述 ThisWorkbook.Sheets("Sheet1").Cells(k + 1, "A").Value = s2.Name Set s2 = Nothing Set sP = Nothing If k = 9 Then k = 0 Else k = k + 1 End If Next On Error Resume Next Wb.SaveAs Left(FullPath, InStrRev(FullPath, "\")) & "【チェック済】" & FileName If Err.Number <> 0 Then On Error GoTo 0 MsgBox "保存時にエラーが発生したかキャンセルされました。", vbInformation Err.Clear End If On Error GoTo 0 Set s1 = Nothing Set Wb = Nothing End Sub

nnirosan
質問者

お礼

早速のマクロの修正、誠にありがとうございました。 本日、マクロをテストしまして、ご報告通りに差分比較塗りつぶしが ご報告の通りになった事を確認致しました。 更に、私以外でも使えるように、シート2にマクロ実行ボタンを作り、ボタンを押す事でマクロを実行出来るようにしました。 条件を事細かに考えて下さり、説明も分かり易く大変感謝致します。 マクロは、今の所、このままで使用させて頂きます。 今回のマクロも末永く使わせて頂きます。 これまでにご教示頂いたマクロも、今でも大変重宝して使わせて頂いております。

nnirosan
質問者

補足

ご教示頂いたマクロはそのまま使わせて頂くとご報告したのに大変恐縮ですが、もう1点のみ、ご教示頂きたい事がございます。 例えば、出力ファイルに結果を出力する時、 出力ファイルのシート1(修正前データ)で塗りつぶしセル(修正後の差分部分)のフォントの色を黒字から白色の文字へ変更するコードを知りたいのですが、ご参考までにご教示頂く事は可能でしょうか?

  • kkkkkm
  • ベストアンサー率65% (1615/2454)
回答No.15

結果報告ありがとうございます。 削除した時は修正範囲からなくなるので範囲としていらないと思ったのですがそうでもなかったですね。 修正前データ(シート1)の行数と修正各シートの行数と比較して大きい方を比較範囲とすることも考えたのですが、実行後最大の行数を範囲とした方が安全そうなのでそちらにしました。 以下のような感じになります。 修正前データ(シート1)データ総行数は548行。 修正1回目データ(シート2)のデータ総行数は545行(最終行から3行削除) 比較範囲を548行までにします。削除された部分も範囲になりますので条件一致したセルは塗りつぶされます。 修正2回目データ(シート3)のデータ総行数は551行。(最終行から3行データ追加) 比較範囲を551行までにします 修正3回目データ(シート4)のデータ総行数は539行。(最終行から9行削除) 比較範囲を551行のままにします。削除された部分も範囲になりますので条件一致したセルは塗りつぶされます。 修正4回目データ(シート5)のデータ総行数は560行。(最終行から12行追加) 比較範囲を560行までにします また、最後のファイルの保存時に上書きするかどうかの問い合わせが出た場合キャンセルするとエラーで止まってましたので、メッセージを出してエラーにならないようにしました。 あと、これもふと思ったのですが、たとえば1回目で修正して2回目で意図してか偶然かによらず修正前のデータに戻した(戻ってしまった)セルは2回目では色なしになります。 この場合、元に戻ったシート以降のシートのセルを黄色にして(次に変更されるまで)一度は変更された事を知らせるという方法もありかなと思いましたので追加してみました。修正前データより実行後最大の行までの部分も黄色になります。 いらない場合は '-------------------- ElseIf sCount > 2 Then '前回までの変更が修正前データに戻されていた場合それ以降変更されるまでのシートの同一セル '及び最大に達していないシートの過去最大の行までの塗りつぶし If s1.Cells(i + 1, j).Interior.ColorIndex <> xlNone Then s2.Cells(i + 1, j).Interior.Color = vbYellow End If '-------------------- の部分を削除してください。 それと 'ここでフォルダを指定しておくとそのフォルダでファイルを開くダイアログがでます。 'ChDir "C:\Ok" この部分で一覧として最初に開きたいフォルダを指定しておくと便利です。 とりあえずコメントにしています。 行数制限があるみたいなのでコードは次の回答で

  • kkkkkm
  • ベストアンサー率65% (1615/2454)
回答No.14

> 元のシートのセルに色が付いていたら色を新たに付けないという方法が良いような気がします。 と回答しましたが、再度質問を読むと > 3つ目のシート内のデータも、1つ目のデータの値を更に再修正したものです。 という事は、どの修正も1つ目のシートが対象になるのかなと思ったりしましたが もし上記の状態ではなく 1つ目のシートを修正して2つ目のシート 2つ目のシートを修正して3つ目のシート という流れでしたら 新たに色を付けないだけだと次の修正でも修正した場合色がつかないので 3つ目のシートで比較している場合 1つ目のシートの該当セルに色がついていたら 3つ目のシートと2つ目のシートの該当セルのデータが同じ場合 3つ目のシートのセルの色を2つ目のシートのセルの色にする 3つ目のシートと2つ目のシートの該当セルのデータが違う場合 3つ目のシートのセルの色と1つ目のシートのセルの色を3つ目のシート用セルの色にする これでそのシートで修正したもの以外で修正されていたものは過去に修正したセルの色が付くようになると思います。 上記のコードをとりあえず記載しておきますので、状況が上記の場合こちらを利用してみてください。 コードは色見本を使う状態にしていますので適宜変更してください。 変更前の部分をコメントにしていたのを削除しました。 冗長なところがあるかもしれません。 Sub Test3_2() Dim Wb As Workbook Dim s1 As Worksheet, s2 As Worksheet, sP As Worksheet Dim i As Long, j As Long, sCount As Long, k As Long Dim arr1 As Variant, arr2 As Variant, arrP As Variant Dim FullPath As Variant, FileName As String Dim mRow As Long, mCol As Long Dim mRng As Range Dim mColor() As Variant FullPath = Application.GetOpenFilename(FileFilter:="Excelファイル,*.xls*") If FullPath = False Then Exit Sub End If '色見本のセルから色の取得 k = 0 For Each mRng In ThisWorkbook.Sheets("Sheet1").Range("A1:A10") ThisWorkbook.Sheets("Sheet1").Cells(k + 1, "A").Value = "" ReDim Preserve mColor(k) mColor(k) = mRng.Interior.Color k = k + 1 Next '色見本セルを使わずに直接色番号を指定する場合 'mColor = Array(11854022, 15189684, 10086143, 14408667, 11389944, 13285804, 9359529, 14395790, 6740479, 13224393) Workbooks.Open FullPath FileName = Mid(FullPath, InStrRev(FullPath, "\") + 1) Set Wb = Workbooks(FileName) Set s1 = Wb.Worksheets(1) '比較元シート '比較元シートのセルの塗りつぶしをクリアします s1.Range(s1.Range("$A$2"), s1.Cells.SpecialCells(xlCellTypeLastCell)).Interior.ColorIndex = xlNone k = 0 For sCount = 2 To Wb.Sheets.Count Set s2 = Wb.Worksheets(sCount) '比較先シート mRow = s2.Cells.SpecialCells(xlCellTypeLastCell).Row mCol = s2.Cells.SpecialCells(xlCellTypeLastCell).Column arr1 = s1.Range(s1.Range("$A$2"), s1.Cells(mRow, mCol)).Value arr2 = s2.Range(s2.Range("$A$2"), s2.Cells(mRow, mCol)).Value If sCount > 2 Then Set sP = Wb.Worksheets(sCount - 1) '比較先のひとつ前のシート arrP = sP.Range(sP.Range("$A$2"), sP.Cells(mRow, mCol)).Value End If For i = 1 To UBound(arr1, 1) For j = 1 To UBound(arr1, 2) If arr1(i, j) <> arr2(i, j) Then '塗りつぶし処理 If sCount > 2 Then If s1.Cells(i + 1, j).Interior.ColorIndex <> xlNone And arr2(i, j) = arrP(i, j) Then s2.Cells(i + 1, j).Interior.Color = sP.Cells(i + 1, j).Interior.Color Else s1.Cells(i + 1, j).Interior.Color = mColor(k) s2.Cells(i + 1, j).Interior.Color = mColor(k) 'タブの色を塗りつぶしと同じ色に変更 s2.Tab.Color = mColor(k) End If Else s1.Cells(i + 1, j).Interior.Color = mColor(k) s2.Cells(i + 1, j).Interior.Color = mColor(k) 'タブの色を塗りつぶしと同じ色に変更 s2.Tab.Color = mColor(k) End If End If Next Next '色見本のセルにシート名を記述 ThisWorkbook.Sheets("Sheet1").Cells(k + 1, "A").Value = s2.Name Set s2 = Nothing Set sP = Nothing If k = 9 Then k = 0 Else k = k + 1 End If Next Wb.SaveAs Left(FullPath, InStrRev(FullPath, "\")) & "【チェック済】" & FileName Set s1 = Nothing Set Wb = Nothing End Sub

nnirosan
質問者

お礼

1例ですが、マクロを実施した結果を下記のようにご報告させて頂きました。 修正で最終行にデータを追加した場合、追加した行は修正前データには反映されますが、 修正で最終行から数行削除をした場合、削除した行は修正前データには反映されないようです。 修正前データ(シート1)データ総行数は548行。 マクロ実行結果=2回目修正でデータ追加した行が2回目修正の色でぬりつぶされた。 修正1回目データ(シート2)のデータ総行数は545行(最終行から3行削除) マクロ実行結果=削除したデータのセルは塗り潰し無し。 修正2回目データ(シート3)のデータ総行数は551行。(最終行から3行データ追加) マクロ実行結果=追加データのセルが塗りつぶされる。 修正4回目データ(シート4)のデータ総行数は539行。(最終行から9行削除) マクロ実行結果=削除したデータのセルは塗り潰し無し。 可能であれば、ご紹介頂いたマクロで修正で削除したデータも、 修正前に反映されるようになると大変助かります。 難しさも分からずお願いしているかもしれません、その時は申し訳ありません。

nnirosan
質問者

補足

よく分かってないものですから、こんなものかなと感じておりましたが、更に分かり易いマクロをご紹介頂き、本当に感謝致します。 test3のマクロでは、以下になっている事を確認しました。 『A2を最初に修正して次はA2に手を加えずに修正されたままだった場合  元のシートのセルの色は次に修正したシートの色になる。』 test3-2のマクロでは、以下になっている事を確認しました。 『元のシートのセルに色が付いていたら色を新たに付けないという方法  3つ目のシートと2つ目のシートの該当セルのデータが同じ場合  3つ目のシートのセルの色を2つ目のシートのセルの色にする』 『3つ目のシートと2つ目のシートの該当セルのデータが違う場合  3つ目のシートのセルの色と1つ目のシートのセルの色を3つ目のシート用セルの色にする』 kkkkkmさんのご指摘の通り、元データをベースにした修正箇所チェックは、 『そのシートで修正したもの以外で修正されていたものは過去に修正したセルの色が付く』のやり方にした方が分かり易かったです。 更に、フォマットの違うデータでtest3-2マクロを試させて頂き、差分比較チェックをしてみます。 今の所、マクロファイルのシートへ好みの色を設定出来るこのマクロが、操作し易く良いかなと感じています。 後程、結果をご報告させて頂きます。

  • kkkkkm
  • ベストアンサー率65% (1615/2454)
回答No.13

> マクロはもう少しテストさせて頂きます おかしいところがあったら修正しますので実行しているコード(色々変更したのでどれを採用したのか分からないので)を記載してお知らせください。 あと、ふと思ったのですが、最初に修正して次に修正する時は修正されたものを元にして修正を加えるとしたら たとえばA2を最初に修正して次はA2に手を加えずに修正されたままだった場合 元のシートのセルの色は次に修正したシートの色になると思います。修正していないシートのセルにも色が付くので都合が悪いのではないでしょうか。 もし上記の状態でしたら元のシートのセルに色が付いていたら色を新たに付けないという方法が良いような気がします。

  • SI299792
  • ベストアンサー率48% (713/1473)
回答No.12

前プログラムに、フォント色変更機能を付けました。 赤、青等、黒だと醜い色の時、フォントを白にします。 最も、シートによって色を変えるのて必要になった機能で、色が1色だけなら不要ですが。 Option Explicit ' Sub Macro1()   Dim File As Variant   Dim SheetNo As Integer   Dim Cell1 As Range   Dim Cell2 As Range '   File = Application.GetOpenFilename("Microsoft Excelブック,*.xls?") '   If File = False Then     End   End If   Application.ScreenUpdating = False   Set File = Workbooks.Open(File, False) '   For SheetNo = 2 To Sheets.Count '     For Each Cell1 In Sheets(1).UsedRange       Set Cell2 = Sheets(SheetNo).Range(Cell1.Address) '       If Cell1 <> Cell2 Then         Cell1.Interior.ColorIndex = SheetNo + 1         Cell1.Font.Color = FontColor(Cell1.Interior.Color)         Cell2.Interior.Color = RGB(102, 255, 51)       End If     Next Cell1   Next SheetNo   SheetNo = InStrRev(File.FullName, ".") - 1   File.SaveAs Left(File.FullName, SheetNo) & "色付"   File.Close   MsgBox "処理終了" End Sub ' Function FontColor(ByVal IColor As Long) As Long   Dim SColor As Integer   Dim Mul As Integer '   Mul = 1 '   Do While IColor > 0     Mul = Mul Mod 3 + 1     SColor = SColor + (IColor Mod 256) * Mul     IColor = IColor \ 256   Loop   FontColor = vbWhite * -(SColor < 764) End Function \ は半角¥にして下さい。(コピペすれば半角¥になります) ファイル名の指定・出力ファイル名はこれでいいですか❓

nnirosan
質問者

お礼

マクロのご教示を頂きまして、誠にありがとうございました。大変勉強になりました。又、私が気づけなかった、塗りつぶしセルのフォントの色を変更して見易くする方法も紹介して下さり感謝しております。

Powered by GRATICA
  • kkkkkm
  • ベストアンサー率65% (1615/2454)
回答No.11

またまた余計なお世話ですが 回答No.9で添付画像の色でよろしければ For Each mRng In ThisWorkbook.Sheets("Sheet1").Range("A1:A10") ThisWorkbook.Sheets("Sheet1").Cells(k + 1, "A").Value = "" ReDim Preserve mColor(k) mColor(k) = mRng.Interior.Color k = k + 1 Next の部分を mColor = Array(11854022, 15189684, 10086143, 14408667, 11389944, 13285804, 9359529, 14395790, 6740479, 13224393) とすれば色見本のセルはいらなくなります。 最後の方の ThisWorkbook.Sheets("Sheet1").Cells(k + 1, "A").Value = s2.Name も色見本が無いのでいりませんね。 上記の方法でご自身の好みの色でやりたいとかありましたら 関係の無い別のブックでもOKですので Sheet1のA1からA10まで色を付けたとして Sub t() Dim mRng As Range Cells(1, "C").Value = "" For Each mRng In Sheets("Sheet1").Range("A1:A10") Cells(1, "C").Value = Cells(1, "C").Value & "," & mRng.Interior.Color Next Cells(1, "C").Value = "mColor = Array(" & Mid(Cells(1, "C").Value, 2) & ")" End Sub を実行すればC1にデータができますのでコピペしてください。 10回以上修正がある場合は、10色以上セット(もしくは色見本のセル)すればいいですが、10色を繰り返してもいいのじゃないかとも思えます。 その場合最後の方にある k = k + 1 のところを If k = 9 Then k = 0 Else k = k + 1 End If としておくと10色繰り返しになります。

nnirosan
質問者

補足

データチェック後の塗りつぶし色の下記の設定方法を、 大変分かり易く説明して頂き、誠に有難うございました。 ①マクロによる色番号の作り方 ②入力データの各シートタブの色塗りつぶしの色にする。 ③マクロ内のシート1:A1~A10のセルの塗りつぶし通りの色にする。 ④データ修正が10回以上の時の塗りつぶしは繰り返しにする。 未熟物の自分には、このようなマクロを作成する事は出来ず、マジックでも見ているようで、わくわくドキドキしながら、ご紹介頂いた項目を実行して見ました。 データ修正10回以上はまだ未実施ですが、その他の項目は、全て問題なく塗りつぶし色を設定する事が出来ました。 マクロはもう少しテストさせて頂きます。 取り急ぎ御礼まで。

  • kkkkkm
  • ベストアンサー率65% (1615/2454)
回答No.10

何度もすみません 回答No.7で 2つ目のシート以降では修正によって範囲が増えるという事でしたら以下になります。 と回答しましたが、上記の場合だけではなく 修正前のデータ範囲と修正後のデータ範囲が違う場合は増減に関わらず 回答No.7のコードにしてください。 質問のコードを基にしてますので、回答No.7より前のコードは修正前のデータ範囲と修正後のデータ範囲は同じという前提でのコードになっています。 範囲が同じでも回答No.7のコードで問題はありませんから回答No.7のコードでテストしてみてください。 回答No.7のコードで修正後のデータ範囲でチェックするというのを分かりやすくするために arr2 = s2.Range(s2.Range("$A$2"), s2.Cells.SpecialCells(xlCellTypeLastCell)).Value mRow = s2.Cells.SpecialCells(xlCellTypeLastCell).Row mCol = s2.Cells.SpecialCells(xlCellTypeLastCell).Column arr1 = s1.Range(s1.Range("$A$2"), s1.Cells(mRow, mCol)).Value の部分を ' arr2 = s2.Range(s2.Range("$A$2"), s2.Cells.SpecialCells(xlCellTypeLastCell)).Value mRow = s2.Cells.SpecialCells(xlCellTypeLastCell).Row mCol = s2.Cells.SpecialCells(xlCellTypeLastCell).Column arr1 = s1.Range(s1.Range("$A$2"), s1.Cells(mRow, mCol)).Value arr2 = s2.Range(s2.Range("$A$2"), s2.Cells(mRow, mCol)).Value としてもいいかもしれません。

  • kkkkkm
  • ベストアンサー率65% (1615/2454)
回答No.9

回答No.6の余計なお世話をしてみたコードを実行した時の画像をつけ忘れてました タブに色を付ければ修正前のシート(Sheet1)を見れば、どの時点で修正が行われたのかはセルと同じ色のシートを開けば分かるようになりますので、あれこれシートを探す手間が省けます。また、タブに色が付けられない場合、色見本のセルにその色を使ったシート名が記載されますので、それを見て該当シートを開くことができます。 マクロ実行のブックの色見本のシートのセルに記載されているシート名はマクロ実行で自動で記載されます。 セルの色だけ先に好みの色で塗りつぶしておいてください。

  • kkkkkm
  • ベストアンサー率65% (1615/2454)
回答No.8

回答No.7の追加です。 比較するシートのタブにもともと色を付けているのでしたら '塗りつぶし処理 s1.Cells(i + 1, j).Interior.Color = s2.Tab.Color s2.Cells(i + 1, j).Interior.Color = s2.Tab.Color としておけばタブと同じ色でセルが塗りつぶされます。

  • kkkkkm
  • ベストアンサー率65% (1615/2454)
回答No.7

> 2つ目のシート内は1つ目のシートの値を部分的に修正したものです。 との事でしたので、修正前のデータ範囲と修正後のデータ範囲は同じだと思っていたのですが > 修正で行が増える事があります。 これが 1つ目のシート修正前のデータ範囲 は増えないけど 2つ目のシート以降では修正によって範囲が増えるという事でしたら以下になります。 前回と同じように必要のない部分はコメントにしています。色変化付きのコードです。 Sub Test3() Dim Wb As Workbook Dim s1, s2 As Worksheet 'Worksheetsオブジェクト用 Dim i As Long, j As Long, sCount As Long, k As Long Dim arr1 As Variant, arr2 As Variant Dim FullPath As Variant, FileName As String Dim mRow As Long, mCol As Long Dim mRng As Range Dim mColor() As Variant FullPath = Application.GetOpenFilename(FileFilter:="Excelファイル,*.xls*") If FullPath = False Then Exit Sub End If '色見本のセルから色の取得 k = 0 For Each mRng In ThisWorkbook.Sheets("Sheet1").Range("A1:A10") ThisWorkbook.Sheets("Sheet1").Cells(k + 1, "A").Value = "" ReDim Preserve mColor(k) mColor(k) = mRng.Interior.Color k = k + 1 Next Workbooks.Open FullPath FileName = Mid(FullPath, InStrRev(FullPath, "\") + 1) Set Wb = Workbooks(FileName) Set s1 = Wb.Worksheets(1) '比較元シート 'arr1 = s1.Range("$A$2:$W$548").Value 'arr1 = s1.Range(s1.Range("$A$2"), s1.Cells.SpecialCells(xlCellTypeLastCell)).Value k = 0 For sCount = 2 To Wb.Sheets.Count Set s2 = Wb.Worksheets(sCount) '比較先シート 'arr2 = s2.Range("$A$2:$W$548").Value arr2 = s2.Range(s2.Range("$A$2"), s2.Cells.SpecialCells(xlCellTypeLastCell)).Value mRow = s2.Cells.SpecialCells(xlCellTypeLastCell).Row mCol = s2.Cells.SpecialCells(xlCellTypeLastCell).Column arr1 = s1.Range(s1.Range("$A$2"), s1.Cells(mRow, mCol)).Value For i = 1 To UBound(arr1, 1) For j = 1 To UBound(arr1, 2) If arr1(i, j) <> arr2(i, j) Then '塗りつぶし処理 's1.Cells(i + 1, j).Interior.Color = RGB(255, 0, 0) s1.Cells(i + 1, j).Interior.Color = mColor(k) 's2.Cells(i + 1, j).Interior.Color = RGB(102, 255, 51) s2.Cells(i + 1, j).Interior.Color = mColor(k) 'タブの色を塗りつぶしと同じ色に変更 s2.Tab.Color = mColor(k) End If Next Next '色見本のセルにシート名を記述 ThisWorkbook.Sheets("Sheet1").Cells(k + 1, "A").Value = s2.Name Set s2 = Nothing k = k + 1 Next 'Workbooks(FileName).Save Wb.SaveAs Left(FullPath, InStrRev(FullPath, "\")) & "【チェック済】" & FileName Set s1 = Nothing Set Wb = Nothing End Sub 色は元のままでいいよという場合はこちら Sub Test4() Dim Wb As Workbook Dim s1, s2 As Worksheet 'Worksheetsオブジェクト用 Dim i As Long, j As Long, sCount As Long Dim arr1 As Variant, arr2 As Variant Dim FullPath As Variant, FileName As String Dim mRow As Long, mCol As Long Dim mRng As Range FullPath = Application.GetOpenFilename(FileFilter:="Excelファイル,*.xls*") If FullPath = False Then Exit Sub End If Workbooks.Open FullPath FileName = Mid(FullPath, InStrRev(FullPath, "\") + 1) Set Wb = Workbooks(FileName) Set s1 = Wb.Worksheets(1) '比較元シート 'arr1 = s1.Range("$A$2:$W$548").Value 'arr1 = s1.Range(s1.Range("$A$2"), s1.Cells.SpecialCells(xlCellTypeLastCell)).Value For sCount = 2 To Wb.Sheets.Count Set s2 = Wb.Worksheets(sCount) '比較先シート 'arr2 = s2.Range("$A$2:$W$548").Value arr2 = s2.Range(s2.Range("$A$2"), s2.Cells.SpecialCells(xlCellTypeLastCell)).Value mRow = s2.Cells.SpecialCells(xlCellTypeLastCell).Row mCol = s2.Cells.SpecialCells(xlCellTypeLastCell).Column arr1 = s1.Range(s1.Range("$A$2"), s1.Cells(mRow, mCol)).Value For i = 1 To UBound(arr1, 1) For j = 1 To UBound(arr1, 2) If arr1(i, j) <> arr2(i, j) Then '塗りつぶし処理 s1.Cells(i + 1, j).Interior.Color = RGB(255, 0, 0) s2.Cells(i + 1, j).Interior.Color = RGB(102, 255, 51) End If Next Next Set s2 = Nothing Next 'Workbooks(FileName).Save Wb.SaveAs Left(FullPath, InStrRev(FullPath, "\")) & "【チェック済】" & FileName Set s1 = Nothing Set Wb = Nothing End Sub

関連するQ&A

  • 新しいワークブックのシートが指定できません

    エクセルでマクロを作成中です。 マクロの動作の中で新しいワークブック作成して、 その中のワークシートを指定してデータを入力したいのですが、 全て1つ目のシートに入力されてしまいます。 どのようにしたら2つ目以降のシートを指定できるのでしょうか? ソース Public Csvfile Public Csv_bk As Workbook Public Xls_bk As Workbook Public ch As Integer Public i As Integer Public LineCSV As Variant Public LineXLS As Variant Sub CSV_XLS() Set Csv_bk = Workbooks.Open(Csvfile) Set Xls_bk = Workbooks.Add ch = FreeFile Open Csvfile For Input As #ch i = 1 Do Until EOF(ch) Line Input #ch, LineCSV LineXLS = Split(LineCSV, ",") Xls_bk.Worksheets(1).Range(Cells(i, 1), Cells(i, UBound(LineXLS) + 1)) = LineXLS i = i + 1 Loop End Sub DO文の中のWorksheets(1)をWorksheets(2)にしても全て 1つ目のシートに入力されてしまいます。 上のソースでは全てのデータを同じシートに入力していますが、 実際にはWorksheets(n)として nを使ってデータをシート毎に振り分けたいと考えています。 Csvfileには別のフォームからファイル名を取得しています。

  • エクセル マクロ 範囲指定。

    先日、OKWAVEのサイトでエクセルマクロの質問をさせていただき 下記の回答を活用したいのでしが myKey = Worksheets("Sheet2").Range("A1").ValueをA1A2・・・A50のように 50個を一度に処理したいのですがどのように変更すればよろしいのでしようか 自分なりに調べてみましたが知識がなくできませんでした ご回答のいただいたmitarashiさんにお聞きしたいのですがお聞きする手段がわからず 再度、質問させていただきます。                       宜しくお願いいたします。 Sub test() Dim targetRange As Range Dim buf As Variant Dim i As Long, j As Long, myColorIndex As Long Dim myKey As Variant Application.ScreenUpdating = False Application.Calculation = xlCalculationManual Set targetRange = Worksheets("Sheet1").Range("J10:BB10000") buf = targetRange myColorIndex = 4 myKey = Worksheets("Sheet2").Range("A1").Value With targetRange For i = 1 To UBound(buf, 1) For j = 1 To UBound(buf, 2) If buf(i, j) = myKey Then .Cells(i, j).Interior.ColorIndex = myColorIndex Next j Next i End With Application.ScreenUpdating = True Application.Calculation = xlCalculationAutomatic End Sub

  • VBAでの差分比較のマクロの組み方について

    VBA初心者です。 シートCの開始ボタンを押下すると、シートAの表とシートBの表のセル内の数式を取得・比較して、シートCの表に差分箇所に色が付く。 ↑のような形で差分比較をするマクロを組みたいのですが、ネットで調べてもうまく作ることができませんでした。 組み方は色々あるかと思いますが、その一例をお教えいただけると幸いです。 よろしくお願いいたします。 (補足) シートAの表とシートBの表の形式は同一で、例えばそれぞれセルの(1,1)〜(150,50)まであるようなイメージです。

  • マクロボタンのシートをコピーしたいのですが。。。

    こんにちは。 たくさんあるファイルを一つのファイルにシート別にまとめるマクロを作成しました。 毎月同じことをするので、マクロボタンを作成したところ、作成したつきのボタンは正常に作動しますが、このシートを新しいBOOKにコピーして翌月分を作成したところ、マクロが消えてしまい、実行されません。 毎月のことなので、いちいち『前月のマクロをコピーして実行』などしないで、このボタンをコピーすればあとは押すだけ♪なんていう風にうまくいかないものでしょうか? かなり初心者な者で、上手な説明が出来ず申し訳ございません。 Sub 精算用5月() Dim fs As Variant Dim s As Variant Dim w As Workbook fs = Application.GetOpenFilename(Title:="select xls(s)", MultiSelect:=True) If Not IsArray(fs) Then Exit Sub For Each s In fs Set w = Workbooks.Open(Filename:=s) w.Worksheets(1).Copy after:=ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count) ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count).Name = Application.Substitute(w.Name, ".xls", "") w.Close savechanges:=False Next Worksheets(1).Range("A1").Formula = "=SUM(" & Worksheets(2).Name & ":" & Worksheets(Worksheets.Count).Name & "!A1)" End Sub 上記のマクロでボタンを作成しました。 よろしくお願いいたします。

  • マクロで色が同じになるように設定したい

    こんにちは。 現在マクロに挑戦中なのですが、一点分からず戸惑っています。 お分かりになる方教えてください。 下記のマクロを書きました。 Sheet2のセルに数字を入れることによってSheet1のセルの色が変わるようにしています。 25以上の数字は全て青(カラー番号5)表示にしたいのですが、どのように記したら良のか教えてください。 --------------------------------------------------------------- Private Sub Worksheet_Change(ByVal Target As Range) Dim iColors As Variant Dim i As Integer Dim j As Integer iColors = Array(36, 20, 24, 37, 40, 39, 17, 22, 45, 43, 28, 6, 4, 41, 18, 47, 50, 46, 10, 7, 3, 21, 9, 5) For Each c In Target If c.Value <> "" Then If IsNumeric(c.Value) Then i = c.Value If i > 0 And i < 25 Then j = iColors(i - 1) Else j = 2 End If End If End If i = c.Row If i > 2 And j > 0 Then Worksheets("Sheet1").Range("B3:K6").Cells(i - 3).Interior.ColorIndex = j End If Next c End Sub --------------------------------------------------------------- お分かりになる方、宜しくお願い致します。

  • エクセルで複数のシートに罫線を引くマクロを教えてください。

    エクセルで複数のシートに罫線を引くマクロを教えてください。 エクセルの表を担当者名でシート分割後、空白セル以外に罫線を引きたいのですが 複数シートに罫線を引くマクロを教えてください。 いくつか参考にさせていただき現状以下の様になっています。 元データというシートにAからGまで項目があります PJNo. PJ名 棟No. 棟名 取引先名  書類  担当者 1111 PJ1 10 棟1 取引先1  1 東京 1112 PJ2 11 棟2 取引先2  2 大阪 1113 PJ3 12 棟3 取引先3  3 名古屋 Sub 担当別シート作成() Application.ScreenUpdating = False For i# = 2 To Worksheets("元データ").Cells(2, 2).End(xlDown).Row j# = 1 '検索中の人のシートが既にできているかを判断する。 For Each sheet_name In Worksheets If sheet_name.Name = Worksheets("元データ").Cells(i, 7).Value Then j = 7 Exit For End If Next '検索中の人のシートがない場合、新規に作成する。 If j = 1 Then Worksheets.Add After:=Worksheets(Worksheets.Count) Worksheets(Worksheets.Count).Name = Worksheets("元データ").Cells(i, 7).Value For j = 1 To 7 Worksheets(Worksheets.Count).Cells(1, j).Value = Worksheets("元データ").Cells(1, j).Value Next j End If 'データのコピー For j = 7 To 1 Step -1 Worksheets(Worksheets("元データ").Cells(i, 7).Value). _ Cells(Worksheets(Worksheets("元データ").Cells(i, 7).Value). _ Cells(65535, 1).End(xlUp).Row + 1, j).Value = Worksheets("元データ").Cells(i, j).Value Next j Next i 'それぞれのシートの列幅を最適化します。 For Each sheet_name In Worksheets sheet_name.Columns("A:G").AutoFit Next '---- Dim c As Range Range("A1").Select Set c = Selection.SpecialCells(xlCellTypeLastCell) Range(Cells(1, "A"), c).Select (省略)以下罫線を引くマクロ End Sub

  • マクロで封筒を自動印刷

    マクロで封筒を自動印刷出来る様にファイルを作りました。 先日、そのマクロで封筒を印刷する前に 別のファイルの物を印刷しようと思い、そのファイルの印刷設定を変えて 印刷をしました。 その後、マクロで作ったファイルで封筒を印刷したところ 印刷設定がおかしくなってしまいました。 とりあえず、設定を直し何度かマクロで印刷を試みましたが いくら直して上書きしても印刷設定が直らず・・・・。 一度、PCを再起動して再び試みると印刷がきちんとされました。 この現象はマクロを使っているからなのでしょうか?? それともマクロの使い方が悪くて起きる症状なのでしょうか? 対策方法があれば教えて頂けるとうれしいです。 使っているマクロは次のとおりです。 Sub Futo_Copy() '////////////////////////////// '印刷を行う '////////////////////////////// Dim i As Integer Dim S_1 As String '1行目 Dim S_2 As String '2行目 Dim S_3 As String '3行目 Dim S_4 As String '4行目 Dim S_5 As String '5行目 Dim S_6 As String '6行目 Dim S_7 As String '7行目 Dim S_8 As String '8行目 Dim S_9 As String '9行目 Dim S_10 As String '10行目 Application.ScreenUpdating = False '描画をしない 'sheet_name = ActiveSheet.Name 'アクティブシート名を取得 'シートの中で使用されている最大の列を求める。 'row_count = Worksheets("印刷対象").Cells.Find("*", Range("A1"), , , xlByRows, xlPrevious).Row 'シートの中で使用されている最大の行を求める。 'col_count = Worksheets("印刷対象").Cells.Find("*", Range("A1"), , , xlByColumns, xlPrevious).Column row_count = Worksheets("印刷対象").Range("A65536").End(xlUp).Row For i = 3 To row_count '印刷対象の3行目からループ Worksheets("出力").Select 'データ取得 S_1 = Worksheets("印刷対象").Cells(i, 1) S_2 = Worksheets("印刷対象").Cells(i, 2) S_3 = Worksheets("印刷対象").Cells(i, 3) S_4 = Worksheets("印刷対象").Cells(i, 4) S_5 = Worksheets("印刷対象").Cells(i, 5) S_6 = Worksheets("印刷対象").Cells(i, 6) S_7 = Worksheets("印刷対象").Cells(i, 7) S_8 = Worksheets("印刷対象").Cells(i, 8) S_9 = Worksheets("印刷対象").Cells(i, 9) S_10 = Worksheets("印刷対象").Cells(i, 10) Worksheets("出力").Cells(1, 1) = S_1 Worksheets("出力").Cells(2, 1) = S_2 Worksheets("出力").Cells(3, 1) = S_3 Worksheets("出力").Cells(4, 1) = S_4 'Worksheets("出力").PrintPreview 'プレビュー Worksheets("出力").PrintOut 'プリントアウト Next i 'Worksheets("出力").Cells.Clear 'シートのクリア Application.ScreenUpdating = True '描画開始 Worksheets("印刷対象").Activate End Sub 出来ればこのマクロの形をあまり変えずに 症状が直せるといいのですが・・・。 よろしくお願い致します。

  • 行すべての値を張り付けるようにするには

    次の突合用マクロですが、照合番号だけでなく行すべてのデータを張り付けたいのですが、どの部分に変更を加えればよいかわかりません。 (添付画像をご覧ください) ・Sheet3~6にも列B~以降のデータを張り付けたい EntireRow Copy を使おうとしたのですが、どの様に行を指定すればよいかわかりませんでした。 ご教示頂ければ幸いです。 【準備して頂いたマクロ】 Sub TestX() Dim Sh1 As Worksheet, Sh2 As Worksheet Dim Sh3 As Worksheet, Sh4 As Worksheet Dim Sh5 As Worksheet, Sh6 As Worksheet Dim Sh1data As Variant, Sh2data As Variant Dim Sh3data As Variant, Sh4data As Variant Dim Sh5data As Variant, Sh6data As Variant Dim Sh1LastRow As Long, Sh2LastRow As Long Dim i As Long, j As Long, Sh5flg As Boolean Set Sh1 = Worksheets("Sheet1") Set Sh2 = Worksheets("Sheet2") Set Sh3 = Worksheets("Sheet3") Set Sh4 = Worksheets("Sheet4") Set Sh5 = Worksheets("Sheet5") Set Sh6 = Worksheets("Sheet6") ReDim Sh3data(0) ReDim Sh4data(0) ReDim Sh5data(0) ReDim Sh6data(0) Sh1LastRow = Sh1.Cells(Rows.Count, "A").End(xlUp).Row Sh2LastRow = Sh2.Cells(Rows.Count, "A").End(xlUp).Row Sh1data = Sh1.Range(Sh1.Cells(3, "A"), Sh1.Cells(Sh1LastRow, "B")).Value Sh2data = Sh2.Range(Sh2.Cells(3, "A"), Sh2.Cells(Sh2LastRow, "B")).Value For i = 1 To Sh1LastRow - 2 Sh5flg = False For j = 1 To Sh2LastRow - 2 If Sh1data(i, 1) = Sh2data(j, 1) Then If Sh2data(j, 2) <> "◯" Then Sh1data(i, 2) = "◯" Sh3data(UBound(Sh3data)) = Sh1data(i, 1) ReDim Preserve Sh3data(UBound(Sh3data) + 1) Sh2data(j, 2) = "◯" Else Sh5data(UBound(Sh5data)) = Sh1data(i, 1) ReDim Preserve Sh5data(UBound(Sh5data) + 1) Sh5flg = True End If Exit For End If Next j If Sh1data(i, 2) <> "◯" And Sh5flg = False Then Sh5data(UBound(Sh5data)) = Sh1data(i, 1) ReDim Preserve Sh5data(UBound(Sh5data) + 1) End If Next i For i = 1 To Sh2LastRow - 2 If Sh2data(i, 2) = "◯" Then Sh4data(UBound(Sh4data)) = Sh2data(i, 1) ReDim Preserve Sh4data(UBound(Sh4data) + 1) Else Sh6data(UBound(Sh6data)) = Sh2data(i, 1) ReDim Preserve Sh6data(UBound(Sh6data) + 1) End If Next Sh1.Range("A3").Resize(Sh1LastRow - 2, 2).Value = Sh1data Sh2.Range("A3").Resize(Sh2LastRow - 2, 2).Value = Sh2data Sh3.Range("A3").Resize(UBound(Sh3data), 1).Value = WorksheetFunction.Transpose(Sh3data) Sh4.Range("A3").Resize(UBound(Sh4data), 1).Value = WorksheetFunction.Transpose(Sh4data) Sh5.Range("A3").Resize(UBound(Sh5data), 1).Value = WorksheetFunction.Transpose(Sh5data) Sh6.Range("A3").Resize(UBound(Sh6data), 1).Value = WorksheetFunction.Transpose(Sh6data) Set Sh1 = Nothing Set Sh2 = Nothing Set Sh3 = Nothing Set Sh4 = Nothing Set Sh5 = Nothing Set Sh6 = Nothing End Sub

  • エクセルマクロ シート間の照合_上書き

    マクロ初心者です。(エクセル2003使用) Sheet2の管理番号をSheet1の管理番号と照合し、同じであれば、数量など3項目を上書きするマクロを作ろうとしています。 (Sheet1:日々更新される元データ)全データ数約500件くらい A列   ,B,  C,  D,   ・・・ 1行 管理番号,品名,注文数量,出荷数量,・・・ (Sheet2:上書きさせたいシート)全データ数約80件くらい G列   ,H,  I   J      9行 管理番号,品名,注文数量,出荷数量 ↑シート2にある管理番号をもとに数量などを照合&上書きをしたいのです。 ■シート1も2も行数は日々変動します。 ■シート1で、まれに同じ管理番号が2つ存在することがありますが、取り出したい数量などのデータは、常に1番目に照合する管理番号です。 Sub シート間照合と上書き() Dim i As Integer a = Worksheets("sheet1").Range("a65536").End(xlUp).Row For i = 2 To a If Worksheets("sheet1").Range("A2") = Worksheets("sheet2").Range("G9") Then Worksheets("sheet1").Cells(1, i) = Worksheets("sheet2").Range("G9") Worksheets("sheet1").Cells(2, i) = Worksheets("sheet2").Range("H9") Worksheets("sheet1").Cells(3, i) = Worksheets("sheet2").Range("I9") While Cells(1, i) <> "" i = i + 1 Wend End If Next End Sub ■上記 模索しながらマクロを作ってみたのですが、エラーにはならないのですが(F8)、まったく動きませんでした。 すみませんが、お力をかしてください。 よろしくお願いいたします。

  • Excel 指定順にシートの並び替え VBA

    http://okwave.jp/qa/q8383406.html 上記の続きになります。 Sub macro() Dim A As Variant, I As Integer A = Array("更新履歴", "統計", "全データ", "商品金額", "販売台数", "販売累計") For I = 0 To UBound(A) Worksheets(A(I)).Move after:=Worksheets(Worksheets.Count) Next I End Sub このようにシートを並び替えているのですが、 この中で”統計”シートが無かった場合、 更新履歴 全データ 商品金額 販売台数 販売累計 と並び替える方法はありますか? 配列に入っているシート名があったら、並び替える。 (無かったらそこは飛ばす) そういう方法はないのでしょうか? 回答よろしくお願い致します!

専門家に質問してみよう