Microsoft Access 掲示板

accessから、重複のないデータを取得する

3 コメント
views

SELECT DISTINCTを使うと、少し負荷が大きいようで時間がかかります
重複削除は、Dictionaryが最速だと思うのですが

Dim myArray As Variant
    yname = Environ("UserProfile") 'ユーザー名を取得
    strFileName = "管理元帳.accdb" 'データベースのファイル名
    Set adoCn = CreateObject("ADODB.Connection") 'ADODBコネクションオブジェクトを作成
    adoCn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & yname & "\Desktop\案件\職業紹介業\職業紹介必要書類\提出分\" & strFileName & ";" 'Accessファイルに接続
    Set adoRs = CreateObject("ADODB.Recordset") 'ADOレコードセットオブジェクトを作成
    strSQL = "SELECT 案件番号 FROM temp ;"

    Set adoRs = CreateObject("ADODB.Recordset") 'ADOレコードセットオブジェクトを作成
    adoRs.CursorLocation = adUseClient 'adUseServer(デフォルト)をCursorLocationに変更す
    adoRs.Open strSQL, adoCn, Options:=adCmdTableDirect

    FlCnt = adoRs.Fields.Count
    RcCnt = adoRs.RecordCount

    ReDim myArray(FlCnt, RcCnt) '二次元配列を再定義
  myArray = adoRs.GetRows

    x = 0
    Dim nbDic As Object
    Set nbDic = CreateObject("Scripting.Dictionary")
    For i = 0 To RcCnt - 1
      If nbDic.exist(myArray(0, i)) = False Then 'ここでエラー
         x = x + 1
      End If
     Next

    MsgBox x

エラー 438 オブジェクトはこのプロパティまたはメソッドをサポートしていません
となるのですが、回避してDictionaryを使用する方法はあるのでしょうか?

sql
作成: 2025/11/25 (火) 12:16:29
通報 ...
1

原因が分かりました
.Existsでした
sが抜けてました

2
名前なし 2025/11/27 (木) 14:26:53 40184@3d35d

「重複のないデータを取得する」とのことですが、件数を取得するということでいいのでしょうか。
提示のコードは常に全データ件数になり、重複も含む件数になると思いますが。

'前略

    ReDim myArray(FlCnt, RcCnt) '二次元配列を再定義
    myArray = adoRs.GetRows    '全レコードを配列として取得

    x = 0
    Dim nbDic As Object
    Set nbDic = CreateObject("Scripting.Dictionary") 'Dictionaryを生成、Dictionaryの中身は空
    For i = 0 To RcCnt - 1
      If nbDic.exists(myArray(0, i)) = False Then '空のDictionary内にデータがあるか確認
                                                  '空なので存在するはずがない、常にFalse
         x = x + 1
      End If
     Next

    MsgBox x

件数を取得するなら下記のようなコードになると思います。

'前略

    ReDim myArray(FlCnt, RcCnt) '二次元配列を再定義
    myArray = adoRs.GetRows    '全レコードを配列として取得

    Dim nbDic As Object
    Set nbDic = CreateObject("Scripting.Dictionary") 'Dictionaryを生成、Dictionaryの中身は空
    For i = 0 To RcCnt - 1
      nbDic(myArray(0, i)) = myArray(0, i) 'データ配列の1列目をDictionaryに格納
                                           ’重複データは上書きされる
    Next

    MsgBox nbDic.Count  ’件数を表示

SELECT DISTINCTを使うと、少し負荷が大きいようで時間がかかります

重複をチェックするフィールドに インデックス(重複あり) を設定してありますか。
もし設定してないなら、設定すると飛躍的に速度は改善すると思います。

3

上記の投稿は私の投稿です。出先でログインせずに投稿してしまいました。