0

csv ファイルを Access テーブルにインポートするこのコードがあります。私のスキルのレベルを超えた問題やアイデアがいくつかあります。最初の問題は、ファイルが既存のフィールドを追加せず、代わりにファイル全体が挿入され、新しいヘッダーを含む複製が作成されることです。

2 番目の問題は、テーブル全体ではなく、csv ファイル内の新しいレコードまたは更新されたレコードのみを Access からエクスポートしたいということです。まだそこに到達していません。

ここで少し手を握る必要があります。

皆さん、このフォーラムと皆さんに感謝します。あなたの知識を共有するために常に役に立ち、嘆き悲しんでいます。

Option Compare Database
Option Explicit

Private Sub ImportFile()
Dim strPathFile As String, strFile As String, strPath As String
Dim strTable As String

Dim xlApp As Object, xlWb As Object, xlWs As Object
Dim lngRow As Long, lngLastRow As Long
Dim rst As DAO.Recordset

strPath = "C:\Transit\"
strTable = "Transit"
strFile = Dir(strPath & "*.csv")

Set rst = CurrentDb.OpenRecordset(strTable)

Do While Len(strFile) > 0

      strPathFile = strPath & strFile

        Set xlApp = CreateObject("Excel.Application")
        Set xlWb = xlApp.Workbooks.Open(strPathFile)
        Set xlWs = xlWb.Worksheets(1)

        lngLastRow = xlWs.UsedRange.Rows.Count

        For lngRow = 1 To lngLastRow

            rst.AddNew
            rst("Field1") = xlWs.Range("A" & lngRow).Value
            rst("Field2") = xlWs.Range("B" & lngRow).Value
            rst("Field3") = xlWs.Range("C" & lngRow).Value
            rst("Field4") = xlWs.Range("D" & lngRow).Value
            rst("Field5") = xlWs.Range("E" & lngRow).Value
            rst("Field6") = xlWs.Range("F" & lngRow).Value
            rst("Field7") = xlWs.Range("G" & lngRow).Value
            rst.Update

        Next

    xlApp.Quit
    Set xlApp = Nothing
    Set xlWb = Nothing
    Set xlWs = Nothing
    strFile = Dir()
Loop

rst.Close
Set rst = Nothing

End Sub
4

2 に答える 2

2

そのファイルにリンクされたテーブルを作成することをお勧めします。これが完了すると、SELECT やアクション クエリの実行など、リンクされた Excel ファイルを他のテーブルと同じように扱うことができます。あなたの場合、Excel スプレッドシートを宛先として単純な追加クエリを作成し、更新されていないレコードのみに制限することができます。

外部の Excel ファイルをリンクする また、クエリ デザイナの [テーブルの追加] ダイアログ ボックスにも表示されます。


更新しました

Excel ファイルへのパスが固定されていない場合は、ファイルの再リンクを自動化するために少し VBA が必要になります。

'Defined as a function instead of a Sub
'Allows calling from an AutoExec macro, or setting as an eventhandler property
Public Function Relink(path As String)
    Dim dbs As DAO.Database, tdf As DAO.TableDef
    Dim newConnect As String
    Dim connectParts As Variant, part As Variant, keyValuePair As Variant
    Dim key As String, value As String, delimiterPosition As Integer

    'Objects created from CurrentDb can only be referenced once; after that they cause an error
    'Therefore we need save a reference to the Database object in a variable
    Set dbs = CurrentDb

    'Each table has a corresponding TableDef (table definition) object
    Set tdf = dbs.TableDefs("LinkedSheet")

    'TableDef objects have a Connect property, containing a connection string for linked tables
    '(For non-linked tables this will be a zero-length string)
    'A connection string has the form key=value;key1=value1 etc.
    connectParts = Split(tdf.Connect, ";")
    For Each part In connectParts
        keyValuePair = Split(part, "=")
        If keyValuePair(0) = "DATABASE" Then
            keyValuePair(1) = path
        End If
        newConnect = newConnect & ";" & Join(keyValuePair, "=")
    Next

    'We need to remove the extra semicolon in the beginning
    newConnect = Mid(newConnect, 2)

    'Set the connection string, and save the change by calling RefreshLink
    tdf.Connect = newConnect
    tdf.RefreshLink
End Function
于 2012-11-29T10:01:00.093 に答える
1

OK、少し短い答えですが、少し調べてみると、役立つと思います。

DoCmd.TransferTextコマンドを調べます。これで、csv ファイルを一時テーブルにインポートできます。ファイルにヘッダーがあるかどうかを指定するオプションもあります。次のようになります。

DoCmd.TransferText acImportDelim, , "temp", "c:\Transit\myfile.csv", True

一時テーブルに格納したら、クエリを実行して新しいレコードを確認し、それらを永続テーブルに追加します。

于 2012-11-29T07:37:30.857 に答える