|
前回下記のようなアドバイスを頂いていて、ずっと気になっていたのですが、実際膨大なデータを扱う必要が出てきたので、お教え下さい。
>前回の投稿から色々勉強してみたところ
>「Find」「Filter」等のメソッドは、データ量が多くなると
>パフォーマンスが相当落ちるようです。
>(膨大なデータを業務で扱っている方から情報を頂きました)
>という事で回避方法として、
>>rs2.Open "listyoko", cn, adOpenKeyset, adLockOptimistic
>この時点で全てのレコードをオープンしていますが、
>「rs1」のレコードが動く度に、Where条件をつけて「rs2」をその都度開いた方が
>結果として高速に処理できるかと思われます。
下記のように直してみましたが、「名前または序数に対応する項目がコレクションで見つかりません」と出てしまいます。全くわからないままコードを書いてみましたので、かなり変だと思います。申し訳ありませんが、よろしくお願いいたします。
Public Function 横並び()
Dim cn As ADODB.Connection
Dim rs1 As ADODB.Recordset
Dim rs2 As ADODB.Recordset
Dim cr As String
Dim I As Long
Dim J As Long
Application.Echo False
DoCmd.Hourglass True
Set cn = Application.CurrentProject.Connection
Set rs1 = New ADODB.Recordset
rs1.Open "list", cn, adOpenStatic, adLockReadOnly
sql = "SELECT * FROM listyoko WHERE 契約者名='" & rs1.Fields("契約者名") & "'"
Set cn = CurrentProject.Connection '接続
Set rs2 = New ADODB.Recordset
rs2.Open sql, cn, adOpenKeyset, adLockOptimistic
Do Until rs1.EOF
If Not IsNull(rs1![区分].Value) Then
'データなし(新規)
If rs2.EOF Then
rs2.AddNew
For I = 1 To 4
rs2(I - 1) = rs1(I)
Next I
'データあり(追加)
Else
J = 0
'空のフィールドを検索
Do Until rs2(J*3+1) = "" Or IsNull(rs2(J*3+1))
J = J + 1
Loop
For I = 0 To 2
rs2(I + J) = rs1(I + 2)
Next
End If
'更新
rs2.Update
End If
rs1.MoveNext
Loop
'オブジェクトの解放
rs1.Close: Set rs1 = Nothing
rs2.Close: Set rs2 = Nothing
cn.Close: Set cn = Nothing
End Function
|
|