|
▼Hirofumi さん:
>こんな事?
>
>Option Explicit
>
>Public Sub Repetition()
>
> 'データの列数
> Const clngColumns As Long = 5
> '重複を取る列位置(基準セル位置からの列Offset)
> Const clngKey As Long = 0
>
> Dim i As Long
> Dim lngRows As Long
> Dim lngTop As Long
> Dim lngCount As Long
> Dim rngList As Range
> Dim vntData As Variant
> Dim lngNumb() As Long
> Dim strProm As String
>
> '画面更新の停止
> Application.ScreenUpdating = False
>
> 'データの左上隅を基準とする
> Set rngList = ActiveSheet.Cells(1, "A")
> With rngList
> 'データ行数を取得
> lngRows = .Offset(65536 - .Row, clngKey).End(xlUp).Row - .Row + 1
> If lngRows <= 1 And .Value = "" Then
> strProm = "データが有りません"
> GoTo Wayout
> End If
> '復帰用Keyを作成
> ReDim lngNumb(1 To lngRows, 1 To 1)
> For i = 1 To lngRows
> lngNumb(i, 1) = i
> Next i
> '復帰用Keyを出力
> .Offset(, clngColumns).Resize(lngRows).Value = lngNumb()
> 'データKeyで整列
> .Resize(lngRows, clngColumns + 1).Sort _
> Key1:=.Offset(, clngKey), Order1:=xlAscending, _
> Header:=xlNo, OrderCustom:=1, _
> MatchCase:=False, Orientation:=xlTopToBottom, _
> SortMethod:=xlStroke
> 'Keyを配列に取得
> vntData = .Offset(, clngKey).Resize(lngRows + 1).Value
> End With
>
> '比較元位置を先頭に
> lngTop = 1
> 'データ行数分繰り返し
> For i = 2 To lngRows
> 'Keyの重複が有るなら
> If vntData(lngTop, 1) = vntData(i, 1) Then
> '削除フラグを立てる
> lngNumb(i, 1) = 1
> '削除数をカウント
> lngCount = lngCount + 1
> Else
> '比較元位置を更新
> lngTop = i
> lngNumb(i, 1) = 0
> End If
> Next i
>
> With rngList
> '削除する行が合った場合
> If lngCount > 0 Then
> '削除フラグの配列を復帰用Key列の右側に出力
> .Offset(, clngColumns + 1).Resize(lngRows).Value = lngNumb
> '削除フラグの列をKeyとして整列
> .Resize(lngRows, clngColumns + 2).Sort _
> Key1:=.Offset(, clngColumns + 1), Order1:=xlAscending, _
> Key2:=.Offset(, clngColumns), Order2:=xlAscending, _
> Header:=xlNo, OrderCustom:=1, _
> MatchCase:=False, Orientation:=xlTopToBottom, _
> SortMethod:=xlStroke
> '行削除
> .Offset(lngRows - lngCount) _
> .Resize(lngCount).EntireRow.Delete
> ''削除フラグの列を削除
> .Offset(, clngColumns).Resize(, 2).EntireColumn.Delete
> Else
> strProm = "重複行が有りません"
> GoTo Wayout
> End If
> End With
>
> strProm = "処理が完了しました"
>
>Wayout:
>
> '画面更新の再開
> Application.ScreenUpdating = True
>
> Set rngList = Nothing
>
> MsgBox strProm, vbInformation
>
>End Sub
返信ありがとうございます。
実はまだVBAははじめたばかりで関数等が理解できていない部分があり、このソースでも読めない所が多々あります。
とりあえずこのソースを調べながら解読してみます。
|
|