実現したいこと
CA列に重複がある場合、優先度判定を行い、優先度の低い重複行をすべて削除したい。
データは6千行ほどあり、VBAで処理したいです。
CB列は文字列(1.*****   2.*****)となっており、左から先頭一文字目が1~7の数字となるのでまずこれを抽出する。
優先度の判定
・CB列の数字が小さい行を優先する
・CB列の数字が同じ場合、A列の数字が大きい行を優先する
行番号 CA列 CB列
1   x   1
2   y   4
3   x   3
4   y   4
5   z   6
6   x   2
例えば上記の例だと、
行番号1・3・6がCA列重複→CB列の優先度1が最も高いので3・6行目は削除
行番号2・4がCA列重複→CB列の優先度は同じ→A列の優先度4が高いので2行目は削除
行番号5は重複なしなので残す
発生している問題・分からないこと
辞書機能を使って既存の行と現在の行での比較(2行分の比較)しかできず、どうやっても
3行以上の比較が分からなかったので質問しました。
該当のソースコード
特になし
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
Googleでは優先度を判定する重複行削除の例が見つかりませんでした。
補足
特になし
> 辞書機能を使って既存の行と現在の行での比較(2行分の比較)しかできず、どうやっても3行以上の比較が分からなかったので質問しました。
どういうコードを書いたのでしょうか?
エクセルのバージョンは何でしょうか。
それによって使える関数や機能が異なりますので。
>行番号2・4がCA列重複→CB列の優先度は同じ→A列の優先度4が高いので2行目は削除
提示された例では、A列の情報はありませんが、「A列の優先度4」は、どのようにしてわかるのでしょうか。
hatena19様
こちらになります。
Microsoft® Excel® for Microsoft 365 MSO (バージョン 2408 ビルド 16.0.17928.20114) 64 ビット 
VBAでの処理をしたいと思っています。
tatsu99様
A列はシンプルに数字ですので、1~6000の番号が入っております。
提示漏れ申し訳ありません。
meg_様
当初はBX列に契約番号が入っているかいないかで優先度を決めていたので
現在の要望とは少し違いますが、下記のように記述しておりました。
全くの初心者で、契約番号がどちらも入っている場合などの考慮ができておらずお恥ずかしいです。。
   ' 重複チェックと優先順位による行の削除
    Dim dict As Object
    Set dict = CreateObject("Scripting.Dictionary")
    
    ' CA列の重複をチェックし、行番号を保存
    For i = lastRow2 To 2 Step -1
        cellValue = ws2.Cells(i, "CA").Value
        If cellValue <> "" Then
            If Not dict.exists(cellValue) Then
                dict.Add cellValue, i
            Else
                ' 優先順位の決定
                Dim existingRow As Long
                existingRow = dict(cellValue)
                
                If ws2.Cells(i, "BX").Value <> "" And ws2.Cells(existingRow, "BX").Value = "" Then
                    ' 既存の行に契約番号がない場合、既存の行を削除
                    ws2.Rows(existingRow).Delete
                    dict(cellValue) = i ' 現在の行を辞書に保存
                ElseIf ws2.Cells(i, "BX").Value = "" And ws2.Cells(existingRow, "BX").Value <> "" Then
                    ' 現在の行に契約番号がない場合、現在の行を削除
                    ws2.Rows(i).Delete
                Else
                    ' 他の場合は比較し、A列の数字が大きい方を残す
                    If ws2.Cells(i, "A").Value > ws2.Cells(existingRow, "A").Value Then
                        ws2.Rows(existingRow).Delete
                        dict(cellValue) = i ' 新しい行を辞書に保存
                    Else
                        ws2.Rows(i).Delete
                    End If
                End If
            End If
        End If
    Next i

回答3件
あなたの回答
tips
プレビュー



