|    | 
     二つのテーブル新TBLと旧TBLが存在します。 
この二つのテーブルは全く同じ項目が載っているわけではないので、必要な項目列だけをチェックしたいと思っています 
 
二つのデーブルを比較して、新と旧で中身が変更となっているものはどれなのか?を調べ、 
変更TBLに変更を生じた箇所だけをリストアップしていきたいと思ってます。 
 
下記のように作ってみたのですが、途中でどうしてもエラーとなってしまい、先へ進まず悩んでます。 
 
 If Mydic.Item(strKey)(u) <> MyVal2(u) Then ’←ココでエラーがでます。(オブジェクトが有効ではありません) 
 
どうかご教授お願いします。 
Dictionaryオブジェクトの使い方が間違っているのでしょうか? 
 
Option Compare Database 
 
Sub ChangeData() 
 
'変更した箇所のチェック 
 
Dim rs As ADODB.Recordset 
Dim rst As ADODB.Recordset 
Dim rsC As ADODB.Recordset 
Dim MyVal, MyVal2, MyVal3, MyVal4 
Dim lCnt As Long 
Dim Mydic As Object 
Dim Dic_Change As Object 
Dim strKey As String 
Dim DC As Long 
 
 
Set Mydic = CreateObject("scripting.dictionary") 
Set Dic_Change = CreateObject("scripting.dictionary") 
 
 
Set rs = New ADODB.Recordset 
  rs.CursorType = adOpenKeyset 
  rs.LockType = adLockReadOnly 
 
Set rst = New ADODB.Recordset 
  rst.CursorType = adOpenKeyset 
  rst.LockType = adLockReadOnly 
   
Set rsC = New ADODB.Recordset 
  rsC.CursorType = adOpenKeyset 
  rsC.LockType = adLockOptimistic 
 
 
rs.Open "新TBL", CurrentProject.Connection, , adCmdTable 
rst.Open "旧TBL", CurrentProject.Connection, , adCmdTable 
rsC.Open "変更List", CurrentProject.Connection, , adCmdTable 
 
 
旧TBLにデータがあったら差異箇所をチェック 
DC = rst.RecordCount 
 
If DC > 0 Then 
 
 
’新TBLのデータをDictionaryオブジェクトを使用してデータを取得 
 
rs.MoveFirst 
 
Do Until rs.EOF 
 strKey = rs![KEY] 
 If Not Mydic.Exists(strKey) Then 
  MyVal = Array(rs![F1], rs![F2], rs![F3], rs![F4], rs![F5], rs![F6], rs![F7], _ 
        rs![F8], rs![F10], rs![F11], rs![F12], rs![F13], rs![F14], rs![F17]) 
         
  Mydic.Add strKey, MyVal 
  
 End If 
 rs.MoveNext 
Loop 
 
rs.Close 
Set rs = Nothing 
 
’もし、新データと同じKeyがあったら、旧データを配列格納し、新データと旧データを比較し、違うものがあれば、新データの値を配列格納し、同じ場合は、””値を格納する 
rst.MoveFirst 
 
Do Until rst.EOF 
 strKey = rst![KEY] 
 If Mydic.Exists(strKey) Then 
   MyVal2 = Array(rst![F2], rst![F3], rst![F4], rst![F5], rst![F6], rst![F7], rst![F8], _ 
        rst![F10], rst![F11], rst![F12], rst![F13], rst![F14], rst![F15], rst![F16]) 
      
 
    If Mydic.Exists(strKey) Then 
     For u = 0 To UBound(MyVal2) 
        
      If Mydic.Item(strKey)(u) <> MyVal2(u) Then ’←ココでエラーがでます。(オブジェクトが有効ではありません) 
        lCnt = UBound(MyVal3) 
        ReDim Preserve MyVal3(lCnt) 
        MyVal3(lCnt) = Mydic.Item(strKey)(u)’新データを格納 
       Else 
        lCnt = UBound(MyVal3) 
        ReDim Preserve MyVal3(lCnt) 
        MyVal3(lCnt) = "" ’空白を格納 
       End If 
     Next u 
    End If 
     
   Dic_Change.Add strKey, MyVal3 
    
    
 End If 
 rst.MoveNext 
 Loop 
 rst.Close 
Set rst = Nothing 
 
Dim MyKey, MyItem 
 
MyKey = Dic_Change.Keys 
MyItem = Dic_Change.Items 
 
 
For i = 0 To UBound(MyKey) 
rsC.AddNew 
  MyVal4 = Array(rsC![F2], rsC![F3], rsC![F4], rsC![F5], rsC![F6], rsC![F7], _ 
        rsC![F8], rsC![F9], rsC![F10], rsC![F11], rsC![F12], rsC![F13], rsC![F14], rsC![F15]) 
   
  rsC![F1] = MyKey(i) 
  For u = 0 To UBound(MyVal4) 
   rsC!MyVal4(u) = Dic_Change(MyKey(u))(u) 
  Next u 
  rsC.Update 
Next i 
 
  rsC.Close 
  Set rsC = Nothing 
 
Else 
 
rs.Close 
Set rs = Nothing 
rst.Close 
Set rst = Nothing 
rsC.Close 
Set rsC = Nothing 
 
 
End If 
 
End Sub 
 
 | 
     
    
   |