下記のVBAコードを実行したら画像の様な結果になります。
グループ2、3のように同じ時間がありますが片方が色がついてしまいます。
グループ2なら両方色つけグループ3も1:06が2つあるのでそちらも色付したのですがどうすればいいでしょうか?
どなたか詳しい方教えてください。
Sub 重複削除()
Dim ws As Worksheet
Dim iLastRow As Long
Dim dict As Object
Dim key As Variant
Dim i As Long
Dim maxRow As Long
Dim maxTime As Date
' Set the worksheet
Set ws = ThisWorkbook.Sheets("時系列") ' 必要に応じてシート名を変更してください
' Get the last row with data in column I
iLastRow = ws.Cells(ws.Rows.Count, "I").End(xlUp).Row
' Create a dictionary to store the latest time for each value in column I
Set dict = CreateObject("Scripting.Dictionary")
' Loop through column I to find duplicates and their latest time
For i = 2 To iLastRow ' Assuming there is a header row
If Not IsEmpty(ws.Cells(i, "I").Value) Then
key = ws.Cells(i, "I").Value
If dict.exists(key) Then
' Update the latest time if current time is newer
If ws.Cells(i, "E").Value > ws.Cells(dict(key), "E").Value Then
dict(key) = i
End If
Else
dict.Add key, i
End If
End If
Next i
' Highlight the rows with the latest time for each duplicate value
For Each key In dict.keys
maxRow = dict(key)
ws.Rows(maxRow).Interior.Color = RGB(255, 255, 0) ' Yellow color
Next key
' Clean up
Set dict = Nothing
End Sub
- 画像を添付する (ファイルサイズ:10MB以内、ファイル形式:JPG/GIF/PNG)
- 今の自分の気分スタンプを選ぼう!
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
補足要求です。
>最終的にやりたいことは色が付いていない行を消しすところまでやりたのですがその作成がうまくいかないのでまず色付けの条件でネットから検索してマクロを作成してうまくいけば色が付いて無い行を消すマクロを追加すればいいかと思い作成中です。
ということは、本当にやりたいことは、色付けをせずに、不要な行(グループ内で最新でない行)を削除したいということでしょうか?
であれば、削除まで一気に行うマクロを1つ作成すれば良いかと思います。
それとも、以下のような2つのマクロを作りたいのでしょうか。
1番目のマクロ:グループ内で最新の行に色付けをするマクロ
2番目のマクロ:色付けされていない行を削除するマクロ
参考までに教えていただきたいのですが、
①データ数(行数)はおよそ何件程度でしょうか。
②グループの数は、何グループありますか。
No.1
- 回答日時:
こんにちは
シートに関しての説明やなさりたいことの説明も曖昧なので、イマイチはっきりとはしませんけれど・・・
(ご提示の図では、E列とI列が隣接しているようなので、セルを結合しているのかどうかもよくわかりませんし・・)
とりあえず以下のように仮定して解釈しました。
・I列にグループ名が記入されている。
・E列に日時がシリアル値で記入されている。
・1行目はタイトル行で処理対象外としてよい。
なさりたいことは
『同じグループ名の行のうち、日付が最も大きい(=最新の)行全てに背景色を付けたい』
と解釈しました。
※ ご提示の日時は「分」までの表示しかありませんけれど、秒数迄を含めて判断してよいものと解釈します。
(見かけ上同じ分数でも、秒数が異なれば異なる時刻と判断する)
>そちらも色付したのですがどうすればいいでしょうか?
ご提示のコードではDictionaryオブジェクトを利用して、グループ名毎の最大日時の行番号を記録する方式になっています。
現状では、
>If ws.Cells(i, "E").Value > ws.Cells(dict(key), "E").Value Then
で、記録したものより大きな時刻が出現した時のみ行番号を入れ替えるようになっていますが、複数存在する可能性を考慮するなら、イコールの場合には記録に追加するようにしておけば宜しいでしょう。
ただし、Dictionaryは key, value形式の記録なので、複数の値を記録するには、value値を工夫する必要があります。
例えば、カンマ区切りの文字列として記録するようにするとか。
あるいは、セル配列を記憶する方法もありそうに思いますが、value値がオブジェクトを許容していたかどうか記憶していませんので、こちらは確認の上ご利用ください。
一方で、ご提示のことをなさりたいのであれば、シートに「条件付き書式」を設定しておけば、いちいちマクロを実行する必要もなく、値が変化すればその内容に応じて背景色が変わるようにできると思います。
エクセルの利用法としては、これが一般的と言えるでしょう。
(Office365であれば、MAXIFS関数が使えるので簡単に設定できます)
また、ご提示のコードでは背景色をクリアしてはいないようなので、値を変更して再度実行するだけでは、必ずしも正しい結果ではない可能性が生じます。
その点でも、条件付き書式であれば、状態に応じて常に判断してくれますので、値を変更すれば即時に結果に反映されます。
方法は全く異なりますが、エクセルに計算してもらう方法を以下ご参考までに。
(処理内容は、最初に示した内容として解釈しています)
(最終列を作業列として利用しています)
Sub Q13853633()
Dim rg As Range, c As Range
Dim maxR As Long
Const f = "=(I2<>"""")*(AGGREGATE(14,6,E$2:E$@/(I$2:I$@=I2),1)=E2)"
With ThisWorkbook.Worksheets("時系列")
maxR = .Cells(Rows.Count, 9).End(xlUp).Row
If maxR < 2 Then Exit Sub
Set rg = .Cells(2, Columns.Count).Resize(maxR - 1)
rg.Formula = Replace(f, "@", maxR)
rg.EntireRow.Interior.Color = xlNone
For Each c In rg
If c.Value Then c.EntireRow.Interior.Color = vbYellow
Next c
rg.ClearContents
End With
End Sub
回答ありがとうございます。
・セルの結合に関してですが画像をわかりやすくするため非表示にしていますので結合はしていません。
・やりたいことはご提示くださった日時は「分」まで判断し秒数が違っても同じにしたい。
・確かにkeyを使うマクロは作成中にネットで検索したときに見て試しましたが使い方が悪くうまくいきませんでした。
またエクセルのご提示ありがとうございます。最終的にやりたいことは色が付いていない行を消しすところまでやりたのですがその作成がうまくいかないのでまず色付けの条件でネットから検索してマクロを作成してうまくいけば色が付いて無い行を消すマクロを追加すればいいかと思い作成中です。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBA 別ブックからの転記の高速化について VBA 別ブックからの転記の高速化についてご教授下さい。 19 2022/07/26 13:07
- Visual Basic(VBA) VBAコードが作動せず、どこに問題があるのか教えて下さい。 3 2023/06/13 13:20
- Visual Basic(VBA) ExcelVBAに関する質問 3 2023/02/17 10:47
- Visual Basic(VBA) VBAコードが作動しません。修正したいのですが何処に原因かあるか教えて下さい。 1 2024/01/08 16:23
- Excel(エクセル) VBAの指示の内容 昨日こちらでご教示頂いたのですが初心者な為、一つ一つの指示が何をやっているのかわ 2 2022/10/25 18:08
- Visual Basic(VBA) VBA処理追加 こちらでご教示頂いたのですが回答完了させてしまいましたのでこちらからまた質問させてく 2 2022/10/27 09:57
- Visual Basic(VBA) ExcelVBAで、index、match関数を使用して、指定範囲に出力したい 3 2022/10/18 21:53
- Visual Basic(VBA) エクセルVBAについて 8 2022/07/13 22:41
- Excel(エクセル) VBA Private Sub Worksheet_Changeで 1 2024/05/01 16:59
- Visual Basic(VBA) vbaを早くしたい 5 2022/09/09 10:58
このQ&Aを見た人はこんなQ&Aも見ています
-
性格の違いは生まれた順番で決まる?長男長女・中間子・末っ子・一人っ子の性格の傾向
同じ環境で生まれ育っても、生まれ順で性格は違うものなのだろうか。家庭教育研究家の田宮由美さんに教えてもらった。
-
VBA listBoxについて
Visual Basic(VBA)
-
エクセルVBAについて
Visual Basic(VBA)
-
VBAなくなるの?
Visual Basic(VBA)
-
-
4
VBA一覧取得 再投稿
Visual Basic(VBA)
-
5
エクセルVBAコードで教えて下さい!
Visual Basic(VBA)
-
6
Sub 要具ライフ() ActiveSheet.Cells.Find(what:=TOPゴム")."
Visual Basic(VBA)
-
7
VBA 複数条件の分岐処理の上手な方法
Visual Basic(VBA)
-
8
[オートフィルタ]の適用範囲の確認は可能か?
Excel(エクセル)
-
9
Word VBA MSGBOX 内で降順表示
Visual Basic(VBA)
-
10
VBA SaveChanges 上書きされない
Visual Basic(VBA)
-
11
VBA listBoxから
Visual Basic(VBA)
-
12
Excelのマクロについて教えてください。
Visual Basic(VBA)
-
13
VBA初心者 Ctrl+での操作、ボタンに登録での操作
Visual Basic(VBA)
-
14
VBAで各列の+"と"o"の合計数を数え3行目と4行目に入力したい"
Visual Basic(VBA)
-
15
VBAで大量のファイルをシート名ごとに転記やらいろいろしたい!
Visual Basic(VBA)
-
16
【関数】スペースがいくつ入った後の文字列を取り出したい
Excel(エクセル)
-
17
Vba SelStart、SelLen教えてください教えてください
Visual Basic(VBA)
-
18
VBA 複数のエクセルから一つのエクセルに貼り付ける
Visual Basic(VBA)
-
19
エクセルについて
Visual Basic(VBA)
-
20
エクセルVBAについて
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
重複確認
-
Ruby 2次元のハッシュ
-
foreachとかの勝手な省略?
-
マッチング処理(1:N)
-
思うような連想配列ができない・・
-
if文などで使用される条件式で...
-
リストボックス複数選択抽出方法
-
foreachで上限回数指定方法また...
-
foreachで配列を、左から縦3列...
-
【PHP】 重複した値を取り除く...
-
PHPで連想配列のプルダウンメニ...
-
ランキング非対象者のプログラム
-
phpでforeachの中にforeachがあ...
-
file_existsでファイル名の部分...
-
php で1から100までの素数の表...
-
ファイルの書き込みについて教...
-
PHPのmin関数、「1」以上の数値...
-
$_SESSIONに二次元配列を使える...
-
curlをPHPで書く方法
-
正規表現でパターンマッチした...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
重複確認
-
foreachで上限回数指定方法また...
-
マッチング処理(1:N)
-
Excel VBAでフィルター後の対象...
-
VB.NET で 二次元のハッシュは...
-
多次元配列を、1次元の配列にす...
-
SELECT 使用時の bindValue の...
-
Smartyでインクリメント
-
PHPでこのコード自体に意味は無...
-
配列を比較して同じものがあっ...
-
PHP、{}記号の意味
-
phpでforeachの中にforeachがあ...
-
sqlのデーターを『あ行』『か行...
-
多次元配列の中で条件に合う要...
-
構造体の中でユーザー定義型の...
-
キーが倍数の時の値の存在チェ...
-
foreachで配列を、左から縦3列...
-
ラジオボタンをランダムに表示...
-
三重県南部の温泉
-
ジャグ配列
おすすめ情報