回答編集履歴

3

別案追記

2024/08/30 00:34

投稿

hatena19
hatena19

スコア34064

test CHANGED
@@ -62,5 +62,22 @@
62
62
  End Sub
63
63
  ```
64
64
 
65
+ 別案 式とフィルターを利用して手作業で
66
+ ---
67
+ 表範囲の右隣の空列の1行目に「比較値」と入力。
68
+ 2行目に下記の式を設定する。
69
+ `=LEFT(CB2,1)*10000-A2`
70
+ フィルハンドルをダブルクリックすると最終行まで比較値が表示される
65
71
 
72
+ さらに右隣の列の1行目に「優先行」と入力。
73
+ 2行目に下記の式を設定
74
+ `=MINIFS(CC$2:CC$6000,CA$2:CA$6000,CA2)=CC2
75
+ ※CC は比較値の式を設定した列アドレス
76
+ フィルハンドルをダブルクリックすると最小比較値と一致する行はTRUE、不一致の行はFALSEとなる。
66
77
 
78
+ 「優先行」列でフィルターをかけてFALSEの行を抽出する。
79
+ 表示されている行を行削除する。
80
+ フィルターを解除する。
81
+ 作業列2列を削除する。
82
+
83
+ 以上。

2

ロジック間違い修正、サンプルコードの追記

2024/08/29 12:28

投稿

hatena19
hatena19

スコア34064

test CHANGED
@@ -8,12 +8,59 @@
8
8
  > 3行以上の比較が分からなかったので質問しました。
9
9
 
10
10
  3行以上の比較をする必要はないのでは。
11
- 最終行から上に移動しながら、
11
+ ~~最終行から上に移動しながら、
12
12
  辞書のキーにCA列の値、アイテムに行番号を登録していく、
13
13
  CA列の値がキーにすでに存在する場合は、アイテムの行と現行の上記の比較値を比べて、比較値が大きいほうの行を削除して、小さいほうの行番号をアイテムに格納する。
14
- これを先頭行まで繰り返せば、比較値の最小の行のみ残ります。
14
+ これを先頭行まで繰り返せば、比較値の最小の行のみ残ります。~~
15
15
  これで希望の結果に得られます。
16
16
 
17
+ 訂正
18
+ ---
17
- ロジックだけですが、れをコード化するのはそれほど難しくないと思いますのでご自身でチャレンジしてみてください。
19
+ 上記のロジックですが、行番号を格納してそれを元に削除すると、削除することによってそれ以降の行が上に移動ので、格納た行番号とずれしまます
20
+ 実際にコード化して気が付きました。
21
+ ということで、下記のロジックに訂正します。
22
+
23
+ 最終行から上に移動しながら、
24
+ 辞書のキーにCA列の値、アイテムに比較値を登録していく、
25
+ CA列の値がキーにすでに存在する場合は、小さいほうの比較値をアイテムに格納する。
26
+ これを先頭行まで繰り返すとキーに対応する優先度のもっとも高い比較値が格納されます。
27
+
28
+ 再度、最終行から上に移動しながら、
29
+ 現在行の比較値と辞書の比較値(もっとも優先度の高い値)が一致しない行を削除する。
30
+ これを先頭行まで繰り返すと優先度の高い行のみ残る。
31
+
32
+ 上記をコード化したコードが下記になります。
33
+
34
+ ```vba
35
+ Public Sub Sample()
36
+ Dim dic As Object
37
+ Set dic = CreateObject("Scripting.Dictionary")
38
+ Dim tbl As Range
39
+ Set tbl = Worksheets(1).Cells(1, 1).CurrentRegion
40
+
41
+ Dim i As Long
42
+ For i = tbl.Rows.Count To 2 Step -1
43
+ Dim ky As String, pv As Long
44
+ ky = tbl.Cells(i, "C").Text
45
+ pv = Left(tbl.Cells(i, "D"), 1) * 10000 - tbl.Cells(i, "A")
46
+ If dic.Exists(ky) Then
47
+ If dic(ky) > pv Then
48
+ dic(ky) = pv
49
+ End If
50
+ Else
51
+ dic(ky) = pv
52
+ End If
53
+ Next
54
+
55
+ For i = tbl.Rows.Count To 2 Step -1
56
+ ky = tbl.Cells(i, "C").Text
57
+ pv = Left(tbl.Cells(i, "D"), 1) * 10000 - tbl.Cells(i, "A")
58
+ If dic(ky) <> pv Then
59
+ tbl.Rows(i).Delete
60
+ End If
61
+ Next
62
+ End Sub
63
+ ```
18
64
 
19
65
 
66
+

1

コメントで指摘された式の間違いを修正

2024/08/29 09:04

投稿

hatena19
hatena19

スコア34064

test CHANGED
@@ -2,7 +2,7 @@
2
2
  > ・CB列の数字が小さい行を優先する
3
3
  > ・CB列の数字が同じ場合、A列の数字が大きい行を優先する
4
4
 
5
- CB列の先頭一文字×10000+A列の値 を比較するようにすればいいでしょう(A列の値が4桁以内の場合、桁数が多い場合はそれに合わせて×数値を増やします)。
5
+ CB列の先頭一文字×10000A列の値 を比較するようにすればいいでしょう(A列の値が4桁以内の場合、桁数が多い場合はそれに合わせて×数値を増やします)。
6
6
 
7
7
  > 辞書機能を使って既存の行と現在の行での比較(2行分の比較)しかできず、どうやっても
8
8
  > 3行以上の比較が分からなかったので質問しました。