こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

投稿日時 - 2008-01-05 16:11:41

QNo.3652264

すぐに回答ほしいです

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

質問者ののマナーとして、こんなの回答者に読ませて、処理内容を割り出させるのでなく、どのセル範囲とどのセル範囲をくらべて、どういうロジック(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

投稿日時 - 2008-01-05 18:03:42

お礼

大変失礼な質問の仕方で申し訳ありません。
それにもかかわらず回答していただきありがとうございます。
正解の表が以下のように並んでまして(×はとうし番号、○は数値)
× × × ・・・
○ ○ ○ ・・・
○ ○ ○ ・・・
× × × ・・・
○ ○ ○ ・・・
○ ○ ○ ・・・
・・・

入力データが以下のように並んでいます
× × × × × ・・・
○ × ○ × ○ ・・・
○ × ○ × ○ ・・・
× × × × × ・・・
○ × ○ × ○ ・・・
○ × ○ × ○ ・・・
・・・

データは10列260行程度づつ並んでいるというもので、
さらにとうし番号を探して正解なら指定の場所に1足す
というものを作りたかったのです。
回答していただいたものをまだ試していませんが、
本当に申し訳ありませんでした。

投稿日時 - 2008-01-05 21:37:52

ANo.3

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.4

こんにちは。

#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 まで。

こんなところですね。
この質問は、ちょっと、回答者側の負担が大きいです。

投稿日時 - 2008-01-06 13:21:25

ANo.2

こんにちは。

>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 以下はありませんから、実行時エラーが発生します。

投稿日時 - 2008-01-05 17:30:27

お礼

ありがとうございます。
演算の計算過程間違っていました。
そして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

投稿日時 - 2008-01-05 21:28:05

ANo.1

ループの中でbは1ずつ、dは2ずつ増やしていますね。ループは何回、回りますか? bかdの値が256以上になりそうです。

Office2003までは列数は256までしかないので、あり得ないセルを指定するためではないですか?

デバッグモードになったときにb,dの変数にカーソルを合わせると値が見られますので、確認してください

投稿日時 - 2008-01-05 16:57:44

お礼

ありがとうございます。
dとbの変数を定義する場所間違えてました。
dとbは10回ループしたかったので以下のようにしました。

Do While j < 261

b = 21
d = 43

Do While i < 11

投稿日時 - 2008-01-05 21:19:54

あなたにオススメの質問