VBAでの値と数式の比較でエラーが発生する原因と対処方法

このQ&Aのポイント
  • WindowsXPSP3EXCEL2007VBAを使用して、マクロでABookとBBookの同一番地のセルの書式(値と式)を比較し、違いがある場合にBBookのセルの色を変える処理を作成しました。しかし、実行時にエラーが発生して途中で止まってしまいます。
  • エラーが発生する原因としては、ws2とws3の定義が正しくされていないことが考えられます。ws2とws3はWorkbooks(bookname2)から取得されるべきですが、現在のコードでは明示的な定義が行われていません。
  • 解決策としては、ws2とws3を明示的に定義することでエラーを解消することができます。具体的には、ws2 = Workbooks(bookname2).Worksheets("明細")とws3 = Workbooks(bookname2).Worksheets("エラーセル")のように定義してください。また、エラー発生時にデバッグ情報を出力することで、問題をより具体的に特定することができます。
回答を見る
  • ベストアンサー

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初心者なので、大変申し訳ありませんが、どなたかお判りになる方は、教えて頂けないでしょうか?宜しくお願い申し上げます。

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

  • ベストアンサー
  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.1

実例が作りにくいので回答者側はやりにくい。自分で別途簡単な模擬実例でも作ってやってみて、原因個所を特定し それを挙げて質問すべきだ。 参考にならないかもしれないが ーー SpecialCells(xlCellTypeFormulas, xlLogical は使ったことが無いが、 http://moug.net/tech/exvba/0050114.html の後半にマニュアル的説明がある。 質問者はxlLogicalを使うことに自信あるのか? ●この行でどういうことがしたいか、文章で表現してみてください。 コードばかり書いて読者に行数の多いコードを読み解かすのは、時間を掛けさされるわけで配慮が足りないと思う。 ーー 質問では>ABookとBBookの同一番地の・・となっているが、同一ブックの別シートの比較のコードになってませんか <--Set ws2 = Workbooks(bookname2).Worksheets("明細") Set ws3 = Workbooks(bookname2).Worksheets("エラーセル") ーーー >Debug.Print b; の最後の;って必要? わたしが質問のコードを少し自分流にして実行してみたが、 a = ws2.Cellsx,y).SpecialC・・・の所で止まりますね。 ほんとにxlLogicalを使っているところはありそうですか? 上記WEB記事の >論理値が入力されているセルだけが対象になります。  数式の結果が論理値になっているセルは該当しません。 を参考に。

19560816
質問者

お礼

ほんとに皆さん有難う御座います。いまだ解決には至りませんが、参考にさせて頂きます。本当に有難う御座います。

関連する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とか・・・ どなたか、ご教授願います。宜しくお願い申し上げます。

  • 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 'マクロの終了

  • エクセル2007 参照セルの値が認識されない

    エクセル2007の環境で下記マクロを実行すると、 アクティブシートのセルA1に数字が入っている場合、Sheet1のセルA1に値を転記しても そのセルA1の値をVLOOKUP関数で参照できません。 マクロに問題があるためなのか何処に問題があるのか分からないので教えてください。 宜しくお願いいたします。 【sheet】は アクティブシートの3行目から1000行目までのA列のセルをクリックしたらセルA1に値を表示 その後、下記【モジュール】を使用し、 アクティブシートのセルA1が空白の場合、 A列の数値をSheet1のセルA1に転記し、アクティブシートのA列の数値が空白になるまで循環する。 Sheet1のセルA1の値をVLOOKUP関数で参照した内容を表示、印刷します。 ----------------------------------------------------------------- '【sheet】 Private Sub Worksheet_SelectionChange(ByVal Target As Range) With Target If .Count > 1 + IsEmpty(.Value) Then Exit Sub If Application.Intersect(.Cells, Range("A3:A1000")) Is Nothing Then Exit Sub ActiveSheet.Cells(1, 1).Value = .Value End With End Sub ----------------------------------------------------------------- '【モジュール】 Sub TEST() Dim myBtn As Integer Dim myMsg As String, myTitle As String Dim WS1 As Worksheet, WS2 As Worksheet Dim i As Long myMsg = "●●●" myTitle = "確 認" myBtn = MsgBox(myMsg, vbYesNo + vbExclamation, myTitle) If myBtn = vbYes Then Set WS1 = ActiveSheet Set WS2 = Sheet1 If WS1.Cells(1, 1).Value = "" Then With WS1 For i = 3 To 65536 If .Cells(i, 1).Value = "" Then Exit For WS2.Cells(1, 1).Value = .Cells(i, 1).Value WS2.Cells(1, 2).Value = ActiveSheet.Name 'WS2.PrintOut Copies:=1 Next i End With ElseIf WS1.Cells(1, 1).Value >= 1 Then WS2.Cells(1, 1).Value = WS1.Cells(1, 1).Value WS2.Cells(1, 2).Value = WS1.Name 'WS2.PrintOut Copies:=1 Else End If End If End Sub -----------------------------------------------------------------

  • EXCELのセルの値を表示する

    VB6.0を使っています。 エクセルのC5のセルに50という値が入っています。 この値をVBのメッセージボックスで見たいのですが 実行して見てみると 「50」ではなく何故か「0」と表示されてしまいます。 どうしてでしょうか? その部分のコードは下です。 Dim Wb As Excel.Workbook Dim Ws As Excel.Worksheet Dim Ea As Excel.Application Dim atai As Integer Set Wb = GetObject("C:\test\test.xls") Set Ea = Wb.Application Set Ws = Wb.Worksheets("Sheet1") atai = Ws.Cells(3, 5) MsgBox (atai)

  • 左のセルと違った値だけを、他のセルに書き込む

    ワークシートの任意の「G列とH列」において、G列の値と違っていたら、 P列にその違った値だけを書き込む。 「違った値」の選択まではなんとかできましたが、それからがどうも進みません。 何卒ご教示お願い致します。 ------------ Sub tes1() Dim r As Range, base As Range Dim x, y Dim i Set r = Selection Set base = Selection.Cells(1, 1) x = r.Columns.Count y = r.Rows.Count Selection.RowDifferences(ActiveCell).Select ・ ・ --------------- G   H ・・・・P 98   94   98 101  101    91   95   91 69   69 71   71 99   95   99 89   89 94   94 67   67 68   64   68

  • VBA 値、セル操作

    お世話になります [現状] 実行させると 1列目を残して2列づつ処理をさせています Sub Macro1() Dim idxR, idxC, ptr As Integer Dim ws As Worksheet Set ws = ActiveSheet Worksheets.Add after:=ws ptr = 2 With ws .Rows(1).Copy Destination:=Range("A1") For idxR = 2 To .Range("A65536").End(xlUp).Row Cells(ptr, "A").Value = .Cells(idxR, "A").Value For idxC = 2 To 255 Step 2 If .Cells(idxR, idxC) = "" Then Exit For Else .Cells(idxR, idxC).Resize(1, 2).Copy Destination:=Cells(ptr, "B") ptr = ptr + 1 End If Next idxC Next idxR End With End Sub [判らないこと] 前7列を残して(A:G) 8列目から(H列)より9列づつ処理をさせたいのですが判らなく大変困っております。 どなたかご教授よろしくお願いします。

  • エクセルのVBAの記述について

    VBAの記述についてなのですが、 Sub filter() Dim gyo As Long Dim ws1 As Worksheet Dim ws2 As Worksheet Dim ws3 As Worksheet Set ws1 = Worksheets("データ") Set ws2 = Worksheets("チーム") Application.ScreenUpdating = False ws2.Range("A4:BH30").Clear gyo = ws1.Range("A65536").End(xlUp).Row ws1.Activate With ws1.Range(Cells(4, 1), Cells(gyo, 6)) .AutoFilter Field:=1, Criteria1:="A" .SpecialCells(xlCellTypeVisible).Copy ws2.Range("A4") Selection.AutoFilter End With Application.ScreenUpdating = True End Sub ならプログラムははしるのですが、 14行目を .SpecialCells(xlCellTypeVisible).Copy ws2.Range(Cells(4, 1)) だと 「実行時エラー 1004 Rangeメソッドは失敗しました Worksheet オブジェクト」 とでるのですが、出来ないのでしょうか? Cells(4, 1)の1のところを変数にして変えていきたいのですが、よい方法はありますか。 よろしくお願いいたします。

  • エクセルで入力シートから別シートに転記・蓄積について

    エクセルVBAで入力シートのA1:D5(5行)の範囲を別シート(DBシート)の転記・蓄積させる方法を教えてください。また、入力データがA1:A5(1行)のときもあれば、A1:D5(5行)の場合ですが・・・ Sub test01() Dim ws1 As Worksheet, ws2 As Worksheet Dim x As Long, y As Long Set ws1 = Sheets("入力") Set ws2 = Sheets("DB") x = ws2.Cells(Rows.Count, "A").End(xlUp).Row + 1 y = ws1.Cells(Rows.Count, "A").End(xlUp).Row ws1.Cells(1, "A").Resize(y, 4).Copy ws2.Cells(x, "A") End Sub の場合、数式等、入力値すべてが転記となってしまいます。 値だけ転記する方法はありませんか? 宜しくお願いいたします。

  • セルの内容の比較について

    こんにちは。 業務用の簡単なチェックプログラムを作っています。 基本データに扱い商品、日々売上に実際に売れた商品、結果にそれらを照合したデータを書き込むとします。 Private Sub button_Click() Dim i As Integer Dim n As Integer Dim x As Integer Range("A1:B1000").ClearContents n = 1 x = 1 For i = 1 To 1000 If Worksheets("日々売上").Cells(i, 1) = "" Then Exit For End If If Worksheets("基本データ").Cells(x, 1) = Worksheets("日々売上").Cells(n, 2) Then Worksheets("結果").Cells(x, 1).Value = Worksheets("日々売上").Cells(n, 2) Worksheets("結果").Cells(x, 2).Value = Worksheets("日々売上").Cells(n, 7) n = n + 1 x = x + 1 Else n = n + 1 End If Next i End Sub 基本データのシートには、あらかじめ抽出したい商品コードと商品名が書かれていて、日々売上のシートの内容と比較しながら、合致した場合はその商品を結果のシートに書き出すと言う感じです。 エラーは出ないのですが、なぜか途中で基本データの行番号数値の変数xが止まってしまい、最後まで照合出来ません。 初歩的なプログラムですが、どうぞよろしくお願い致します。

  • テキストの値を、セルの値に取り込みたい。

    すみません。誰か教えて頂けませんか。 エクセルの値を、テキストファルに出力する事が出来たのですが、 この値を、同じセル位置に取り込み操作をマクロで記述したいのですが、 どうやっても分かりません。 誰か教えて頂けませんでしょうか。 出力記述を下記に記入させて頂きます。 Sub 記録() Dim myFileNo As Integer Dim i As Long Dim y As Long Dim myLastRow As Long Dim IMA As String IMA = Format(Now, "yyyy.mm.dd.ss") & ".txt" Worksheets("Sheet1").Activate myLastRow = Range("A51").CurrentRegion.Rows.Count myFileNo = FreeFile Open "D:¥" & IMA For Output As myFileNo For i = 50 To 64 For y = 1 To 64 Write #myFileNo, Cells(i, y), Next y Next i Close #myFileNo End Sub 空欄と値はカンマ区切りで出力されます。 すみません、宜しくお願いします。

専門家に質問してみよう