A 回答 (21件中1~10件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
・セル範囲取得(AM、AQ、AU列・・・最終行は同じ?)
・セル範囲に検索値が何個あるかWorksheetFunction.CountIfで調べ、1を超えるか否かで代入する値をチョイスする。(IIf関数で)
・一応実行開始すぐに画面更新を止め、全てが終わったら更新停止を解除する
とかですかね?
質問が続きならソートは出来ない条件と言う事で。
ありがとうございます。
そしてお礼の対応が遅れてすみません。
作業しながらなので・・・
AM AQ AU列で重複判定が必要ですが、CSV内の処理で最終行は同じです。
各列毎にソートしてると待ち時間が半端ないので、そもそもソートなしでの実現案を模索しています。
ちなみに本日は、各列毎にソートして終えました。また来週作業が発生します。(レコード数が約1万件増加して・・・)
No.3
- 回答日時:
重複チェックの結果は何列目に吐き出せば良いですか?
ディクショナリーを使えば可能です
dim Chofuku as object
Chofuku=CreateObject("Scripting.Dictionary")
ループ開始
if Chofuku.Exists(対象の値)=False Then
Chofuku.Add(対象の値,1)
Else
Chofuku.Item(対象の値)=Chofuku.Item(対象の値)+1
End If
ループ終了
そのディクショナリーという方式の効率の良さに驚いています。
まだ全然理解できてませんので、ソースをそのままテストする次第です。
AM列を重複検査した時の吐き出し先は2列右です(AMの場合AO、AXだったらAZ)
回答してくださってる方々に返信していきながら、一番手っ取り早そうな方法に変えてくつもりです。
No.4
- 回答日時:
No.2です。
Sub try()
Dim AM As Range
Dim r As Range
'セル範囲を変更した変数を追加作成し下記ループをそれぞれの変数で行なう
Set AM = Range("AM1", Cells(Rows.Count, "AM").End(xlUp))
For Each r In AM
r.Offset(, 2).Value = IIf(WorksheetFunction.CountIf(AM, r.Value) > 1, "重複", "ユニーク")
Next
Set AM = Nothing
End Sub
ありがとうございます。
こちらのソースでテストしてみたのですが20分経過後も終わらなかったので、ブック自体を強制終了して、アナログ作業で済ませました。。。
時間に余裕がある時に色々試したいと思います。
でも感謝してます。
No.5
- 回答日時:
No.4です。
ミスりました。
重複してても1回目はユニークなんですね。
修正版:
Sub try_2()
Dim AM As Range
Dim r As Range
'セル範囲を変更した変数を追加作成し下記ループをそれぞれの変数で行なう
Set AM = Range("AM1", Cells(Rows.Count, "AM").End(xlUp))
For Each r In AM
r.Offset(, 2).Value = IIf(WorksheetFunction.CountIf(Range(AM.Cells(1), r), r.Value) >= 2, "重複", "ユニーク")
Next
Set AM = Nothing
End Sub
添付画像でいうと、aは1回目から重複を入れたいです。
・全体的に1個しか存在しない値は「ユニーク」
・2つ以上存在する場合は全て「重複」※1回目から
という規則で処理したいです。
つまり、
=IF(COUNTIF($AM$1:AM1,$AM1)>=2,"重複","ユニーク")
と全く同じ結果を得たいんです。
No.6
- 回答日時:
こんにちは。
関数とVBAでロジックが同じなら関数の方が速いと思いますので、今の方向性で宜しいかと思います。
ご質問の本質的な問題点は、
>数十万行あるので関数だと非常に時間がかかる
と理解しました。
ポイントは重複チェック列にデータ入力があると、全ての重複チェックを行う関数において再計算が発生し、パフォーマンスを落としていると想像します。
この場合、リアルタイム再計算ではなく、設定でもVBAでも良いのですがExcelの再計算オプションを操作して、ボタンを押した時だけ再計算する仕組みにしてはどうですか?
以下余談
大きな期待はできませんが、関数の書き方で1点ポイントを提示します。
関数式の論理式
COUNTIF($AM$1:AM1,$AM1)>=2
は2つの評価(処理)がされています。
・数値は2より大きいか?
・数値は2か?
です。今回少数点以下の数値は有り得ませんので、
COUNTIF($AM$1:AM1,$AM1)>1
・数値は1より大きいか?
と同意となります。
この場合、論理式の評価回数は1回ですよね。つまり、処理回数を1つ減らせるわけです。
ループ処理や広域のセルを計算する場合は、こうした小さな点も高速化のポイントになりそうです。
ロジックを考えるうえで貴重な情報です。
「>=」と「>」は処理回数に置いて異なるのは本当ですか?
普通は数千件あろうが時間差が無いので考えても見ませんでした。
数十万件超えると顕著に現れますよね。まだ上記のテストはしてません。
微妙な差でも知っておくことは必要だと思ってます。とても感心しました。
No.8
- 回答日時:
No.9
- 回答日時:
補足要求です。
1.COUNTIFを使うと、大文字、小文字を区別せずに、重複を判定しますが、大文字、小文字は区別せずに重複判定をしたいということでしょうか。
2.あなたが提示された
=IF(COUNTIF($AM$1:AM1,$AM1)>=2,"重複","ユニーク")
をAOに記入し、下へオートフィルすると、
重複があった場合でも、1件目のデータはユニークと表示されます。
つまり、めぐみん_さんのNo5のようになります。
No4の結果を期待するなら、
=IF(COUNTIF($AM:$AM,$AM1)>=2,"重複","ユニーク")
ではないでしょうか?
3.AM列以外にAQ列、AU列でも同様の処理を行えると嬉しいです。
ということですが、これは、
①AQ列の重複結果をAU列へ出力する。
②AQ列の重複結果を何かほかの列へ出力する。
及びAU列の重複結果を何かほかの列へ出力する。
のように考えられます。
①②のどちらなのでしょうか。
②の場合は、出力先の行も提示したほうが良いかと思います。
ありがとうございます。
> 1.COUNTIFを使うと、大文字、小文字を区別せずに、重複を判定します> が、大文字、小文字は区別せずに重複判定をしたいということでしょうか。
そうです。例えば外国人の名前です。
MICHAELとMichaelは同一人物ですからそれぞれにユニークと結果が出ては困るんです。
> 2.あなたが提示された
> =IF(COUNTIF($AM$1:AM1,$AM1)>=2,"重複","ユニーク")
確かにそうですね、失礼いたしました。
私が考えていた式はこちらになります。
=IF(COUNTIF(AM:AM,AM1)>=2,"重複","ユニーク")
1セルに対して1行目~30万行目まで走査するでしょうから待ち時間多すぎです。。。
> 3.AM列以外にAQ列、AU列でも同様の処理を行えると嬉しいです。
> ということですが、これは、
頂いたアドバイスをカスタマイズして、現実の集計に活かすべきと思っていたので挙げてる列名はダミーなんですが、正確に言うと
実際にはAK列内の重複判定の書き込み先をAM列に、
AN列の判定結果をAP列に、AQ列の判定結果をAS列に、となってます。
回答者さんのソースに頼っちゃっていてお恥ずかしい限りです。
No.10
- 回答日時:
Public Sub dup()
Dim Chofuku As Object
Dim lLoop As Long
Dim lEndRow As Long
Dim sPaste1() As String
Dim sPaste2() As String
Dim vKey As Variant
Dim sKey As String
Set Chofuku = CreateObject("Scripting.Dictionary")
lEndRow = Cells(Rows.Count, "AM").End(xlUp).Row
For lLoop = 1 To lEndRow
sKey = Cells(lLoop, "AM").Value
If Chofuku.Exists(sKey) = False Then
Chofuku.Add sKey, "ユニーク"
Else
Chofuku.Item(sKey) = "重複"
End If
Next
lLoop = 0
For Each vKey In Chofuku.Keys
ReDim Preserve sPaste1(lLoop)
ReDim Preserve sPaste2(lLoop)
sPaste1(lLoop) = vKey
sPaste2(lLoop) = Chofuku.Item(vKey)
lLoop = lLoop + 1
Next
Range(Range("AN1"), Range("AN1").Offset(UBound(sPaste1), 0)).Value = WorksheetFunction.Transpose(sPaste1)
Range(Range("AO1"), Range("AO1").Offset(UBound(sPaste2), 0)).Value = WorksheetFunction.Transpose(sPaste2)
End Sub
AM列で判定した結果を、
AN列と、AO列に書き込んでいるようですが、少し仕様を教えて頂けませんか?
テストしてみた感じだと、AN列にはAM列と同じ値を書き込んでいるようですが、ちょっと違うようで、途中から行ずれを起こしていっているようです。
AO列には重複かユニークかが書き込まれていました。
30万行での結果が出るまでの時間は速かったので完成出来たら幸いです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) 重複しているか否かをソートせずに判断する方法ありますか? 2 2022/07/06 21:16
- Visual Basic(VBA) エクセルVBA コードが同じでもファイルによって処理速度が大きく変わるのはなぜ 5 2022/11/06 21:34
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Excel(エクセル) Countifよりも早く重複数をカウントする方法ありますか? 18 2022/07/04 13:39
- Visual Basic(VBA) VBAでのループ順序について 3 2023/03/13 10:55
- Visual Basic(VBA) セルが空白だった時の処理 5 2022/09/01 07:07
- Visual Basic(VBA) 3つの条件を指定してVBAで行を削除したい 条件1:分類1が重複 条件2:分類2が重複 条件3:個数 6 2022/06/24 11:07
- Visual Basic(VBA) 列と行の名前(重複あり)が交差するセルに、データを入力したい 3 2022/06/12 11:17
- Visual Basic(VBA) 指定列最終行までのスペースを改行するVBAについて 2 2022/06/01 19:50
- Excel(エクセル) 表に書いてある単語を1つの行に重複させないで書き出したい。 複数の列行にそれぞれ職種が入力されている 6 2022/05/25 04:49
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Vba 実数および実数タイプの変...
-
Excelのマクロについて教えてく...
-
VBA レジストリの値の読み方に...
-
Excel VBA 定義されたプロージ...
-
Excel マクロについての相談
-
エクセルVBAについて
-
Vba SelStart、SelLen教えてく...
-
エクセルの合計を自動で表示さ...
-
Excelのマクロでワードのテキス...
-
Excelについて
-
2つのマクロでチェックボックス...
-
VBAに詳しい方教えてください。
-
エクセルのマクロについて教え...
-
エクセルのマクロについて教え...
-
VBAの質問になります Userform内で
-
VBA listBoxから
-
VBAで各列の"+"と"o"の合計数を...
-
VBA初心者 Ctrl+での操作、ボタ...
-
VBA 複数条件の分岐処理の上手...
-
VB.net(VB)で、フォームにExcel...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excel VBA 定義されたプロージ...
-
Excel-VBAのmsgBox()の不思議
-
【VBA】マクロの入ったファイル...
-
VBA 複数条件の分岐処理の上手...
-
現在のブックを閉じないで、マ...
-
VBAで各列の"+"と"o"の合計数を...
-
VBAに詳しい方教えてください。
-
エクセルのマクロについて教え...
-
エクセルのマクロについて教え...
-
エクセルのマクロについて教え...
-
エクセルのマクロについて教え...
-
エクセルのマクロについて教え...
-
エクセルのマクロについて教え...
-
ユーザーフォームに別シートか...
-
エクセルのマクロについて教え...
-
ExcelVBA シート名を複数セルか...
-
エクセルのマクロについて教え...
-
VBA listBoxから
-
Excelのマクロについて教えてく...
-
エクセルのマクロについて教え...
おすすめ情報