3

Microsoft AccessでVBAスクリプトを作成しようとしています。このスクリプトは、Excelシートとインターフェイスし、行をループしてから行のセルをループし、情報をAccessテーブルにプルバックします。

ここにいくつかのsudoコードがあります-

For Each Row
    For Each Cell in the Row
        Read the Cell
        Create a new Record in the Access table with the info from the cell
    End For Each
End For Each

下の写真で、最終結果の簡略化された例を見ることができます。

私たちが持っているもの-

ここに画像の説明を入力してください

必要とされていること-

ここに画像の説明を入力してください

以前にコーディングしたことがありますが、VBAでコーディングしたことはありません。だからどんな助けもいただければ幸いです!ご協力いただきありがとうございます!!!

4

2 に答える 2

2

さまざまなウィザードまたは DoCmd の TransferSpreadsheet メソッドを使用して Excel シートをリンクし、リンクされた Excel テーブルを使用してアクション クエリを実行することをお勧めします。

ユニオン クエリが必要です。リンクされたスプレッドシートを t と呼びましょう。

SELECT * INTO Table1
FROM (
    SELECT [Seq#], "Name" As [Field Name], [Name] As [Field Value]
    FROM t
    UNION ALL
    SELECT [Seq#], "Location" As [Field Name], [Location] As [Field Value]
    FROM t
    UNION ALL
    SELECT [Seq#], "Car" As [Field Name], [Car] As [Field Value]
    FROM t ) imp

INSERT INTO Table1
SELECT * FROM (
    SELECT [Seq#], "Name" As [Field Name], [Name] As [Field Value]
    FROM t
    UNION ALL
    SELECT [Seq#], "Location" As [Field Name], [Location] As [Field Value]
    FROM t
    UNION ALL
    SELECT [Seq#], "Car" As [Field Name], [Car] As [Field Value]
    FROM t ) imp

フィールド名と列名からスペースと予約語を取り除くことで、作業が楽になります。

一般に、上記のようにアスタリスク (*) を使用するフィールドをリストすることをお勧めします。

于 2012-06-12T15:09:42.150 に答える
2

@Remouが提案したように、最初にExcelワークシートへのリンクを作成します。次の例では、リンクに「tblExcelData」という名前を付けました。次に、「tblDestination」は、要求どおりにワークシート行の「セル」ごとに個別のレコードを保存します。ではtblDestinationSeq#は long integer であり、Field NameField Valueは両方ともテキストです。

Public Sub foo20120612a()
    Dim db As DAO.Database
    Dim rsSrc As DAO.Recordset
    Dim rsDest As DAO.Recordset
    Dim fld As DAO.Field

    Set db = CurrentDb
    Set rsSrc = db.OpenRecordset("tblExcelData", dbOpenSnapshot)
    Set rsDest = db.OpenRecordset("tblDestination", _
        dbOpenTable, dbAppendOnly)
    Do While Not rsSrc.EOF
        For Each fld In rsSrc.Fields
            If fld.Name <> "Seq#" Then
                With rsDest
                    .AddNew
                    ![Seq#] = CLng(rsSrc![Seq#])
                    ![Field Name] = fld.Name
                    ![Field Value] = fld.value
                    .Update
                End With
            End If
        Next fld
        rsSrc.MoveNext
    Loop
    rsDest.Close
    Set rsDest = Nothing
    rsSrc.Close
    Set rsSrc = Nothing
    Set db = Nothing
End Sub
于 2012-06-12T16:07:01.513 に答える