
社内での重複チェックツールを作っています。
セル関数で対応していましたが、以下理由でマクロでないと厳しいため試行錯誤中です。
・行数は不定で、使うときに足りない分を関数を付け足す作業はしたくない
・関数を埋め込んだ場合、ファイルサイズが大きすぎて開かない&再計算でフリーズ
・マクロにしたはいいが、結果が遅い(量が量だから仕方ない?)
以下処理ですが、
スピードが今一歩と感じています。
アドバイス頂ければ、幸いです。
データは現状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も見ています
-
【ExcelVBA】dictionaryの重複判断の基準(セル結合だと違う値として認識される)
Visual Basic(VBA)
-
Visualbasicの現状について教えてください
Visual Basic(VBA)
-
VBAでセルの書式を変えずに文字列を置換する方法をご教示ください
Visual Basic(VBA)
-
-
4
VBA初心者です。次のVBAコードで、17行目を削除したいのですがうまく動きません 改善策を教えてく
Visual Basic(VBA)
-
5
Cのプログラムからアクセスできないファイル名の一括変更方法
C言語・C++・C#
-
6
VBA コードどこがおかしいですか?
Visual Basic(VBA)
-
7
プログラミングを学ぼうと思います。 1ヶ月程度である程度習得できる言語は何ですか?ブラウザ上でアプリ
その他(プログラミング・Web制作)
-
8
VBA 2次元配列の出力
Visual Basic(VBA)
-
9
VBAのエラー表示の対処法について
Visual Basic(VBA)
-
10
更新前と更新後の差分をVBAを使って抜き出したい
Excel(エクセル)
-
11
Web画面の文字をVB6で取得したい
Visual Basic(VBA)
-
12
[Excel VBA]特定の条件で文字を削除&残す処理をするファイルを作成したいです
Visual Basic(VBA)
-
13
VBAのループ処理について教えてください
Visual Basic(VBA)
-
14
VBA Application.Matchについての質問です
Visual Basic(VBA)
-
15
VBA 入力箇所指定方法
Visual Basic(VBA)
-
16
(マクロ)値を返す時は subでもfunctionでもどちらでも良いのでしょうか?
Excel(エクセル)
-
17
プログラミングの進学について
その他(プログラミング・Web制作)
-
18
c++の勉強方法を教えてくださいプログラミングをやった事がなく1から勉強を始めようと思います1日1時
C言語・C++・C#
-
19
プログラミング言語でアプリやゲームweb制作をしようと思っております。色んなプログラミング言語がある
C言語・C++・C#
-
20
大容量があつかえるソフトを探しています
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
質問58753 このコードでうまく...
-
【マクロ】並び替えの範囲が、...
-
以下のプログラムの実行結果は...
-
vbs ブック共有を解除
-
【マクロ】売上一覧YYYYMMDDHHS...
-
【マクロ】開いているブックの...
-
エクセルのマクロについて教え...
-
エクセルの改行について
-
Excelのマクロについて教えてく...
-
VBAでユーザーフォームを指定回...
-
Vba セルの4辺について罫線が有...
-
vbsでのwebフォームへの入力制限?
-
[VB.net] ボタン(Flat)のEnable...
-
Excel 範囲指定スクショについ...
-
【マクロ】値を渡されたプロシ...
-
Excelのマクロについて教えてく...
-
Excel VBA 選択範囲の罫線色の...
-
エクセルのVBAコードと数式につ...
-
【マクロ】変数を使った、文字...
-
エクセルのVBAコードについて教...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
testファイル内にある複数のpng...
-
改行文字「vbCrLf」とは
-
エクセルVBA 検索結果を隣のシ...
-
vb.net(vs2022)のtextboxのデザ...
-
エクセルのVBAコードと数式につ...
-
【マクロ】切取りの場合、形式...
-
【ExcelVBA】5万行以上のデー...
-
ExcelVBAでパワポを操作したい
-
(EXCEL超初心者)EXCELの関数(ま...
-
エクセルの改行について
-
Excelマクロで使うVBAコードを...
-
ワードの図形にマクロを登録で...
-
【マクロ】変数を使った、文字...
-
VBAでFOR NEXT分を Application...
-
VBAの質問(Msgboxについて)です
-
エクセルのVBAコードについて教...
-
Excelマクロで使うVBAコードを...
-
Excelのマクロについて教えてく...
-
VBAの「To」という語句について
-
【マクロ】値を渡されたプロシ...
おすすめ情報