• ベストアンサー

A、Bさんが記入した明細をクロスチェックするマクロ

EXCEL2007でAさんが記入した売上と明細のBOOKがあります。また、Bさんが記入した売上と明細のBOOKがあります。同じフォルダーにあります。Aさんの明細とBさんの明細をマクロでクロスチェックをかけ、BさんのBOOKに”Sheet1"を新たに作成して、Aさんの明細を正解として、Bさんの明細と比較して違いをBさんの明細に色を付けて、新たに作成した”Sheet1"にも色を付けたいのですが、下記のマクロでは上手く動作しません。どうしたら動作するのでしょうか?ご教授願います。10月5日までには、上司に見せなくてはならないので、初めてですが、どうか宜しくお願い致します。 Option Explicit Dim bookname1, bookname2 As String Dim sheetname1, sheetname2, sheetname3 As String Sub 管理部様式Aの比較() Dim a, b, d, e a = MsgBox("比較元のAを指定して下さい。", vbOKCancel) If a = 2 Then End End If b = Application.Dialogs(xlDialogOpen).Show If b = False Then End End If On Error Resume Next bookname1 = ActiveWorkbook.Name Workbooks(1).Activate d = MsgBox("比較されるBを指定して下さい。", vbOKCancel) If d = 2 Then End End If e = Application.Dialogs(xlDialogOpen).Show If e = False Then End End If On Error Resume Next bookname2 = ActiveWorkbook.Name Dim ws1 As Object Dim ws2 As Object Set ws1 = Workbooks(bookname1).Worksheets("明細") 'シートの名前をストリングとして変数ws1に代入する Set ws2 = Workbooks(bookname2).Worksheets("明細") 'シートの名前をストリングとして変数ws2に代入する Dim i As Integer, j As Integer, k As Integer, l As Integer, x As Integer, y As Integer 'カントの変数 i = Application.InputBox(Prompt:="比較したいセルの列方向の一番初めの列数値を入力して下さい左上隅(A,B,・・・)の数値", Type:=1) If i <> False Then End If j = Application.InputBox(Prompt:="比較したいセルの列方向の一番終りの列数値を入力して下さい右上隅(AA,AB,・・・)の数値", Type:=1) If j <> False Then End If k = Application.InputBox(Prompt:="比較したいセルの行方向の一番初めの行数値を入力して下さい左上隅(1,2,・・・)の数値", Type:=1) If k <> False Then End If l = Application.InputBox(Prompt:="比較したいセルの行方向の一番終りの行数値を入力して下さい左下隅(11,12,・・・)の数値", Type:=1) If l <> False Then End If '================================================================================== Sheets.Add After:=Worksheets(Sheets.Count), Count:=1 'sheet1を作成終了。 Dim ws3 As Object Set ws3 = Workbooks(bookname2).Worksheets("Sheet1") 'bookname2のWorksheetsの名前をSheet1としている。 '================================================================================== Dim c As Integer c = 0 For y = k To l For x = i To j If ws1.Cells(y, x).Value = ws2.Cells(y, x).Value Then '値が一致した場合何もしない。 Else ws2.Cells(y, x).Interior.ColorIndex = 3 '================================================================================== Worksheets("Sheet1").Select Range(y, x).Select ws3.Cells(y, x).Interior.ColorIndex = 3 '================================================================================== c = c + 1 End If '比較の判定終了。 Next x Next y '================================================================================== If c > 0 Then MsgBox "エラーが" & c & "セルあります。" 'Debug.Print c; Else MsgBox "終了" 'マクロの終了をWindows標記で示す End If ErrorHandler: End Sub 'マクロの終了

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

  • ベストアンサー
回答No.1

>上手く動作しません。 では解りませんよ。どの部分でこんなエラーになる とか、〇〇の値が □□になってしまう とか説明しないと。 回答者に全部デバッグしてもらおうというのは無理じゃないですか。 パッと見たところでは、BookやSheetのActiveの切り替えが意図したとおりに なっているのかなぁ、とは気になりました。

yumi-ei-23
質問者

お礼

ご回答どうもありがとうございます。別の手段で解決しました。ホントありがとうございます。今後ともよろしくお願い申しあげます。

yumi-ei-23
質問者

補足

