プロが教える店舗&オフィスのセキュリティ対策術

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

A 回答 (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
    • good
    • 0
この回答へのお礼

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

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

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

お礼日時:2008/01/05 21:37

こんにちは。



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

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

こんにちは。



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

お礼日時:2008/01/05 21:28

ループの中でbは1ずつ、dは2ずつ増やしていますね。

ループは何回、回りますか? bかdの値が256以上になりそうです。

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

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

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

Do While j < 261

b = 21
d = 43

Do While i < 11

お礼日時:2008/01/05 21:19

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!