• ベストアンサー

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

kkkkkmの回答

  • kkkkkm
  • ベストアンサー率65% (1636/2481)
回答No.6

> 【チェック済】の記載を入力ファイル名の前へ追加した出力ファイル名で出す事は可能でしょうか? 'Workbooks(FileName).Save のところを Wb.SaveAs Left(FullPath, InStrRev(FullPath, "\")) & "【チェック済】" & FileName に変更すれば可能です。 > また、チェックするセル範囲を"$A$2:$W$548"と指定していますが、範囲はデータが入っているセル領域とする事はかのうでしょうか?修正で行が増える事があります。 A2からが範囲だとして 'arr1 = s1.Range("$A$2:$W$548").Value を arr1 = s1.Range(s1.Range("$A$2"), s1.Cells.SpecialCells(xlCellTypeLastCell)).Value に 'arr2 = s2.Range("$A$2:$W$548").Value を arr2 = s2.Range(s2.Range("$A$2"), s2.Cells.SpecialCells(xlCellTypeLastCell)).Value に変更してください。 あと、色をシート毎に変更したい場合は計算で色を変更することも可能だと思いますが、その場合好みの色にならない可能性もあります。 変更する可能性がある回数をある程度決めておいて、たとえば10回まではないだろうという場合10回までの色を最初から決めておいてマクロを実行するブックの利用しないセルをその色で色見本的に塗りつぶしておきます。 マクロを実行するブックのSheet1のA1からA10までを好みの色であらかじめ塗りつぶしておき 以下コードを実行すると差分比較してシート毎にセルの色とタブの色を色見本の上から順に設定していき、色見本のセルにその色がどのシートで使われたのか分かるようにシート名を記載していきます。 タブの色と色見本のシート名はどちらかだけでいいとは思いますが、タブの色は変更できないとかあれば色見本のシート名もあったら二つのブックをちょっとずらして見れば便利かなと思ったりします。 と余計なお世話をしてみたコードです。 元のコードの状態を保ったまま変更しています。 Sub Test2() 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 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

関連する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 このようにシートを並び替えているのですが、 この中で”統計”シートが無かった場合、 更新履歴 全データ 商品金額 販売台数 販売累計 と並び替える方法はありますか? 配列に入っているシート名があったら、並び替える。 (無かったらそこは飛ばす) そういう方法はないのでしょうか? 回答よろしくお願い致します!