haichicchi様、何せ、初めて質問させて頂く者なのでルールも読みましたが、大変失礼しました。今後は、もっとマナーを守る様にしたいと考えておりますので、ご容赦願います。また、ご指摘どうも有難う御座いました。現象としては、BさんのBOOKには、新しいい”Sheet1"は出来ます。しかしBさんの明細には、色は付きますが、この新しいい”Sheet1"に色が付かないと言う現象がでております。私的には、ご指摘の様に以下の部分で================================================================================== Worksheets("Sheet1").Select Range(y, x).Select ws3.Cells(y, x).Interior.ColorIndex = 3 '================================================================================== >BookやSheetのActiveの切り替えが意図したとおりになっているのかなぁ、とは気になりました。 BookやSheetのActiveの切り替えが意図した通りになっていないと私も考えております。 〉回答者に全部デバッグしてもらおうというのは無理じゃないですか。 と言うつもりは全くありません。ただ、情報は、沢山あった方が良いと思い、こんなに書込みさせて頂きました。今後は、もっと完結に投稿させて頂きたく考えておりますので、お気持ちを害した事は心よりお詫び申し上げます。これに懲りずに、ご回答頂ける助かります。本当に申し訳なく宜しくお願い申し上げます。また、実際に動作するように、ご指摘の程宜しくお願い申し上げます。

