0

Access VBAスクリプトがあります

  • ディレクトリ内の Excel スプレッドシートのリストをループします
  • 各スプレッドシートの各シートをループします
  • シートから Access テーブルにデータをインポートします

もう 1 つのステップを追加したいと思います。

  • Field1列 の Excel 値を Access テーブル の値のリストと比較しExclude、一致が見つかった場合は Excel の行全体を削除します。

以下は簡略化されたコードで、新しいコードの配置場所を示す注記が付いています。

Dim rs As Recordset
Set rs = CurrentDb.OpenRecordset("SELECT * FROM FileList")
rs.MoveFirst

Dim appExcel As Excel.Application
Set appExcel = New Excel.Application
Dim objWorkbook As Excel.Workbook
Dim objSheet As Excel.Worksheet

Do Until rs.EOF = True
    strFilePath = rs!FilePath
    Set objWorkbook = appExcel.Workbooks.Open(strFilePath)
    For Each objSheet In objWorkbook.Sheets
        objSheet.Select
        strQuery = 
           "INSERT INTO tblImport (Field1) 
            SELECT [Field1] 
            FROM [Excel 8.0;HDR=YES;DATABASE=" & strFilePath & "].[" & objSheet.Name & strRange & "]"
        CurrentDb.Execute strQuery, dbFailOnError
        ***Add Code Here to Delete Rows in Excel where value found in Exclusion table***
        Next objSheet
    Set objSheet = Nothing
    objWorkbook.SaveAs FileName:=strFilePath, FileFormat:=xlExcel8
    objWorkbook.Close SaveChanges:=False
    Set objWorkbook = Nothing
    rs.MoveNext
    Loop

別の RecordSet を Dim する必要があると確信しています。

Dim rsExclude AS Recordset
Set rsExclude = CurrentDb.OpenRecordset("SELECT * FROM Exclude")

じゃあ何?または、誰かが別のアプローチを推奨できますか?

4

2 に答える 2

1

さて、私は解決策を思いつきました。それが「最適」であるとは確信していませんが(この反復ソリューションではなく、セットベースのソリューションを望んでいました)、非常に高速に動作します。基本的に、次のことを行う Do-While ループを追加しました。

  • 範囲内の各行番号を反復処理します
  • DAccess テーブル フィールドに対して値をルックアップする
  • 一致しない場合は、カウンターを繰り返します
  • 一致する場合、行を削除し、合計行数を減らします

以下のコードを追加しました:

Do While intRow <= strLastRow
    If IsNull(DLookup("Field1", "Exclude", "Field1 = '" & objSheet.Range("A" & intRow).Value & "'")) Then
        intRow = intRow + 1 'No match, move to next row
    Else
        objSheet.Rows(intRow).Delete 'Match found, delete row
        strLastRow = strLastRow - 1 'Decrease the number of rows in range
    End If
    Loop
于 2013-10-04T15:35:21.497 に答える