社内での重複チェックツールを作っています。
セル関数で対応していましたが、以下理由でマクロでないと厳しいため試行錯誤中です。
・行数は不定で、使うときに足りない分を関数を付け足す作業はしたくない
・関数を埋め込んだ場合、ファイルサイズが大きすぎて開かない&再計算でフリーズ
・マクロにしたはいいが、結果が遅い(量が量だから仕方ない?)
以下処理ですが、
スピードが今一歩と感じています。
アドバイス頂ければ、幸いです。
データは現状5万ちょっとが最大です。
基本配列を使って比較すればいいのですが、デバッグしてると20秒位かかり、
ハングアップしてるか不安になり、escすると止まるので動いてはいますが、
量が多いからこんなもんでしょうか?
やりたいことは1つずつ比較して、2つ以上ある箇所の隣に×をして更に隣のセルに該当データを出力させます。
そして、フィルターを掛けて抽出できるようにします。
これをボタンを押したら、ファイルを選ばせてチェックが始まるという流れです。
以下試しのコードです(比較箇所だけ)
sub test
Set targetRng = Range("A1:a50000")
For Each Rng In targetRng
For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row
If Rng = Cells(i, 1) Then
cnt1 = cnt1 + 1
End If
Next
If cnt1 > 1 Then
Rng.Offset(0, 1) = "×"
End If
cnt1 = 0
Next
end test
No.3ベストアンサー
- 回答日時:
あなたが提示されたマクロでは、約50000×25000回のセルの参照を行っています。
このようなケースでは、dictionary(連想配列)を使うと、劇的に早くなります。
dictionaryを使うとセルの参照は、5万回で済みます。
又、セルの更新(×の設定)に時間がかかるので、配列で処理し、配列の内容を一気にセルへ転送すると更にはやくなります。
提示されたマクロをみると、
1.データは1行目から開始している。
(通常は1行目は見出しで、データは2行から始まるが、そうではない)
2.チェックするのはA列で、A列に同じ内容のセルが2つ以上ある場合は、
そのセルの右隣のB列に×を設定する。
上記の仕様であってますか。
それであっているなら、その仕様に従って、重複の行に×を設定するマクロを提供することは可能です。
こちらの環境でデータ5万件で確認したとき
1.dictionaryを使用し、該当セルに×を個別に設定すると、約8秒で完了
2.dictionaryを使用し、配列にB列の内容を格納し、配列で処理した結果をB列に戻すと、約1秒で完了
となっています。
マクロの提供が必要であれば、その旨、補足してください。
(又、仕様が違っていれば、その旨補足してください。1行目が見出しのケース等)
お返事ありがとうございます。
dictionaryでのコードを教えて頂けますか?
以下流れです。
重複チェックは全ての項目ではなく、フラグがあるものが対象です。
別シートにある実データを行終端までチェックする。
データの開始行はファイルによって変わるが、ファイルごとに専用のマクロを作るので、そこを意識する必要はない(終端はチェック必須)。
例えば14行目から6万行目までを各行で重複チェックする。
専用のシートがあり、チェック結果はそこに都度出力。
2つ以上見つかった場合は、チェックシートのその行と同じ行に数と対象データが何かを出す(フォーマットはデータ元と同じ)。
1つでも重複があれば、インデックス行(13行目)をオレンジに変える(条件付き書式は実証済み)
別シートのチェック結果は重複有無に関わらず、出力させる(重複がない場合は、全部1になる)。
次の対象フラグへ続く。
以上になります。
No.7
- 回答日時:
No3です。
補足ありがとうございました。
補足を読んだのですが、具体的なマクロにするためには、更に詳しい情報が必要になります。下記の件、お願いできますでしょうか。
1.別シートのレイアウトがわかりません。具体的なレイアウトを画像で提示していただけませんでしょうか。特に、フラグの列と重複チェックデータのある列が不明です。又、シート名も提示してください。
2.チェック結果を出力するシートのレイアウトを画像で提示していただけませんでしょうか。又、シート名も提示してください。
3.重複チェックは全ての項目ではなく、フラグがあるものが対象ということですが、具体的に例を挙げて説明していただけませんでしょうか。
又、「次の対象フラグへ続く。」ということの意味が分かりません。
それも、含めて、説明をお願いします。
以上、よろしくお願いいたします。
No.5
- 回答日時:
こんばんは
VBA自体が決して速いとは言えませんし、速度はPCの性能やメモリにも影響されますので、一概には言えませんけれど・・・
VBAで、多少なりとも速度向上を目指すなら、
・処理ロジックの効率化
・シートへのアクセス回数の削減
等があげられます。
その他にも、検索すればよく見かける
・スクリーン更新の停止
・関数等の計算やイベント処理の一時停止
等もありますけれど。
既に指摘があるように、ご提示のコードの処理方法はあまり効率の良いものとは言えないように思われます。
>デバッグしてると20秒位かかり~
ご提示のコードで50000件を20秒で処理できるのなら、かなり高スペックの処理速度と言えると思います。
(当方の環境では、ご提示のコードでは50000件を30分以上かかっても処理できなかったため中断しました。)
一方で、以下のように処理方法を変えれば、それなりに速度向上が見込めると思います。
(多分、No3様の回答と類似した方法かと思います。)
ちなみに、こちらであれば、当方の環境でも0.34秒程度で50000件の処理が終わります。
ご説明文のうち
>~箇所の隣に×をして更に隣のセルに該当データを出力させます。
「更に隣のセルに」とある処理が、ご提示のコードには見当たらないので、内容が不明なため無視しました。
以下は、重複のあるセルのB列に「×」を表示するだけのものです。
ご参考までに。
Sub test()
Dim d, v
Dim rmax As Long, i As Long
Set d = CreateObject("Scripting.Dictionary")
rmax = Cells(Rows.Count, 1).End(xlUp).Row
v = Cells(1, 1).Resize(rmax).Value
For i = 1 To rmax
If d.exists(v(i, 1)) Then d.Item(v(i, 1)) = 2 Else d.Add v(i, 1), 1
Next i
For i = 1 To rmax
If v(i, 1) <> "" Then
If d.Item(v(i, 1)) = 1 Then v(i, 1) = "" Else v(i, 1) = "×"
End If
Next i
Cells(1, 2).Resize(rmax).Value = v
End Sub
>デバッグしてると20秒位かかり~、
すいません。これは嘘でした。
実際は1つの項目チェックに約10分かかります。
dictionaryは使い方が分かってないのもありますが、今回のに応用するのはややこしくなりそうなので、納期もあるので処理時間が掛かってもいいから自分で追えるのを試そうかと試行錯誤中です。
No.4
- 回答日時:
「更に該当データを出力させます」のところが不明ですが、単に重複チェックならcountif関数入れればいいです。
「関数を付け足す作業はしたくない」ってことですが、計算式のコピーに手間は要りません。https://media.yayoi-kk.co.jp/4340/
ファイルサイズが問題ならx付けた後で計算式を削除すればいいです。
もし、どこと重複しているかを隣のセルに書き出すとかするならVBAで二重ループになりますが、
For i = 1 To 最終行
For j = i + 1 To 最終行
とすれば計算量は半分になります。j < i の場合の比較は実施済みなので。
No.2
- 回答日時:
>スピードが今一歩と感じています
こういう、どこまでやっているのかわからないときには
イミディエイトウィンドウに途中結果を表示する
がいいでしょう 適当なところに Debug.Printを使います。
これにより、コードの実行中に変数や計算の途中結果を確認することができます。
If i Mod 5000 = 0 then
Debug.Print "現在の値は " & i
のようにすれば 5000件ごとに 表示されます。
Visual Basic でイミディエイトウィンドウを表示させてから やってください。
No.1
- 回答日時:
>>量が多いからこんなもんでしょうか?
以前、エクセルファイルで、マクロ等で処理していて終わるまで40分くらいかかっているものがありました。
あまりに時間がかかるのと、入力で間違っている個所について、人の目で再チェックする必要があり、間違ったデータが残ってしまうので、VBAでチェック処理を追加して、作り直したことがありました。
それで、処理時間が短くなったけど、それでも20分程度かかっていました。
この時は、「処理対象にすべきデータをうまく絞り込めば、もっと速く終わるのでは?」と考えて処理の流れを見直すことで、最終的には5分くらいで終わるようにできました。
ただ、処理内容によっては、そんな工夫ができないこともあると思います。
その場合、「エクセルVBAでの処理はこんなものだ」と諦めるしかないのかもしれません。
ちなみに、もっと処理スピードを速くしたい場合、C#でプログラミングすると可能になると思いますけど、普通の方には無理でしょうね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBA listBoxについて 2 2024/03/26 16:14
- Visual Basic(VBA) Excel VBA マクロ あるフォルダー内の複数のファイルを統合したいです 1 2024/02/19 21:37
- Visual Basic(VBA) ExcelVBAでDo Until loopのネスト、IF文を使って一致する物と一致しない物としたい 11 2022/12/24 17:46
- Visual Basic(VBA) Excel VBA 文字列のセルを反映させたいです 2 2024/02/24 00:06
- Visual Basic(VBA) 合計数量から引いていく 1 2023/08/29 19:53
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- Visual Basic(VBA) xmlドキュメントから別拡張子で保存したい 4 2023/09/12 11:08
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Excel(エクセル) (マクロ)vlookupの元データを同じブックのシートではなく、別のブックに設定したい 1 2024/06/02 10:03
- Visual Basic(VBA) マクロのエラー 5 2024/01/19 19:50
このQ&Aを見た人はこんなQ&Aも見ています
-
見学に行くとしたら【天国】と【地獄】どっち?
みなさんは、一度だけ見学に行けるとしたら【天国】と【地獄】どちらに行きたいですか? 理由も聞きたいです。
-
人生最悪の忘れ物
今までの人生での「最悪の忘れ物」を教えてください。 私の「最悪の忘れ物」は「財布」です。
-
【お題】逆襲の桃太郎
【大喜利】桃太郎が1回鬼退治に失敗したところから始まる新作昔話「リベンジオブ桃太郎」にはこんなシーンがある
-
【選手権お題その1】これってもしかして自分だけかもしれないな…と思うあるあるを教えてください
「出身中学と出身高校が混ざったような校舎にいる夢を見る」「まぶたがピクピクしてるので鏡で確認しようとしたらピクピクが止まってしまう」など、 これってもしかして自分だけかもしれないな…と思うあるあるを教えてください
-
【大喜利】【投稿~1/20】 追い込まれた犯人が咄嗟に言った一言とは?
【お題】追い込まれた犯人が咄嗟に言った一言とは?
-
Visualbasicの現状について教えてください
Visual Basic(VBA)
-
【ExcelVBA】dictionaryの重複判断の基準(セル結合だと違う値として認識される)
Visual Basic(VBA)
-
VBAでセルの書式を変えずに文字列を置換する方法をご教示ください
Visual Basic(VBA)
-
-
4
IF文、条件分岐の整理方法
Visual Basic(VBA)
-
5
サブフォルダに格納されているファイルを、ファイル名ごとに条件分岐させたい
Visual Basic(VBA)
-
6
Cのプログラムからアクセスできないファイル名の一括変更方法
C言語・C++・C#
-
7
時間短縮のために、テキストファイルの入出力をメモリを使って出来ないですか?
Visual Basic(VBA)
-
8
文系のSE志望です。プログラミングを今から習得したいのですが、初めて学ぶのにオススメの言語があれば教
その他(プログラミング・Web制作)
-
9
ExcelVBA修正のお願い
Visual Basic(VBA)
-
10
VBAコードのインデント表示
Visual Basic(VBA)
-
11
プログラマーは誘惑にさらされる人生?
その他(プログラミング・Web制作)
-
12
VBA初心者です。次のVBAコードで、17行目を削除したいのですがうまく動きません 改善策を教えてく
Visual Basic(VBA)
-
13
VBA コードどこがおかしいですか?
Visual Basic(VBA)
-
14
これて逆じゃないですか?
C言語・C++・C#
-
15
プログラミング言語について
その他(プログラミング・Web制作)
-
16
VBAのエラー表示の対処法について
Visual Basic(VBA)
-
17
VBAなくなるの?
Visual Basic(VBA)
-
18
ExcelVBAマクロで実行した時の疑問
Visual Basic(VBA)
-
19
今ってプログラミング言語は何が中心?
C言語・C++・C#
-
20
プログラミングを学ぼうと思います。 1ヶ月程度である程度習得できる言語は何ですか?ブラウザ上でアプリ
その他(プログラミング・Web制作)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・「みんな教えて! 選手権!!」開催のお知らせ
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~1/20】 追い込まれた犯人が咄嗟に言った一言とは?
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・【選手権お題その3】この画像で一言【大喜利】
- ・【お題】逆襲の桃太郎
- ・自分独自の健康法はある?
- ・最強の防寒、あったか術を教えてください!
- ・【大喜利】【投稿~1/9】 忍者がやってるYouTubeが炎上してしまった理由
- ・歳とったな〜〜と思ったことは?
- ・ちょっと先の未来クイズ第6問
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・【選手権お題その2】この漫画の2コマ目を考えてください
- ・【選手権お題その1】これってもしかして自分だけかもしれないな…と思うあるあるを教えてください
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルVBAで在庫の組み換え処...
-
VBAから書き込んだ条件付き初期...
-
WindowsのOutlook を VBA から...
-
【ExcelVBA】5万行以上のデー...
-
【VBA】 結合セルに複数画像と...
-
VBA Application.Matchについて...
-
Excel マクロについて詳しい方...
-
VBAでセルの書式を変えずに文字...
-
【ExcelVBA】値を変更しながら...
-
Excel VBA 選択範囲の罫線色の...
-
[VB.net] ボタン(Flat)のEnable...
-
VBA 最終行の取得がうまくいか...
-
ExcelのVBAコードについて教え...
-
VBA 同じフォルダ内のすべての...
-
Vba 型が一致しません(エラー1...
-
[Excel VBA]特定の条件で文字を...
-
VBAでCOPYを繰り返すと、処理が...
-
【マクロ】オートフィルターに...
-
Excelのマクロについて教えてく...
-
VBA 円グラフ 特定条件に一致し...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAについて教えて下さい
-
ExcelのVBAコードについて教え...
-
ExcelのVBAコードについて教え...
-
【ExcelVBA】5万行以上のデー...
-
VBA Application.Matchについて...
-
Excelのマクロについて教えてく...
-
Excel VBAについて。こんな動作...
-
Excelの数式について教えてくだ...
-
ExcelのVBAコードについて教え...
-
VBA 同じフォルダ内のすべての...
-
不要項目の行削除方法について
-
Vba 型が一致しません(エラー1...
-
【マクロ】オートフィルターに...
-
【VBA】 結合セルに複数画像と...
-
VBAで特定の文字が入った行をコ...
-
ExcelのVBAコードについて教え...
-
VBAでセルの書式を変えずに文字...
-
VBAのエラー表示の対処法について
-
Excelのマクロについて教えてく...
-
Excel マクロについて詳しい方...
おすすめ情報