No.4ベストアンサー
- 回答日時:
Excellの機能を使わず、VBAのプログラムでの処理例です。
Sub ボタン1_Click()
Dim i As Long, n As Long
Dim s As String, co As Collection
Dim t As Double
Set co = New Collection
Range("b:b").Value = "" 'B列を全てクリア
t = Timer
For i = 1 To 30000 '適当に上限を30000にした
s = Cells(i, 1).Value
If s = "" Then Exit For
On Error Resume Next
co.Add s, s
If Err Then
On Error GoTo 0
Cells(i, 2).Value = "重複"
n = n + 1
End If
On Error GoTo 0
Next
MsgBox "件数=" & i - 1 & " 重複件数=" & n & " 時間=" & Timer - t
End Sub
A列の1行目から順に空セルを見つけるまでチェックします。
現在のセルの値が既に存在していれば(上にあれば)B列に重複の文字を設定します。
実行時間は、重複するデータの比率により変わりますが、
重複13%で20秒、67%で80秒でした。
(実行環境は、Pen3 500MHz, Excel97)
しかし、"重複"の文字をセルに表示しなければ(該当部分をコメントアウト)
5~7秒位でした。(結構セルへの表示に時間がかかっている!)
No.3
- 回答日時:
#1です。
>処理がちょっと遅いですね・
それを気にして、総なめにしないで、FINDを使ったのですが、3万行では時間が掛かりますか。
少しでも改善しないかと思って、良ければ下記をやって見て下さい。
Sub test01()
Dim x As Range
Application.ScreenUpdating = False '追加
Application.Calculation = xlManual '追加
d = Range("A1").CurrentRegion.Rows.Count
' MsgBox d
For i = 1 To d - 1
If Cells(i, "A") = "重複" Then Exit For '追加
Set x = Range(Cells(i + 1, "A"), Cells(d, "A")).Find( _
what:=Cells(i, "A"), LookIn:=xlValues, lookat:=xlPart)
If Not (x Is Nothing) Then
Cells(i, "B") = "重複"
Cells(x.Row, "B") = "重複"
End If
Next i
Application.ScreenUpdating = False "追加
Application.Calculation = xlAutomatic '追加
End Sub
No.2
- 回答日時:
Excelの機能を使ってやってみるとこんな感じかな。
そんなに遅くないと思いますが、わかりません。
# うちのマシン早いから(^^;)
Sub 重複を洗い出す()
Dim wb As Excel.Workbook
Dim pt As Excel.PivotTable
Dim sh As Excel.Worksheet
Dim rg As Excel.Range
Dim HeadName As String
Dim dat As Variant
Application.ScreenUpdating = False
Set wb = ActiveWorkbook
Set sh = ActiveSheet
HeadName = sh.Cells(1, 1).Value
'ピボットテーブルを作る
With wb
Set pt = .PivotCaches.Add( _
SourceType:=xlDatabase, _
SourceData:=sh.Cells(1, 1).CurrentRegion.Address _
).CreatePivotTable(TableDestination:="", TableName:="Pivot")
End With
Set sh = ActiveSheet
With pt
.SmallGrid = False
.ColumnGrand = False
.RowGrand = False
.AddFields (HeadName)
.PivotFields(HeadName).Orientation = xlDataField
End With
'ピボットテーブルからデータだけを取り出す
With sh
Set rg = .Range(.Cells(2, 1), .Cells(2, 1).SpecialCells(xlLastCell))
dat = rg.Value
.Columns("A:B").Delete Shift:=xlToLeft
End With
rg.Offset(-1, 0).Value = dat
'オートフィルターで重複データを見つける
With sh.Cells(1, 1)
.CurrentRegion.AutoFilter Field:=2, Criteria1:=">=2"
.CurrentRegion.Copy
End With
'新しいシートに重複データだけコピーする
wb.Sheets.Add
With ActiveSheet
.Paste
.Name = "重複項目"
.Columns("B").Delete Shift:=xlToLeft
With .Cells(1, 1)
.Value = "重複項目"
.Select
End With
End With
Application.DisplayAlerts = False
sh.Delete
Application.DisplayAlerts = True
Application.ScreenUpdating = False
Set wb = Nothing
Set pt = Nothing
Set sh = Nothing
Set rg = Nothing
End Sub
注意:データはA列だけに空行なしで存在していて、1行目にヘッダーがあると仮定しています。
No.1
- 回答日時:
色々なロジックが考えられると思いますが、一例を挙げます。
今注目している行の値について、直下行から最下行までに
同じものが見つかるか、Findメソッドを使って見つけて、B列にコメントを入れてます。
最下行の1つ手前まで繰り返します。
Sub test01()
Dim x As Range
d = Range("A1").CurrentRegion.Rows.Count
' MsgBox d
For i = 1 To d - 1
Set x = Range(Cells(i + 1, "A"), Cells(d, "A")).Find( _
what:=Cells(i, "A"), LookIn:=xlValues, lookat:=xlPart)
If Not (x Is Nothing) Then
Cells(i, "B") = "重複"
Cells(x.Row, "B") = "重複"
End If
Next i
End Sub
(テストデータ)
aaa重複
bbb
ccc重複
aaa重複
ccc重複
ddd
ggg
hhh
s重複
dfg
fgh
ccc重複
s重複
この回答へのお礼
お礼日時:2003/11/23 01:32
ありがとうございます。
実際やってみましたがデータが3万件ほどになると
処理がちょっと遅いですね・・・。
しょうがないですかね・・・。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) この関数と同じ処理をVBAで行うにはどうしたら良いでしょうか? これは、1列の中に同じ値が複数存在し 21 2022/07/07 07:48
- Visual Basic(VBA) 複数シートの複数列に入力されているデータを重複なしで抽出するVBAを作りたいです。 9 2022/06/17 10:33
- Visual Basic(VBA) vbaエクセルマクロ RemoveDuplicatesについて 重複したものがあれば行を削除するとい 1 2023/02/27 18:49
- Excel(エクセル) VBAのエラーが直せません 4 2023/06/12 22:10
- Visual Basic(VBA) vbaエクセルマクロについて RemoveDuplicatesを使わずに、重複行を削除すらマクロを作 3 2023/03/02 22:03
- Visual Basic(VBA) 複数指定セルの可視セルのみを別シートに転記するVBAについて 2 2022/05/27 21:19
- Visual Basic(VBA) 3つの条件を指定してVBAで行を削除したい 条件1:分類1が重複 条件2:分類2が重複 条件3:個数 6 2022/06/24 11:07
- Excel(エクセル) Excel vba 重複行削除 4 2022/06/02 06:52
- Visual Basic(VBA) vbaを早くしたい 5 2022/09/09 10:58
- Excel(エクセル) Countifよりも早く重複数をカウントする方法ありますか? 18 2022/07/04 13:39
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
DataGridViewの特定列に入力さ...
-
Excel 1セル当りの文字数が2...
-
VBAにて複数の重複データを取得...
-
粒度分布と粒径分布のヒストグ...
-
ポインター引数の関数でコンパ...
-
10Mバイトて文字数に すると何...
-
UTF-8で5~6バイトになる文字コ...
-
0.5バイトづつ読み込みたいので...
-
COBOLのCOMP形式について
-
エクセルシート名の制限を変更...
-
ESC/Pのテキスト印字の制...
-
RegQueryValueExでの2バイト文字
-
全角半角を調べるライブラリ関...
-
stable diffusionのエラー
-
fortranで、C言語のsizeof関数...
-
VB2010での連立方程式の計算
-
変数 および ポインタのサイ...
-
VB.NET LeftBの代用
-
'dataType' 引数を Null にする...
-
SQLで1バイト、2バイト混在...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excel 1セル当りの文字数が2...
-
DataGridViewの特定列に入力さ...
-
ListView重複データ削除
-
GUIDの重複
-
光散乱のシミュレーションにつ...
-
Excel VBA チェックツール
-
VBAを使って複数条件からの合計...
-
ポインター引数の関数でコンパ...
-
10Mバイトて文字数に すると何...
-
UTF-8で5~6バイトになる文字コ...
-
Excel VBA メール作成について ...
-
char str[256]の256の意味は?
-
エクセルシート名の制限を変更...
-
stable diffusionのエラー
-
COBOLのCOMP形式について
-
バイナリとBCDコード
-
バイト列とバイナリ列の違いが...
-
ビットスワップとバイトスワッ...
-
ピクセル,dpiから容量(バイト...
-
SQLで1バイト、2バイト混在...
おすすめ情報