Excel (一般機能) |
![]() ![]() |
(指定なし : Microsoft 365)
データが膨大なため処理が遅い
投稿日時: 23/08/04 00:04:19
投稿者: yama1006
|
---|---|
お世話になります。
|
![]() |
投稿日時: 23/08/04 01:23:22
投稿者: hatena
|
---|---|
この掲示板では、ファイルを直接ダウンロードさせることは禁止されています。(下記リンク参照)
|
![]() |
投稿日時: 23/08/04 09:01:03
投稿者: 半平太
|
---|---|
> If ws1.Cells(i, 2) = ws2.Cells(l, 1) Then '社員コードが一致
|
![]() |
投稿日時: 23/08/04 09:37:32
投稿者: 半平太
|
---|---|
あれ? ここは一般機能板ですけども・・ |
![]() |
投稿日時: 23/08/04 12:25:40
投稿者: Suzu
|
---|---|
If ws1.Cells(i, 2) = ws2.Cells(l, 1) Then '社員コードが一致
|
![]() |
投稿日時: 23/08/04 15:02:40
投稿者: hatena
|
---|---|
シートレイアウトの提示がないので、今回だけダウンロードして内容を確認してみました。
Sub 勤怠比較() Dim ws1 As Worksheet, ws2 As Worksheet Set ws1 = Sheets("元データ") Set ws2 = Sheets("受入データ") ws2.Cells.ClearFormats Dim i As Long Dim l As Long Dim o2 As Long Dim o3 As Long Dim maxRow1 As Long Dim maxRow2 As Long Dim maxCol1 As Long Dim maxCol2 As Long maxRow1 = ws1.Cells(Rows.Count, 2).End(xlUp).Row maxRow2 = ws2.Cells(Rows.Count, 1).End(xlUp).Row maxCol1 = ws1.Cells(6, Columns.Count).End(xlToLeft).Column maxCol2 = ws2.Cells(1, Columns.Count).End(xlToLeft).Column Application.ScreenUpdating = False Application.Calculation = xlManual For i = 7 To maxRow1 For l = 2 To ws2.Cells(Rows.Count, 1).End(xlUp).Row If ws1.Cells(i, 2) = ws2.Cells(l, 1) Then '社員コードが一致 For o2 = 3 To maxCol1 For o3 = 2 To maxCol2 If ws1.Cells(6, o2) = ws2.Cells(1, o3) Then '列見出しが一致 If ws1.Cells(i, o2) <> ws2.Cells(l, o3) Then ws2.Cells(l, o3).Interior.Color = RGB(255, 0, 0) End If Exit For End If Next Next Exit For End If Next Next Application.ScreenUpdating = True Application.Calculation = xlAutomatic End Sub 修正前のコードだと処理に数分かかっていたのが、上記のコードだと一瞬で終わりました。 |
![]() |
投稿日時: 23/08/04 15:09:47
投稿者: hatena
|
---|---|
ダウンロードしたデータ量なら一瞬で終わるので、
Public Sub Sample() Sheets("受入データ").Cells.ClearFormats Dim rng1 As Range, rng2 As Range Set rng1 = Sheets("元データ").Range("A6").CurrentRegion Set rng2 = Sheets("受入データ").Range("A1").CurrentRegion Dim ary1() As Variant, ary2() As Variant ary1 = rng1.Value ary2 = rng2.Value Dim dic As Object Set dic = CreateObject("Scripting.Dictionary") Dim r As Long, c As Long For r = 2 To UBound(ary1) For c = 3 To UBound(ary1, 2) dic(ary1(r, 2) & " " & ary1(1, c)) = ary1(r, c) Next Next Dim rng3 As Range For r = 2 To UBound(ary2) For c = 2 To UBound(ary2, 2) If dic.Exists(ary2(r, 1) & " " & ary2(1, c)) Then If dic(ary2(r, 1) & " " & ary2(1, c)) <> ary2(r, c) Then If rng3 Is Nothing Then Set rng3 = rng2.Cells(r, c) Else Set rng3 = Union(rng3, rng2.Cells(r, c)) End If End If Else Set rng3 = Union(rng3, rng2.Cells(r, c)) End If Next Next rng3.Interior.Color = vbRed End Sub |
![]() |
投稿日時: 23/08/05 16:02:55
投稿者: yama1006
|
---|---|
hatena さんの引用: exit for についてなのですが、こちらは For o3 = 2 To maxCol2 For o2 = 3 To maxCol1 それぞれこちらのループを抜けるためのものでしょうか? |
![]() |
投稿日時: 23/08/05 19:24:49
投稿者: yama1006
|
---|---|
|
![]() |
投稿日時: 23/08/05 22:10:24
投稿者: hatena
|
---|---|
yama1006 さんの引用: Exit For は記述してある階層のForを抜けます。 最初の Exit For は、 For o3 = 2 To maxCol2 を抜けます。 次の Exit For は、 For l = 2 To ws2.Cells(Rows.Count, 1).End(xlUp).Row を抜けます。 今、気づきましたが、ここは、下記の方がいいですね。 For l = 2 To maxRow2 |
![]() |
投稿日時: 23/08/05 23:06:22
投稿者: hatena
|
---|---|
引用: だいたいあってますが、正確には、 Keyには社員番号と列見出し(何かのコード?)を連結したものを、 Itemには社員番号と列見出しに対応した数値を格納してます。 引用: 受入データの社員番号&列見出しがdicのkeyに存在するかどうか確認しています。 存在したら、次のコードでそれぞれの対応する値が一致するか判定してます。 引用: VBAでは、代入と比較が同じ記号(=)を使うの紛らわしいのですが、 A = B はAにBを代入という意味ですが(代入演算子)、 If A = B Then とIf文に記述したときは、AとBを比較するという意味です(比較演算子)。一致したらTrueを、一致しなかったらFalseを返します。なにも代入(格納)はしません。 引用: この部分は、rng3 に不一致のセルをまとめて格納していくコードです。 ループを抜けてから、最後に該当の複数セルを一気に背景色を変更します。 その都度、1セルずつ変更するより高速化できます。 複数セルをUnionメソッドを使ってまとめることができます。 rng3が空(Nothing)のとき、 Union(rng3, rng2.Cells(r, c)) とするとエラーになるので、 Unionを使わずに不一致セルのみをrng3に代入してます。 引用: 下記の2行を削除してください。 For c = 2 To UBound(ary2, 2) If dic.Exists(ary2(r, 1) & " " & ary2(1, c)) Then If dic(ary2(r, 1) & " " & ary2(1, c)) <> ary2(r, c) Then If rng3 Is Nothing Then Set rng3 = rng2.Cells(r, c) Else Set rng3 = Union(rng3, rng2.Cells(r, c)) End If End If Else '←この行削除 Set rng3 = Union(rng3, rng2.Cells(r, c))'←この行削除 End If |
![]() |
投稿日時: 23/08/06 12:13:03
投稿者: yama1006
|
---|---|
|
![]() |
投稿日時: 23/08/06 16:30:01
投稿者: hatena
|
---|---|
yama1006 さんの引用: dicには、元データの 社員コード&行見出し(Key) とそれに対応する数値(Item) が格納されています。 提示のコードの直前のIf文の下記で dic.Exists(ary2(r, 1) & " " & ary2(1, c)) で、受入データの 社員コード&行見出し と同一のKeyが存在するか確認して、 存在するなら、 dic(ary2(r, 1) & " " & ary2(1, c)) で、そのキーに対応する元データの数値(Item)を取り出します。 それと、このキーに対応する受入データの数値 ary2(r, c) とを比較しています。 |
![]() |
投稿日時: 23/08/06 23:48:09
投稿者: yama1006
|
---|---|
|