関連するQ&A

  • EXCEL2007のマクロで2つのBOOKを比較

    EXCEL2007のマクロでABook,BBookと2つのBookのセルを比較して、数値が違うセルがある場合、BBookの方に新しいsheetを作成して、このsheetのA列に数値が違うセルの番地を、新しいsheetのA1、A2・・・と埋めていくマクロは作成する事は出来るでしょうか?因みに新しいsheetを作成するマクロまでは、出来ました。しかし、新しいsheetのA1、A2と書き込んでいくと、クリップボードの値がA1、A2、・・・入ってしまいます。 Dim ws1 As Object Dim ws2 As Object Dim ws3 As Object Dim co As Integer, ro As Integer, e As Integer Set ws1 = Workbooks(bookname1).Worksheets("明細") Set ws2 = Workbooks(bookname2).Worksheets("明細") Set ws3 = Workbooks(bookname2).Worksheets("エラーセル") If ws1.Cells(y, x).Value = ws2.Cells(y, x).Value Then Else ws3.Cells(e).Select ActiveCell.FormulaR1C1 = "A,e+1" End If マクロの骨格はこんな感じですけど、後は、Forループで回せば良いと考えております。 ActiveCell.FormulaR1C1 = "A,e+1"の部分が良く分かりません。 どの様にすれば、新たに作成したsheetのA1に数値が違うセルの番地例えばE5と入れる事が出来るのでしょうか、それもE5一つだけではなく沢山あります。G7とか・・・ どなたか、ご教授願います。宜しくお願い申し上げます。

  • Excel マクロ 重複チェックについて

    Excel マクロ 重複チェックについて Sheet3のA列とB列に製品番号が入っています。 A列とB列を比較して、A列と同じ番号がB列に2個以上ある場合のみ C列にフラグ「1]を入れたいです。 Sub RetsuCheck() Dim i As Long Dim ws1 As Worksheet Set ws1 = Worksheets("Sheet3") '「Sheet3」シートでA列とB列の重複をチェック。 For i = 2 To ws1.Cells(Rows.Count, 1).End(xlUp).Row If ws1.Cells(i, "A") = ws1.Cells(i, "B") Then ws1.Cells(i, "C") = 1 End If Next i End Sub 1個の場合には上記マクロで解決するのですが、 2個以上の場合にどうようなマクロを記載すればよいのか アドバイスを頂けませんでしょうか。 よろしくお願いいたします。

  • カットして隣のB列に順番にペーストするマクロ

    発注と納品の確認マクロを作成しました。 Sheet1の列を検索して、Sheet2にあればその数字のあるセルを赤くするのですが、 それを以下のように変更することは可能でしょうか? Sheet1の列を検索して、Sheet2にあれば、Sheet2上でその数字をカットして隣のB列に上から順番にペーストします。 宜しくお願いします。 Sub 発注と納品の確認マクロ() Dim Ws1 As Worksheet Dim Ws2 As Worksheet Dim myRange1 As Range Dim myRange2 As Range Dim c1 As Range Dim c2 As Range Dim myCt As Long Set Ws1 = Worksheets("Sheet1") Set Ws2 = Worksheets("Sheet2") Set myRange1 = Ws1.Range("A1", Ws1.Cells(Rows.Count, "A").End(xlUp)) Set myRange2 = Ws2.Range("A1", Ws2.Cells(Rows.Count, "A").End(xlUp)) For Each c1 In myRange1 myCt = 0 For Each c2 In myRange2 If c2.Value = c1.Value Then If myCt = 0 Then c2.Interior.ColorIndex = 3 Else c2.Interior.ColorIndex = 43 End If myCt = myCt + 1 End If Next c2 If myCt = 0 Then c1.Interior.ColorIndex = 6 Next c1 Set Ws1 = Nothing Set Ws2 = Nothing Set myRange1 = Nothing Set myRange2 = Nothing End Sub

  • エクセルのマクロについて教えていただきたいのですが・・・

    見積書を作成しているんですが、1枚目のシート(見積書)に明細が書ききれなかった時に、マクロを実行すると、『明細書』と言う名前のシートが(1)~(5)枚目まで追加され、各シートの小計を1枚目のシートに書き出す・・・と言うマクロを作りたいのですが、うまくいかずに困っています>< 追加されるシートの元となる『見積もりマスター』と言うシートがあって、そのシート内でそれぞれのシートの小計は取れるのですが・・・ 下記のマクロの中に何か追加すればうまくいく方法はありますか?? (明細書は追加する時もあれば追加しない時もあってその都度、使う人が、最大5枚まで何枚追加するかを決めるそうです。) Sub Macro1() Dim cnt As Integer Dim wkNum As Double Dim ws As Worksheet  For Each ws In Worksheets   If Left(ws.Name, 4) = "明細書(" Then    If IsNumeric(Mid(ws.Name, 5, 1)) Then     wkNum = Val(Mid(ws.Name, 5, 1))     If cnt < wkNum Then      cnt = wkNum     End If    End If   End If  Next ws  If cnt >= 5 Then   MsgBox ("明細書シートが既に5枚以上あるため追加できません")   Exit Sub  Else   Sheets("明細マスター").Copy after:=Sheets(Worksheets.Count)   ActiveSheet.Name = "明細書(" & cnt + 1 & ")"  End If End Sub マクロ自体をあまり理解できてなくて、会社の人や、ここで教えていただいて進めているので、出来ればそのままコピーして使用できるようにしていただけるとありがたいです。 よろしくお願いします。

  • ABookとBBookの同一セルが値か式かを比較

    環境:WindowsXPSP3EXCEL2007VBA:マクロでABookとBBookの同一番地のセルの書式(例:値とは20などのただの値をさします。 数式とは=SUM(A1:A10)などの式で記述された事をさします。)を比較して、違いがあれば、BBookのセルの色も変えます。新たに作成したBBookのsheetにセル番地を書き込みます。これをマクロで作成しましたが、比較の部分で実行時にエラーも無しに止まってしまいます。以下の記述では、駄目でしょうか。何処が悪いのでしょうか?ご教授願います。宜しくお願いもうし上げます。 Private Sub 定数か数式の比較(ii, jj, kk, ll, c, g) Dim y As Integer, x As Integer Dim a As Boolean, b As Boolean Dim ws2 As Object Dim ws3 As Object Set ws2 = Workbooks(bookname2).Worksheets("明細") Set ws3 = Workbooks(bookname2).Worksheets("エラーセル") MsgBox "値か数値の比較に入りました。" For y = kk To ll For x = ii To jj MsgBox "(1)ループに入りました。" MsgBox "(2)SpecialCells(xlCellTypeFormulas, xlLogical)に入りました。" a = ws2.Cells(y, x).SpecialCells(Type:=xlCellTypeFormulas, Value:=xlLogical).Activate Debug.Print a; b = ws3.Cells(y, x).SpecialCells(Type:=xlCellTypeFormulas, Value:=xlLogical).Activate Debug.Print b; If a <> b Then g = g + 1 Debug.Print g; ws2.Cells(y, x).Interior.ColorIndex = 4 ws3.Cells(g, "A") = Cells(y, x).Address(RowAbsolute:=False, ColumnAbsolute:=False) MsgBox "(3)緑に塗り終わりました。" c = c + 1 End If Next x Next y End Sub MsgBox "(2)SpecialCells(xlCellTypeFormulas, xlLogical)に入りました。" の部分で止まってしまいます。引数はキチンと渡っています。イミディエイトウィンドウで確認しました。VBA初心者なので、大変申し訳ありませんが、どなたかお判りになる方は、教えて頂けないでしょうか?宜しくお願い申し上げます。

  • 配列表示と間引き

    配列の間引きをを教えて下さい。 下記文を書きました Sub 配列() Dim u As Integer '左 Dim v As Integer '中 Dim w As Integer '右 Dim x As Integer '左 Dim y As Integer '中 Dim z As Integer '右 Dim row As Integer '行カウンタ Dim col As Integer '列カウンタ Dim intSheet As Integer 'シートカウンタ Dim blnNextPage As Boolean '次シートフラグ '初期値セット u = 1 v = 2 w = 3 x = 4 y = 5 z = 5 row = 0 col = 1 intSheet = 1 Do While (1) 'zカウント z = z + 1 If z > 20 Then 'zが20以上ならy+1 y = y + 1 If y > 19 Then 'yが20以上ならx+1 x = x + 1 If x > 18 Then 'xが20以上ならy+1 w = w + 1 If w > 17 Then 'wが20以上ならx+1 v = v + 1 If v > 16 Then 'wが20以上ならx+1 u = u + 1 '終了条件 If (x = 19 And y = 19 And z = 20) Then Exit Do 'v初期化 = x+1 v = u + 1 End If 'w初期化 = y+1 w = v + 1 End If 'x初期化 = x+1 x = w + 1 End If 'y初期化 = y+1 y = x + 1 End If 'z初期化 = y+1 z = y + 1 End If If z > 20 Then Exit Sub '行カウント row = row + 1 If row > 1000 Then '1000で次の列か次のページへ If blnNextPage Then '行・列カウンタ初期化 col = 1 row = 1 '次のシートへ intSheet = intSheet + 1 '次のシートが無い場合は追加 If intSheet > Worksheets.Count Then Sheets.Add After:=Worksheets(Worksheets.Count) End If 'シートをアクティブに Worksheets(intSheet).Select 'フラグ消去 blnNextPage = False Else '次の列へ col = col + 6 row = 1 'blnNextPage = True End If End If If col = 6 * 3 + 1 Then blnNextPage = True End If 'データ表示 Worksheets(intSheet).Range(Chr(64 + col) & row).Cells = u Worksheets(intSheet).Range(Chr(64 + col + 1) & row).Cells = v Worksheets(intSheet).Range(Chr(64 + col + 2) & row).Cells = w Worksheets(intSheet).Range(Chr(64 + col + 3) & row).Cells = x Worksheets(intSheet).Range(Chr(64 + col + 4) & row).Cells = y Worksheets(intSheet).Range(Chr(64 + col + 5) & row).Cells = z Loop End Sub 上記文で表示をしますが、 6列目までの間に3列の連数字の時には表示を行わず、次に移る様にしたいのですが、どうすれば良いでしょうか? 1,2,5,6,10,12はOKです 1,2,3,5,6,10又は1,3,4,5,10,11等3連の数字は表示を行わない。

  • シート名をループに

    質問を簡単にする為に以下のマクロがあるとします。 シート名が1~31とあるのですが、これをfor loopで 使うにはinteger等の定義が違うのでしょうか。 Sub bbb() Dim ws As Worksheet Dim 曜日 As String Dim i As Integer For Each ws In Worksheets For i = 1 To 31 If ws.Name = i Then  <----------ここでエラー  (コマンド) End If Next i Next End Sub

  • VLookupで一致しなかった時のVBAでの処理

    On Error ~を使わないで、 VLookup()で一致しなかった時の処理をさせたいのですが どのように記述すればよいでしょうか。 例えば、以下のようなコードの場合、 一致したデータがない時にyに-1を代入するには 以下のコードをどのように記述すればよいのでしょうか。 --------------------- Dim x As Integer Dim y As String x = 7 y = Application.WorksheetFunction.VLookup(x, Worksheets("Sheet1").Range("A1:B100"), 2, False) --------------------- 以下はいずれもエラーになりますが、以下のような感じで処理がしたいです。 --------------------- If IsError(Application.WorksheetFunction.VLookup(x, Worksheets("Sheet1").Range("A1:B100"), 2, False)) Then  y = -1 Else  y = Application.WorksheetFunction.VLookup(x, Worksheets("Sheet1").Range("A1:B100"), 2, False) End If --------------------- If Application.WorksheetFunction.IsNA(Application.WorksheetFunction.VLookup(x, Worksheets("Sheet1").Range("A1:B100"), 2, False)) Then  y = -1 Else  y = Application.WorksheetFunction.VLookup(x, Worksheets("Sheet1").Range("A1:B100"), 2, False) End If --------------------- y = Application.WorksheetFunction.IfError(Application.WorksheetFunction.VLookup(x, Worksheets("Sheet1").Range("A1:B100"), 2, False), -1) --------------------- なお、以下のように本来エラーではない処理で On Error Resume Nextを使うのは、 本当のエラーの処理と混同するため不可 --------------------- On Error Resume Next y = Application.WorksheetFunction.VLookup(x, Worksheets("Sheet1").Range("A1:B100"), 2, False) If Err <> 0 Then y = -1 On Error GoTo 0 ---------------------

  • ファイルオープン時のマクロが一部実行されない

    いつも回答して頂き、ありがとうございます。感謝感謝です。 ファイルオープン時にApplication.Runで3つのマクロを実行させているのですが、最後のマクロだけ実行されません。どうしてでしょうか?もしかして、前の2つで『一覧シート』を除外するマクロを実行しているからでしょうか?御指導の程宜しくお願いいたします。 1番目に実行するマクロ Sub 特定のシート以外の最終履歴と次回予定日を算出する() Dim ws As Worksheet For Each ws In Worksheets If ws.Name <> "一覧" Then If ws.Name <> "メニュー" Then Dim c As Integer c = 3 Do While ws.Cells(2, c).Value <> "" With ws.Cells(6, c) .FormulaR1C1 = "=MAX(R8C:R10000C)" If .Value = 0 Then .Value = "履歴無し" ws.Cells(7, c).ClearContents Else .Value = .Value ws.Cells(7, c) = DateAdd("d", ws.Cells(5, c), DateAdd("m", ws.Cells(4, c), DateAdd("yyyy", ws.Cells(3, c), ws.Cells(6, c)))) End If End With c = c + 1 Loop End If End If Next End Sub 2番目に実行するマクロ Sub 期限の未達と到達を色で分ける() Dim ws As Worksheet For Each ws In Worksheets If ws.Name <> "一覧" Then If ws.Name <> "メニュー" Then Dim c As Long Dim res As Variant For c = 3 To ws.Cells(7, Columns.Count).End(xlToLeft).Column If IsDate(ws.Cells(7, c)) Then If ws.Cells(7, c) > Date Then res = 8 Else res = 3 End If Else res = xlNone End If ws.Cells(7, c).Interior.ColorIndex = res Next c End If End If Next End Sub 3番目に実行するマクロ Sub 各シートの情報を一覧へ転記する() Dim d As Integer Dim retu As Integer d = 3 Do While Cells(d, 2).Value <> "" With Worksheets(Worksheets("一覧").Cells(d, 2).Value) .Activate retu = .Range("IV7").End(xlToLeft).Column .Range(Cells(7, 3), Cells(7, retu)).Copy End With With Worksheets("一覧") .Activate Cells(d, 3).PasteSpecial Paste:=xlPasteAllExceptBorders, Operation:=xlNone, _ SkipBlanks:=False, Transpose:=False Application.CutCopyMode = False End With d = d + 1 Loop End Sub

  • エクセル マクロ:チェックボックス コピー3

    前回、質問した件で、追加で質問させていただきます。 前回の質問は、sheet2のチェックボックスによって、sheet1の列をコピーして、sheet3にペーストするという内容でした。 keithin様からご回答いただき問題は解決しましたが、修正を加えなくてはならなくなりました。 sheet2のチェックボックスによってsheet1の列とsheet4の列をコピーして、sheet3にペーストしようと頑張りましたが、解決できそうにありません。 尚、sheet1とsheet4の行数は同じで、sheet1とsheet4のA列は同じ内容なので必要ありません。 下記が前回のベストアンサーです。 private sub CommandButton1_Click()  dim res as range  dim rmax as long  dim i as integer  dim flg as boolean  rmax = worksheets("Sheet1").range("B1").end(xldown).row  set res = worksheets("Sheet1").range("A1:A" & rmax)  for i = 1 to 20   if worksheets("Sheet2").oleobjects("CheckBox" & i).object.value then    set res = union(res, worksheets("Sheet1").range("A1:A" & rmax).offset(0, i))    flg = true   end if  next i  if not flg then  msgbox "NO CHECK"  exit sub  end if  res.copy  worksheets("Sheet3").range("A1").pastespecial paste:=xlpastevalues  worksheets("Sheet3").select end sub keithin様 無断で借用させていただきました。申し訳ございません。

専門家に質問してみよう