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つやっていると大変です。何かよい手はないでしょうか?

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2009/03/06 21:14:59
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:rutta888 No.1

回答回数8ベストアンサー獲得回数2

ポイント200pt

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

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

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


  • データの1行目が列名
  • データの1列目がid
  • データにはCells(行(1 to count),列(1 to count))でアクセス可能
  • データの含まれている行列数を取得可能
  • データは連続している(間に空行がないということ)
  • データにはSQLインジェクションを引き起こすデータが含まれていない(SQLにおける特殊文字が含まれていないということ)
  • すべて文字列型である。(勝手に型変換してくれるかも?)


という条件で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が手元にないので動かなかったらごめんなさい。

id:akaired

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

2009/03/06 21:14:44
  • id:b-wind
    特にこれといった方法は無いと思う。
    > 列の数が100も200もある場合
    どちらかというとこの状況自体が設計ミスではないかと思うが。

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

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

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

回答リクエストを送信したユーザーはいません