人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

SQLでupdateをおこないたいと思っています。update TABLE Set 列1='値',列2='値'.....というのはわかるのですが、列の数が100も200もある場合、列1='値'と書いていくには時間がかかります。ちなみに全ての行の値を一括でアップデートしたいです。

ちなみにExcelの列とアクセスのテーブルのフィールド名は全く一緒です。

やりたいことは、
1.VBAでExcelの1行を読み取る。
Excelの列にIDがある。
アクセスのテーブルにもID列がある。
Excelで読み取ったIDがアクセス側にあれば、アップデートをかける。
IDがなければインサートを行う。

2.Excelの列とAccessのテーブルの列は同じフィールド名。
3.Excelで1行読み取ったら次の行へ。繰り返し。

ということをしたいです。次の行へはループでまわせばいいので理解できます。ただ、列数が100以上もあるので上のように列=値と1つ1つやっていると大変です。何かよい手はないでしょうか?


●質問者: akaired
●カテゴリ:コンピュータ
✍キーワード:access Excel SET SQL VBA
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● rutta888
●200ポイント ベストアンサー

おそらく知りたい情報は動的にフィールド名を設定するということ。

sql = "UPDATE table SET " & Cells(i, 1) & " = '" & Cells(i, j) & "'"

objRS(Cells(i, 1)) = Cells(i, j)



という条件でupdate文なら

Dim lngRowCount as long
lngRowCount = Excelのデータ行数

Dim lngColCount as long
lngColCount = Excelデータ列数

Dim i as long
for i = 2 to lngRowCount
 Dim sql as string
 sql = "UPDATE table SET "

 dim j as long
 for j = 2 to lngColCount
 sql = sql & Cells(1, j) & "='" & Cells(i,j) & "', "
 next j

 sql = sql & " WHERE id='" & Cells(i,1) & "'"
 debug.print sql
next i

面倒なことを考えたくなかったらDAO.Recordsetで

Dim lngRowCount as long
lngRowCount = Excelのデータ行数

Dim lngColCount as long
lngColCount = Excelのデータ列数

Dim objRS as DAO.Recordset
set objRS = CurrentDB.OpenRecordset("table")
with objRS

 dim i as long
 for i = 2 to lngRowCount

 .findfirst("id ='" & Cells(i,1) & "'")
 if .nomuch then
 .addnew
 else
 .edit
 end if

 dim j as long
 for j = 2 to lngColCount
 .Fileds(Cells(1,j)) = Cells(i, j)
 next j

 .update

 .movefirst
 next i
end with
set objRS = nothing

accessとexcelが手元にないので動かなかったらごめんなさい。

◎質問者からの返答

ご回答ありがとうございます。考え方教えていたいて助かりました!

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