Excel VBA 質問スレッド №1095 (解決済)
条件付き書式で行うと重くて遅いのです
投稿者 : ぷんぷん 投稿日時 : 2022/11/08(Tue) 16:03:54 OS : Windows 10 EXCEL : Excel 2019
宜しくお願いします。
データー件数が1シートに25000件くらいあるシート(件数は毎週変わる20000件から30000件程度)
シート名は毎週変わる
・シート07(今週のシート 25000件程度)
・シート03(先週のシート 23000件程度)
データーは減るものもあるし増えるものもあります。
重複していないデータのセルに色を付けたいです。
シート07のM列とシート03のM列を比べて、重複していない
セルをシート07に色を付けたい(M列には5桁ほどの注番が入っています)
条件付き書式で数式を使用して(Counifを使い)作ってみましたが重いのです。
そして、シート名が毎週変わるのがネックになり困っています。
何か良いExcel VBAはありますでしょうか
初心者の質問で申し訳ございませんがご指南お願いいたします。
宜しくお願いします。
データー件数が1シートに25000件くらいあるシート(件数は毎週変わる20000件から30000件程度)
シート名は毎週変わる
・シート07(今週のシート 25000件程度)
・シート03(先週のシート 23000件程度)
データーは減るものもあるし増えるものもあります。
重複していないデータのセルに色を付けたいです。
シート07のM列とシート03のM列を比べて、重複していない
セルをシート07に色を付けたい(M列には5桁ほどの注番が入っています)
条件付き書式で数式を使用して(Counifを使い)作ってみましたが重いのです。
そして、シート名が毎週変わるのがネックになり困っています。
何か良いExcel VBAはありますでしょうか
初心者の質問で申し訳ございませんがご指南お願いいたします。
スポンサーリンク
[返信 1] Re : 条件付き書式で行うと重くて遅いのです
投稿者 : さんこう 投稿日時 : 2022/11/08(Tue) 16:20:54
>条件付き書式で数式を使用して(Counifを使い)作ってみましたが重いのです。
30000件程度なら、たいしたことないと思いますが。
仮にVBAで作るにしても、CountIfを使うことになるでしょう。
>シート名が毎週変わるのがネックになり困っています。
>何か良いExcel VBAはありますでしょうか
条件付き書式の設定を「マクロの記録」で記録したものを手直しすればよろしいかと思います。
>条件付き書式で数式を使用して(Counifを使い)作ってみましたが重いのです。
30000件程度なら、たいしたことないと思いますが。
仮にVBAで作るにしても、CountIfを使うことになるでしょう。
>シート名が毎週変わるのがネックになり困っています。
>何か良いExcel VBAはありますでしょうか
条件付き書式の設定を「マクロの記録」で記録したものを手直しすればよろしいかと思います。
[返信 2] Re : 条件付き書式で行うと重くて遅いのです
投稿者 : tek 投稿日時 : 2022/11/09(Wed) 00:46:17
一例です。たぶん1秒くらいかかります。
一例です。たぶん1秒くらいかかります。
Sub test()
Const UN = 200
Dim r As Range, r1() As Range
Dim 今週のシート As Worksheet, 先週のシート As Worksheet
Dim dic As Object
Dim n As Long, nn As Long, x As Long, y As Long
On Error Resume Next
Set r = Application.InputBox("今週のシートを指定ください", "セル選択", Type:=8)
If r Is Nothing Then Exit Sub
Set 今週のシート = r.Worksheet
Set r = Nothing
Set r = Application.InputBox("先週のシートを指定ください", "セル選択", Type:=8)
If r Is Nothing Then Exit Sub
On Error GoTo 0
Set 先週のシート = r.Worksheet
Set dic = CreateObject("Scripting.Dictionary")
For Each r In 先週のシート.Columns("m:m").SpecialCells(xlCellTypeConstants)
dic(r.Value) = Empty
Next
n = 今週のシート.Columns("m:m").SpecialCells(xlCellTypeConstants).Cells.Count
nn = Int(Sqr(n / UN))
ReDim r1(0 To nn, 0 To nn)
For Each r In 今週のシート.Columns("m:m").SpecialCells(xlCellTypeConstants)
If Not dic.exists(r.Value) Then
If r1(x, y) Is Nothing Then
Set r1(x, y) = r
Else
Set r1(x, y) = Union(r1(x, y), r)
End If
If UN < r1(x, y).Areas.Count Then
x = x + 1
If nn < x Then
x = 0
y = y + 1
End If
End If
End If
Next
For x = 0 To UBound(r1) 'x,0に集める
For y = 1 To UBound(r1, 2)
If Not r1(x, y) Is Nothing Then Set r1(x, 0) = Union(r1(x, 0), r1(x, y))
Next
Next
For x = 1 To UBound(r1) '0,0に集める
If Not r1(x, 0) Is Nothing Then Set r1(0, 0) = Union(r1(0, 0), r1(x, 0))
Next
r1(0, 0).Interior.Color = vbRed '色を塗る
End Sub
[返信 3] Re : 条件付き書式で行うと重くて遅いのです
投稿者 : ぷんぷん 投稿日時 : 2022/11/09(Wed) 10:23:36
■[返信 1] さんこうさん(2022-11-08 16:20:54)の記事
> >条件付き書式で数式を使用して(Counifを使い)作ってみましたが重いのです。
>
> 30000件程度なら、たいしたことないと思いますが。
> 仮にVBAで作るにしても、CountIfを使うことになるでしょう。
>
>
> >シート名が毎週変わるのがネックになり困っています。
> >何か良いExcel VBAはありますでしょうか
>
> 条件付き書式の設定を「マクロの記録」で記録したものを手直しすればよろしいかと思います。
>
さんこうさん ありがとうございます。
マクロの記録で作ってみましたが、毎週シート名が変わるため
countifの参照するシート名を任意にしたいのですが上手く行かず困ってます。
"=COUNTIF('イチゴの出荷1105'!M:M,M3)=0"
↑ ここのシート名が毎週変わるので、
shuut(2)とかsheetsNext(右側指定)を使いたいのですが上手く行かず
それ以外は動くのですが・・・
■[返信 1] さんこうさん(2022-11-08 16:20:54)の記事
> >条件付き書式で数式を使用して(Counifを使い)作ってみましたが重いのです。
>
> 30000件程度なら、たいしたことないと思いますが。
> 仮にVBAで作るにしても、CountIfを使うことになるでしょう。
>
>
> >シート名が毎週変わるのがネックになり困っています。
> >何か良いExcel VBAはありますでしょうか
>
> 条件付き書式の設定を「マクロの記録」で記録したものを手直しすればよろしいかと思います。
>
さんこうさん ありがとうございます。
マクロの記録で作ってみましたが、毎週シート名が変わるため
countifの参照するシート名を任意にしたいのですが上手く行かず困ってます。
"=COUNTIF('イチゴの出荷1105'!M:M,M3)=0"
↑ ここのシート名が毎週変わるので、
shuut(2)とかsheetsNext(右側指定)を使いたいのですが上手く行かず
それ以外は動くのですが・・・
[返信 4] Re : 条件付き書式で行うと重くて遅いのです
投稿者 : ぷんぷん 投稿日時 : 2022/11/09(Wed) 10:30:14
■[返信 2] tekさん(2022-11-09 00:46:17)の記事
> 一例です。たぶん1秒くらいかかります。
>
> Sub test()
> Const UN = 200
> Dim r As Range, r1() As Range
> Dim 今週のシート As Worksheet, 先週のシート As Worksheet
> Dim dic As Object
> Dim n As Long, nn As Long, x As Long, y As Long
>
> On Error Resume Next
> Set r = Application.InputBox("今週のシートを指定ください", "セル選択", Type:=8)
> If r Is Nothing Then Exit Sub
> Set 今週のシート = r.Worksheet
> Set r = Nothing
> Set r = Application.InputBox("先週のシートを指定ください", "セル選択", Type:=8)
> If r Is Nothing Then Exit Sub
> On Error GoTo 0
> Set 先週のシート = r.Worksheet
> Set dic = CreateObject("Scripting.Dictionary")
> For Each r In 先週のシート.Columns("m:m").SpecialCells(xlCellTypeConstants)
> dic(r.Value) = Empty
> Next
> n = 今週のシート.Columns("m:m").SpecialCells(xlCellTypeConstants).Cells.Count
> nn = Int(Sqr(n / UN))
> ReDim r1(0 To nn, 0 To nn)
> For Each r In 今週のシート.Columns("m:m").SpecialCells(xlCellTypeConstants)
> If Not dic.exists(r.Value) Then
> If r1(x, y) Is Nothing Then
> Set r1(x, y) = r
> Else
> Set r1(x, y) = Union(r1(x, y), r)
> End If
> If UN < r1(x, y).Areas.Count Then
> x = x + 1
> If nn < x Then
> x = 0
> y = y + 1
> End If
> End If
> End If
> Next
> For x = 0 To UBound(r1) 'x,0に集める
> For y = 1 To UBound(r1, 2)
> If Not r1(x, y) Is Nothing Then Set r1(x, 0) = Union(r1(x, 0), r1(x, y))
> Next
> Next
> For x = 1 To UBound(r1) '0,0に集める
> If Not r1(x, 0) Is Nothing Then Set r1(0, 0) = Union(r1(0, 0), r1(x, 0))
> Next
> r1(0, 0).Interior.Color = vbRed '色を塗る
> End Sub
>
>
tekさん ありがとうございます。
こちらのコードもお借りして試してみますね。
検索自体は1分ほどでもいいのですが、その後にフィルター検索を
行うときにすごく重くなるのです。
しかしすごいコードですね。
1行ずつ解読して勉強させていただきます。
■[返信 2] tekさん(2022-11-09 00:46:17)の記事
> 一例です。たぶん1秒くらいかかります。
>
> Sub test()
> Const UN = 200
> Dim r As Range, r1() As Range
> Dim 今週のシート As Worksheet, 先週のシート As Worksheet
> Dim dic As Object
> Dim n As Long, nn As Long, x As Long, y As Long
>
> On Error Resume Next
> Set r = Application.InputBox("今週のシートを指定ください", "セル選択", Type:=8)
> If r Is Nothing Then Exit Sub
> Set 今週のシート = r.Worksheet
> Set r = Nothing
> Set r = Application.InputBox("先週のシートを指定ください", "セル選択", Type:=8)
> If r Is Nothing Then Exit Sub
> On Error GoTo 0
> Set 先週のシート = r.Worksheet
> Set dic = CreateObject("Scripting.Dictionary")
> For Each r In 先週のシート.Columns("m:m").SpecialCells(xlCellTypeConstants)
> dic(r.Value) = Empty
> Next
> n = 今週のシート.Columns("m:m").SpecialCells(xlCellTypeConstants).Cells.Count
> nn = Int(Sqr(n / UN))
> ReDim r1(0 To nn, 0 To nn)
> For Each r In 今週のシート.Columns("m:m").SpecialCells(xlCellTypeConstants)
> If Not dic.exists(r.Value) Then
> If r1(x, y) Is Nothing Then
> Set r1(x, y) = r
> Else
> Set r1(x, y) = Union(r1(x, y), r)
> End If
> If UN < r1(x, y).Areas.Count Then
> x = x + 1
> If nn < x Then
> x = 0
> y = y + 1
> End If
> End If
> End If
> Next
> For x = 0 To UBound(r1) 'x,0に集める
> For y = 1 To UBound(r1, 2)
> If Not r1(x, y) Is Nothing Then Set r1(x, 0) = Union(r1(x, 0), r1(x, y))
> Next
> Next
> For x = 1 To UBound(r1) '0,0に集める
> If Not r1(x, 0) Is Nothing Then Set r1(0, 0) = Union(r1(0, 0), r1(x, 0))
> Next
> r1(0, 0).Interior.Color = vbRed '色を塗る
> End Sub
>
>
tekさん ありがとうございます。
こちらのコードもお借りして試してみますね。
検索自体は1分ほどでもいいのですが、その後にフィルター検索を
行うときにすごく重くなるのです。
しかしすごいコードですね。
1行ずつ解読して勉強させていただきます。
[返信 5] Re : 条件付き書式で行うと重くて遅いのです
投稿者 : さんこう 投稿日時 : 2022/11/09(Wed) 11:00:47
>countifの参照するシート名を任意にしたいのですが上手く行かず困ってます。
こんな感じでしょうか。
>countifの参照するシート名を任意にしたいのですが上手く行かず困ってます。
こんな感じでしょうか。
Sub a()
MsgBox "=COUNTIF('" & ActiveSheet.Next.Name & "'!M:M,M3)=0"
End Sub
[返信 6] Re : 条件付き書式で行うと重くて遅いのです
投稿者 : ぷんぷん 投稿日時 : 2022/11/09(Wed) 18:19:52
■[返信 5] さんこうさん(2022-11-09 11:00:47)の記事
> >countifの参照するシート名を任意にしたいのですが上手く行かず困ってます。
>
> こんな感じでしょうか。
>
>
> Sub a()
> MsgBox "=COUNTIF('" & ActiveSheet.Next.Name & "'!M:M,M3)=0"
> End Sub
>
さんこうさん 再度のご指南ありがとうございました。
感動です!!動きました。
すごく勉強になりました。
自分は、もっと学ばないとだめですね。
また、困ったことがありましたら質問させていただきます。
■[返信 5] さんこうさん(2022-11-09 11:00:47)の記事
> >countifの参照するシート名を任意にしたいのですが上手く行かず困ってます。
>
> こんな感じでしょうか。
>
>
> Sub a()
> MsgBox "=COUNTIF('" & ActiveSheet.Next.Name & "'!M:M,M3)=0"
> End Sub
>
さんこうさん 再度のご指南ありがとうございました。
感動です!!動きました。
すごく勉強になりました。
自分は、もっと学ばないとだめですね。
また、困ったことがありましたら質問させていただきます。
当掲示板について
- Excel VBA に関する掲示板です。Excel VBA に関する質問や疑問、それに対する解決方法など気軽に投稿してください。
- 記事内ではHTMLのタグは使用できません。
- 記事は一度投稿すると修正できません。内容を訂正したい場合は返信で対応してください。
- Sub〜End Sub、Function〜End Function は自動的にプログラムコードとみなし、枠で囲って見やすくします。
- Excel VBA とは関係ないことや、他人が不快に思うようなことなど、管理人が適当でないと判断した記事は削除する場合があります。
スポンサーリンク
返信入力フォーム
( 処理日時 : 2026-04-02 03:36:38 )