No.5ベストアンサー
- 回答日時:
No.4 お礼について
今回はソートしてますのでどちらでも対して変わりませんお好きな方をお使いください。
ソートしてはいけない場合は「Dictionary 機能」を使った方が圧倒的に早くなりますが、今回はソートする事によってまとめて行削除を行えているのでソートしてはいけないのならば今回の物より圧倒的に遅くなります。
No.4
- 回答日時:
No.1 の改良版(一番時間がかかっているのが「Rows(行).Delete Shift:=xlUp」なので「Rows(行).ClearContents」しておいて後で一括削除しました。
6万行を5秒位で完了、元は2分強かかっていました。)☆ Dictionary 機能を使わないバージョン
--------------------------------------------------------------------------------
Sub Sample()
Dim 行 As Long
Dim 範囲 As Range
Application.ScreenUpdating = False
Cells.Sort _
Key1:=Range("B2"), Order1:=xlAscending, _
Key2:=Range("C2"), Order2:=xlDescending, _
Header:=xlYes
For 行 = Cells(Rows.Count, 2).End(xlUp).Row To 2 Step -1
If Cells(行, 2).Value = Cells(行 - 1, 2).Value Then
Rows(行).ClearContents
End If
Next
Cells.Sort _
Key1:=Range("B2"), Order1:=xlAscending, _
Key2:=Range("C2"), Order2:=xlDescending, _
Header:=xlYes
Rows(Cells(Rows.Count, 2).End(xlUp).Row + 1 & ":" & Rows.Count).Delete Shift:=xlUp
ActiveSheet.UsedRange
Application.ScreenUpdating = True
End Sub
--------------------------------------------------------------------------------
☆ Dictionary 機能を使ったバージョン
--------------------------------------------------------------------------------
Sub Sample()
Dim 辞書 As Object
Dim 行 As Long
Dim 終 As Long
Cells.Sort _
Key1:=Range("B2"), Order1:=xlAscending, _
Key2:=Range("C2"), Order2:=xlDescending, _
Header:=xlYes
Set 辞書 = CreateObject("Scripting.Dictionary")
For 行 = 2 To Cells(Rows.Count, 2).End(xlUp).Row
If 辞書.Exists(Cells(行, 2).Text) Then
Rows(行).ClearContents
Else
辞書.Add Cells(行, 2).Text, 行
End If
Next
Set 辞書 = Nothing
Cells.Sort _
Key1:=Range("B2"), Order1:=xlAscending, _
Key2:=Range("C2"), Order2:=xlDescending, _
Header:=xlYes
Rows(Cells(Rows.Count, 2).End(xlUp).Row+1 & ":" & Rows.Count).Delete Shift:=xlUp
ActiveSheet.UsedRange
Application.ScreenUpdating = True
End Sub
--------------------------------------------------------------------------------
No.3
- 回答日時:
No.2です。
前回の投稿で誤記がありました。
>B・C列の並びが別々でも・・・
は
>B・C列の並びがバラバラでも・・・
です。
すなわちマクロ実行前の並び替えは不要です。m(_ _)m
No.2
- 回答日時:
こんばんは!
B・C列の並びが別々でも対応できるようにしてみました。
一例です。
Sub Sample1()
Dim myDic As Object
Dim myRng As Range, myR
Dim i As Long, lastRow As Long, myStr As String
Set myDic = CreateObject("Scripting.Dictionary")
lastRow = Cells(Rows.Count, "B").End(xlUp).Row
myR = Range(Cells(2, "B"), Cells(lastRow, "C"))
For i = 1 To UBound(myR, 1)
myStr = myR(i, 1)
If Not myDic.exists(myStr) Then
myDic.Add myStr, myR(i, 2)
Else
If myR(i, 2) > myDic(myStr) Then
myDic(myStr) = myR(i, 2)
End If
End If
Next i
For i = 2 To lastRow
myStr = Cells(i, "B")
If Cells(i, "C") <> myDic(myStr) Then
If myRng Is Nothing Then
Set myRng = Cells(i, "B")
Else
Set myRng = Union(myRng, Cells(i, "B"))
End If
End If
Next i
Set myDic = Nothing
If Not myRng Is Nothing Then '//←念のため//
myRng.EntireRow.Delete
End If
MsgBox "完了"
End Sub
こんな感じではどうでしょうか?m(_ _)m
No.1
- 回答日時:
こんな感じはいかがでしょうか?
--------------------------------------------------------------------------------
Sub Sample()
Dim 行 As Long
Application.ScreenUpdating = False
Cells.Sort _
Key1:=Range("B2"), Order1:=xlAscending, _
Key2:=Range("C2"), Order2:=xlDescending, _
Header:=xlYes
For 行 = Cells(Rows.Count, 2).End(xlUp).Row To 2 Step -1
If Cells(行, 2).Value = Cells(行 - 1, 2).Value Then
Rows(行).Delete Shift:=xlUp
End If
Next
Application.ScreenUpdating = True
End Sub
--------------------------------------------------------------------------------
※ ソート部もあります不要ならば「Cells.Sort _」から「Header:=xlYes」を削除してください。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 家賃・住宅ローン 住宅ローン控除の申請について教えてください 3 2023/02/25 09:07
- OCNモバイルONE 楽天モバイル 対象機種購入還元ポイントについて 1 2022/05/04 20:51
- Y!mobile(ワイモバイル) 簡単スマホのパスワード解除方法 4 2022/10/23 07:48
- デスクトップパソコン デバイスからのHDMI信号がありません 5 2022/05/07 18:08
- Excel(エクセル) エクセルの同じ種類の行数の多い順に並べるには 2 2023/05/10 15:41
- BTOパソコン OSの入ったHDDがBIOSには認識されるが起動しない 5 2022/04/15 00:47
- 新幹線 新幹線の買い方について 5 2022/09/24 20:16
- Android(アンドロイド) 40代のオヤジです。 スマートフォンの買い換えを考えています。 今時の携帯(スマホ)の買い方は、店舗 3 2023/08/03 21:59
- 株式市場・株価 本日ストップ高の銘柄を来週の月曜日に必ず手に入れたい 6 2023/04/14 20:39
- 格安スマホ・SIMフリースマホ 私名義の携帯電話を解約したい 7 2022/03/28 22:04
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
System.IO.Directory.GetFiles...
-
VB.NETでファイル名順にファイ...
-
数字文字列のソート方法
-
列のどこをクリックしてもソー...
-
ファイル名「1.jpg ~10.jpg~...
-
多次元配列のソート方法
-
C++ 入力した3つのint型の整数...
-
Excel VBAで並べ替えをしたい
-
mysqlで日本語の並び替え
-
構造体配列のソート
-
2次元配列を複数項目でソートし...
-
VBA基本構文の作り方 2列の...
-
sortの優先キーについて(スプレ...
-
C言語でアナグラムを求めるプロ...
-
C# DataGridView のヘッダーセ...
-
C# DataTable ソートについて
-
Excelですべての組合せ(重複組...
-
Fortran77で多次元配列を並び替...
-
EXCEL VBAのソートについて
-
VBAのプログラムで、DIAG = 1# ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
System.IO.Directory.GetFiles...
-
VB.NETでファイル名順にファイ...
-
列のどこをクリックしてもソー...
-
ファイル名「1.jpg ~10.jpg~...
-
Excelですべての組合せ(重複組...
-
あるディレクトリ内のファイル...
-
C# DataTableの行をソートしてD...
-
DataGridViewの複数列を連動し...
-
C# DataGridView のヘッダーセ...
-
excel VBA の条件をつけての列...
-
2次元配列を複数項目でソートし...
-
VBScriptで重複レコードを削除...
-
excel VBA リストビューの行...
-
Excel VBA テキストボックス内...
-
vbでDataTableの抽出コピー
-
リスト構造のソートで悩んでま...
-
多次元配列のソート方法
-
構造体のリストをソートしたい。
-
PHPでファイル一覧を取得して開...
-
C言語・要素除去
おすすめ情報