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
No.3ベストアンサー
- 回答日時:
質問者ののマナーとして、こんなの回答者に読ませて、処理内容を割り出させるのでなく、どのセル範囲とどのセル範囲をくらべて、どういうロジック(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
大変失礼な質問の仕方で申し訳ありません。
それにもかかわらず回答していただきありがとうございます。
正解の表が以下のように並んでまして(×はとうし番号、○は数値)
× × × ・・・
○ ○ ○ ・・・
○ ○ ○ ・・・
× × × ・・・
○ ○ ○ ・・・
○ ○ ○ ・・・
・・・
入力データが以下のように並んでいます
× × × × × ・・・
○ × ○ × ○ ・・・
○ × ○ × ○ ・・・
× × × × × ・・・
○ × ○ × ○ ・・・
○ × ○ × ○ ・・・
・・・
データは10列260行程度づつ並んでいるというもので、
さらにとうし番号を探して正解なら指定の場所に1足す
というものを作りたかったのです。
回答していただいたものをまだ試していませんが、
本当に申し訳ありませんでした。
No.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 まで。
こんなところですね。
この質問は、ちょっと、回答者側の負担が大きいです。
No.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 以下はありませんから、実行時エラーが発生します。
ありがとうございます。
演算の計算過程間違っていました。
そして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
No.1
- 回答日時:
ループの中で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
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) Excelで下記のようにマクロを作ったところ、一回目は実行できたのですが、二回目以降「実行時エラー1 1 2022/03/25 08:08
- Visual Basic(VBA) オブジェクトが見つかりません 1 2023/06/24 19:43
- Excel(エクセル) なぜExit Subがあるのかわかりません 4 2023/02/19 12:34
- Excel(エクセル) VBAの指示の内容 昨日こちらでご教示頂いたのですが初心者な為、一つ一つの指示が何をやっているのかわ 2 2022/10/25 18:08
- Visual Basic(VBA) vbaを早くしたい 5 2022/09/09 10:58
- Visual Basic(VBA) VBA処理追加 こちらでご教示頂いたのですが回答完了させてしまいましたのでこちらからまた質問させてく 2 2022/10/27 09:57
- Visual Basic(VBA) エラーコード1004 6 2022/06/09 14:12
- Visual Basic(VBA) VBAコードが作動せず、どこに問題があるのか教えて下さい。 3 2023/06/13 13:20
- Excel(エクセル) R列の1111/11/11以外、且つQ列の×の条件で該当行のAからAE列までオレンジに塗りつぶす 2 2022/07/02 10:18
- Visual Basic(VBA) VBAで実行時エラー'424' オブジェクトが必要ですと出る 2 2022/10/07 09:25
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセル マクロ オートフィ...
-
excel 小さすぎて見えないセル...
-
excelのデータで色つき行の抽出...
-
エクセルで特定の文字列が入っ...
-
【Excel関数】UNIQUE関数で"0"...
-
結合されたセルをプルダウンの...
-
[EXCEL]ボタン押す→時刻が表に...
-
エクセル 上下で列幅を変えるには
-
アクティブになっている行をマ...
-
特定の文字がある行以外を削除...
-
AのセルとB行を比較して、一致...
-
Excel グラフのプロットからデ...
-
EXCELで最後の行を固定
-
セルの色によって条件文をつけ...
-
エクセル マクロ等を利用した各...
-
Excel2007で、指定範囲の行高さ...
-
エクセル マクロで数値が変っ...
-
Excelマクロ 期間を指定してデ...
-
貼り付けた数式を最終行まで繰...
-
Excel VBA アクティブセルから...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで特定の文字列が入っ...
-
エクセル マクロ オートフィ...
-
【Excel関数】UNIQUE関数で"0"...
-
[EXCEL]ボタン押す→時刻が表に...
-
結合されたセルをプルダウンの...
-
エクセル マクロで数値が変っ...
-
Excel グラフのプロットからデ...
-
AのセルとB行を比較して、一致...
-
エクセル 上下で列幅を変えるには
-
Excel ウインドウ枠の固定をす...
-
特定の文字がある行以外を削除...
-
excelのデータで色つき行の抽出...
-
エクセル2016で時間を入力して...
-
excel 小さすぎて見えないセル...
-
EXCELで最後の行を固定
-
エクセルVBA 最終行を選んで並...
-
VBAで色の付いているセルの行削除
-
エクセルマクロで偶数行(又は...
-
エクセルのセルに指定画像(.jpg...
-
罫線の斜線を自動で引くマクロ
おすすめ情報