重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

先日、VBAで大量データ比較・照合するのに、対象の行数を3万から5万に変更するために、「Integerをlongに変更する」という修正を教えていただき実行しました。
(参照URL https://oshiete.goo.ne.jp/qa/11440285.html

Integerをlongに変更後、今回は添付画像のようなエラーが発生するようになりました。
前任者から引き継いだフォーマットを使用しており、VBAやコンピューターの知識がないため修正方法がわからないのですが、ご教示いただけましたら幸いです。

▼▼▼▼▼▼▼Integerをlongに変更後のVBA▼▼▼▼▼▼▼
Sub ボタン1_Click()

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'変数宣言
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

'縦軸ループ用変数
Dim iY As Long
'横軸ループ用変数
Dim iX As Long

'ループ用カウンタ
Dim iCounter As Long
'位置保持用カウンタ
Dim iYCounter As Long

'並び変え用配列
Dim strArrayData(1, 50000) As String

'文字列整理用汎用変数
Dim strTmpString As String

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'変数初期化
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'3行目の値
iY = 3
'B列の値
iX = 2

'汎用文字列
strTmpString = ""

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'メイン処理
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'データを取り込む
'ループ処理
For iY = 3 To 50000
'データ取得
strTmpString = Trim(Cells(iY, iX).Value)
'データチェック
If strTmpString <> "" Then
'値が入ってる場合のみデータを格納する。
strArrayData(0, iY - 3) = strTmpString
End If
Next iY

'比較対象データを取り込む
iX = 2
For iY = 3 To 50000
'データ取得
strTmpString = Trim(Cells(iY, iX + 1).Value)
'データチェック
If strTmpString <> "" Then
'値が入ってる場合のみデータを格納する。
strArrayData(1, iY - 3) = strTmpString
'右側の行の値を消す。
Cells(iY, iX + 1).Value = ""
End If
Next iY

''''''''''''''''''''''''''''''''''''''''
'比較作業開始
''''''''''''''''''''''''''''''''''''''''

'ループしてチェック
For iY = 3 To 50000
'値が空の場合は処理を抜ける
If strArrayData(0, iY - 3) = "" Then
'カウントの保持
iYCounter = iY + 1
'Forループを抜ける
Exit For
End If
'二重ループにてチェック
For iCounter = 0 To 50000
'値の比較
If strArrayData(0, iY - 3) = strArrayData(1, iCounter) Then
'同じ値で有れば左の元の値の横に並べる
Cells(iY, iX + 1).Value = strArrayData(1, iCounter)
'配列の中の値を消去する。
strArrayData(1, iCounter) = ""
End If
Next iCounter
Next iY

'照合出来なかった値を末尾に書き出す。
For iCounter = 0 To 50000

'データ吐き出し
If strArrayData(1, iCounter) <> "" Then
'値が有る場合のみ値出力
Cells(iYCounter, iX + 1).Value = strArrayData(1, iCounter)
'排出用カウンタインクリメント
iYCounter = iYCounter + 1
End If
Next iCounter

End Sub

「【追加質問】Excel VBAで大量デー」の質問画像

A 回答 (1件)

これはエラー表示じゃなくて、エラーがでた行ですね。


実際にどんなエラーがでているのかわかりません。

多分、データ取得するセルの値に問題があると思う。エラーになっているとか。

メニューの
表示 → イミディエイトウィンドウ
で「イミディエイトウィンドウ」で、
? iY
と入力して下さい。数字が出ると思います。
ここで表示された数字の行のC列のセルがエラーになっていませんか?

とりあえず、上記確認を。
(勉強の意味も兼ねて、なんとなく原因を知っておくのも良いと思うので)

で、そのエラーセルを修正する(削除する)と動くと思います。


が・・・50000万件もあるデータでマクロが止まるたびにエラーセルを確認して修正するのは手間でしょうから
エラーセルがあったら処理を無視する1行を突っ込んでみましょう。

On Error Resume Next

↑コレです。

この辺に突っ込んでみるといいのかな?
(一部抜粋、編集)

''''''''''''''''''''''''''''''''''''''''
'比較作業開始
''''''''''''''''''''''''''''''''''''''''
'エラーを無視
On Error Resume Next
'ループしてチェック

これで処理が最後まで動くんじゃないかな、と思います。


参考記事

[ VBA ] エラーを無視して処理を継続する ( On Error Resume Next ) – 行け!偏差値40プログラマー
http://hensa40.cutegirl.jp/archives/967
    • good
    • 0
この回答へのお礼

早々のご回答ありがとうございます。
ご指摘の通り、C列にエラー(#N/A)がありました!

また、アドバイスいただきました
'エラーを無視
On Error Resume Next
を追加しました。

VBAやコンピューターの知識がないことを考慮いただき、大変わかりやすいご説明をありがとうございました。
大変助かり、そして大変勉強になりました。
また何かありましたらどうぞよろしくお願いいたします。

お礼日時:2020/01/15 12:48

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