テーブルにデータがあればアップデート、無ければインサートという作業をおこないたいです。例えばExcelに列ID,Name,Addressがあるとします。Accessのテーブル、TableにIDとNameの2つをキーとして、テーブルにIDとNameのキーがなければインサート、有ればアップデートという作業をおこないたいです。Excelからテーブルへのアップデート、インサート方法は理解してコードを書けるのですが、上記の処理方法がわかりません。ご教授お願いいたします。VBAです。

回答の条件
  • 1人2回まで
  • 登録:2009/03/11 22:54:04
  • 終了:2009/03/14 04:32:06

ベストアンサー

id:Mook No.1

Mook回答回数1312ベストアンサー獲得回数3912009/03/12 11:12:43

ポイント120pt

ACCESS は table1 というデータベースに id(整数型), name(文字列型),data(文字列型)

EXCEL(import.xls) の2行目からデータがあり、A列:id、B列:name、C列:data

があるという前提でのACCESS での VBAサンプルです。

Option Compare Database
Option Explicit

Const EXCEL_DATA_FILE = "C:\Data\import.xls"

Sub importExcel()
    Dim oApp As Object

    Set oApp = CreateObject("Excel.Application")
    oApp.Visible = True
    oApp.workbooks.Open FileName:=EXCEL_DATA_FILE

    Dim i As Long
    i = 2
    Dim condition As String
    Do While oApp.cells(i, "A").Value <> ""
        condition = "[name]='" & oApp.cells(i, "B").Value & "' AND [id]=" & oApp.cells(i, "A").Value
        CurrentDb.Execute makeQuery(oApp, i, IsNull(DLookup("[id]", "table1", condition)))
        i = i + 1
    Loop
    oApp.workbooks(1).Close
    oApp.Quit
End Sub

Function makeQuery(oApp As Object, rowNum As Long, queryMode As Boolean) As String
    If queryMode = False Then
        makeQuery = "UPDATE table1 SET [data]='" & oApp.cells(rowNum, "C").Value & "'"
        makeQuery = makeQuery & " WHERE [id]=" & oApp.cells(rowNum, "A").Value
        makeQuery = makeQuery & " AND [name]='" & oApp.cells(rowNum, "B").Value & "'"
    Else
        makeQuery = "INSERT INTO table1 ( [id], [name], [data] ) VALUES ("
        makeQuery = makeQuery & oApp.cells(rowNum, "A").Value
        makeQuery = makeQuery & ", '" & oApp.cells(rowNum, "B").Value & "'"
        makeQuery = makeQuery & ", '" & oApp.cells(rowNum, "C").Value & "' );"
    End If
End Function

http://www.accessclub.jp/bbs6/0007/das1795.html

id:akaired

ご回答ありがとうございます!助かりました!

2009/03/14 04:31:56
  • id:KuroNeko666
    …やりたいことがイマイチわからないのでコメント。
    Access から Excel ?

    単純に、ループを使って1行目からなめていくのは NG?
    パフォーマンスを気にするなら他の手段(2分探索とか)を考えるとか…

  • id:kn1967
    レコード単位で照らし合わせてINSERTかUPDATEってのは効率よくないでしょう。

    1)作業用のテーブルを用意して、そこに書き込み。
    2)作業用テーブルから一括してinsert(既存のレコードはエラーとしてはじかれる)
    3)作業用テーブルからupdate

    この方法だとinsertして同じ内容でupdateされるレコードもでてくるけど
    レコード毎にSQLを発行するより効率は良い。

    以上、質問の趣旨と外れるのでコメント欄で・・・。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません