- ベストアンサー
VBA マクロ エラー1004 アプリケーション定義またはオブジェクト定義のエラー
VBAで正当表と入力表の正誤判定を一気に行いたいのですが If Cells(a, b).Value = Cells(c, d).Value Thenの部分で エラー1004、アプリケーション定義またはオブジェクト定義のエラーと出てしまいます。 エラーの対処の仕方を調べたのですがわかりませんでした。 教えていただけるとありがたいです。 以下作ったプログラムです。 Sub 正誤判定() Dim a Dim b Dim c Dim d Dim e Dim i Dim j Dim x Dim y Dim hokan Dim ytate Dim xyoko a = 3 b = 21 c = 3 d = 43 e = 2 i = 1 j = 1 Do While j < 261 Do While i < 11 If Cells(a, b).Value = Cells(c, d).Value Then a = a + 1 c = c + 1 If Cells(a, b) = Cells(c, d) Then hokan = Cells(e, b).Value ytate = Range("B2:S15").Find(hokan, lookat:=xwhole).Row + 15 xyoko = Range("B2:S15").Find(hokan, lookat:=xwhole).Column Cells(ytate, xyoko).Value = Cells(ytate, xyoko).Value + 1 Else End If Else End If a = a - 1 c = c - 1 b = b + 1 d = d + 2 i = i + 1 Loop a = a + 3 c = c + 3 e = e + 3 j = j + 1 Loop End Sub
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
質問者ののマナーとして、こんなの回答者に読ませて、処理内容を割り出させるのでなく、どのセル範囲とどのセル範囲をくらべて、どういうロジック(3行おきとか)でどう比較してとかを、文章で判りやすく解説したものを載せるべきだ。解読時間がかかってしょうがない。 それに行数・列数を少なくしたモデル例を作って、そのコードで質問すべきだ。回答者でテスト実例を作ろうにも列・行が多いと作っていられない。 回答者は質問者の職場などでの義務付けられ教育役ではないから、それぐらい質問者ですべきだ。 ーー コード作成スキルとして 少し読み解くと変数を乱発しすぎだと思う。そのため解読が難しい。 列と行を表すi,j2つだけで2重ループで繰り回しできそうに思う。 それに1行下を見るときIf Cells(a + 1, b) =で良いのに、一旦足して、処理後1引いてもとへ戻すなど複雑になるばかりだ。 >b = b + 1 d = d + 2 はなぜ不統一なのか理解できなかった。 ーー #1のご回答でOKならもう良いが、でなければ (1)Range("B2:S15") (2)U3-AP(?)XX ?? 22列? (3)AQ3-BL(?) XX ?? 22列? 3行ごとにまとめて考えて、第1行が等しく、かつ第2行が等しければ、第1行の語句で、Range("B2:S15").を探し、直下行と等しいかチェック。 など文章で読者に教えてよ。 ーー 私が短くしようとしてやった結果。途中で放棄したので動かないだろうが、コードについて、私の言い分に耳を傾ける気があるなら参考にしてください。 コードをすっきりさせれば、自ずとエラー原因は判る、エラーは無くなると思う。 Sub test01() '--初期化 '--U3 a = 3 'cells(a,b) b = 21 '---AQ3 c = 3 'cells(c,d) d = 43 '-- For j = 3 To 260 Step 3 For i = 1 To 10 Step 2 If Cells(a, b).Value = Cells(a, b + 22).Value Then '1行下行を見る If Cells(a + 1, b) = Cells(a + 1, b + 22) Then '下行も等しければ、 hokan = Cells(a, b).Value ytate = Range("B2:S15").Find(hokan, lookat:=xwhole).Row + 15 xyoko = Range("B2:S15").Find(hokan, lookat:=xwhole).Column Cells(ytate, xyoko).Value = Cells(ytate, xyoko).Value + 1 Else End If Else End If b = b + 1 ' ??? d = d + 2 ' ??? Next i '-- Next j End Sub
その他の回答 (3)
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 #2の回答者です。 お急ぎなのは分かるのですが、#3のimogasiさんのご指摘のとおり、とても、ちょっとでは、一つずつ数値を入れて、数値の状態を追いかけていくのは、回答者側では、これ以上、エラーを修正するのは、可能なことは可能ですが、回答者側が、試行錯誤で、これはダメです、それはダメです、という繰り返しになってしまうのです。(もしかしたら、出来る人がいるかもしれませんが、その時は、その方にお任せします。) 今回は、Offset プロパティを一切使わずに、Cellsプロパティの引数の増減で、セルを動かしているので、余計にややこしいです。 2例: ------------------------------- If Cells(a, b).Value = Cells(c, d).Value Then If Cells(a, b).Offset(1).Value = Cells(c, d).Offset(1).Value Then ------------------------------- Set r = Range("B2:S15").Find(hokan, LookAt:=xlWhole) If Not r Is Nothing Then r.Offset(15).Value = r.Offset(15).Value + 1 End If それと、このコードは、もともとインクリメンタルなのですから、Do ~ Loop 型で増減するよりも、For i = .. To __ 型のほうがよいです。 一種の数列なので、次のセル、その次のセル.... というような動きを、言葉で説明していただいたほうがよいのです。コードでは追いきれない部分があります。最後がどこまで行くのか見えないのです。 最終的には、プログラム上で、数列を作ってあげるだけのことです。 レイアウトも、端に、並びだけでは、解読できないのです。 #3の回答のお礼の中の説明では、良く分からないので、マクロから解読した範囲ですと、 データは、 U2 ~AE260 か? 2行目は、おそらくは項目名か? 照合データは、AQ2 ~BI260 ? (または、~ BI262) 一つおきに、2行を照合をしていくということは分かりました。 カウントするのは、項目名 C19 ~C33 まで。 こんなところですね。 この質問は、ちょっと、回答者側の負担が大きいです。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 >Range("B2:S15").Find(hokan, lookat:=xwhole).Row + 15 × lookat:=xwhole lookat:=xlWhole >If Cells(a, b).Value = Cells(c, d).Value Then のエラーは、 >a = a - 1 >c = c - 1 >b = b + 1 >d = d + 2 >i = i + 1 列数より前に、Cells の引数の演算の過程の計算違っていませんか? a は、最初に3 を入れたわけですね。 だから、i が、4 になれば、a =0, c = 0 になるのですから、Cells(a, b) は、0 以下はありませんから、実行時エラーが発生します。
お礼
ありがとうございます。 演算の計算過程間違っていました。 そしてxwholeの指摘もありがとうございます。 一行したの値を比べてまた戻してというのをやりたかったのです。 以下のようにしてみました。 If Cells(a, b).Value = Cells(c, d).Value Then a = a + 1 c = c + 1 If Cells(a, b) = Cells(c, d) Then … a = a - 1 c = c - 1 Else End If Else End If
- zap35
- ベストアンサー率44% (1383/3079)
ループの中でbは1ずつ、dは2ずつ増やしていますね。ループは何回、回りますか? bかdの値が256以上になりそうです。 Office2003までは列数は256までしかないので、あり得ないセルを指定するためではないですか? デバッグモードになったときにb,dの変数にカーソルを合わせると値が見られますので、確認してください
お礼
ありがとうございます。 dとbの変数を定義する場所間違えてました。 dとbは10回ループしたかったので以下のようにしました。 Do While j < 261 b = 21 d = 43 Do While i < 11
お礼
大変失礼な質問の仕方で申し訳ありません。 それにもかかわらず回答していただきありがとうございます。 正解の表が以下のように並んでまして(×はとうし番号、○は数値) × × × ・・・ ○ ○ ○ ・・・ ○ ○ ○ ・・・ × × × ・・・ ○ ○ ○ ・・・ ○ ○ ○ ・・・ ・・・ 入力データが以下のように並んでいます × × × × × ・・・ ○ × ○ × ○ ・・・ ○ × ○ × ○ ・・・ × × × × × ・・・ ○ × ○ × ○ ・・・ ○ × ○ × ○ ・・・ ・・・ データは10列260行程度づつ並んでいるというもので、 さらにとうし番号を探して正解なら指定の場所に1足す というものを作りたかったのです。 回答していただいたものをまだ試していませんが、 本当に申し訳ありませんでした。