[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『EXCELからACCESSテーブル追加、更新、削除』(MARU)
A列 B列 C列 D列 E列 F列 G列 H列 I列 J列・・・DV列 001 TEST1 Parts1 1 2 3 4 5 6 7 001 TEST1 Parts1 8 9 10 11 12 13 14 001 TEST1 Parts1 15 16 17 18 19 20 21 002 TEST2 Parts2 1 2 3 4 5 6 7 002 TEST2 Parts2 8 9 10 11 12 13 14 003 TEST3 Parts3 1 2 3 4 5 6 7
以上のようなExcelデータがあります。 EXCELと同じ内容のACCESSテーブル(フィールド名、フィールド数同じ) を更新したい。 C列の条件(Parts1)があえば、ACCESSのParts1の データを置き換えたい。(削除して追加) 同じPartsナンバーが存在しなければ、追加する。 (C列の最終行まで存在チェック)
宜しくお願いします。
< 使用 Excel:Excel2010、使用 OS:Windows7 >
とりあえず、「Excel VBA ADO」等をキーに検索して頂ければ、必要な命令は判るはず。
あと、条件が合えばレコード削除してから追加する、と書いてますが、普通は更新するかと。
(???) 2014/08/13(水) 08:48
スペック管理.mdb T_スペック
主キーの設定は行っておりません。 >(ご提示の例の場合、Access側は3レコードということ?) 同じ3レコードではなく、異なります。 C列(品番)のスペック情報がD〜DV列にセットされています。
あああああ
(MARU) 2014/08/13(水) 21:08
Accessではなく、Excel内で処理するほうが よさそうなので、もう少し考え直します。 ありがとうございました。
(MARU) 2014/08/14(木) 09:35
Sub test() Dim CN As Object Dim RS As Object Dim strSQL As String Dim cMDB As String Dim i As Long Dim j As Long Dim jMax As Long
jMax = Cells(1, Columns.Count).End(xlToLeft).Column
cMDB = "C:\tmp\スペック管理.mdb" Set CN = CreateObject("ADODB.Connection") CN.Open "provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & cMDB & ";" Set RS = CreateObject("ADODB.Recordset")
For i = 2 To Cells(Rows.Count, "C").End(xlUp).Row strSQL = "SELECT * FROM T_スペック WHERE C列='" & Cells(i, "C").Text & "';" Set RS = CN.Execute(strSQL)
If RS.EOF = True Then strSQL = "INSERT INTO T_スペック VALUES( """ & Cells(i, "A").Text & """" For j = 2 To jMax strSQL = strSQL & ", """ & Cells(i, j).Text & """" Next j strSQL = strSQL & ");" Set RS = CN.Execute(strSQL) Else RS.Close RS.Open strSQL, CN, 1, 3 For j = 1 To jMax RS.Fields(j - 1).Value = Cells(i, j).Text Next j RS.Update RS.Close End If Next i
Set RS = Nothing CN.Close Set CN = Nothing End Sub (???) 2014/08/14(木) 11:09
ありがとうございました。 office2003で作成したAccessです。 確認しましたが、下記エラーとなりました。 Set RS = CN.Execute(strSQL) 実行時エラー2147217913 抽出条件でデータ型が一致しません 今回のExcelにシート(db)追加し、そのシートに Accessテーブルのデータをコピーして、Excel内で完結したほうが 処理がスムーズに進められるかと思ったり・・・。
Excelで、wk(シート)とdb(シート)のC列を比べ、 等しければdbのデータ(行)を削除して、wkのデータをdbへ行追加する 等しくなければ、wkのデータをdbへ行追加(削除処理は無し) 下記に行追加の処理を加える為には、どのように記述すればよいでしょうか? 最初の質問から、変更になり申し訳ありません。 宜しくお願いします。
Dim ws1 As Worksheet Dim ws2 As Worksheet Dim lastRow1 As Long Dim r As Long
Set ws1 = Sheets("db") Set ws2 = Sheets("wk") lastRow1 = ws1.Range("C" & Rows.Count).End(xlUp).Row For r = lastRow1 To 2 Step -1 If WorksheetFunction.CountIf(ws2.Columns("C"), ws1.Range("C" & r)) > 0 Then ws1.Rows(r).Delete End If Next
(MARU) 2014/08/14(木) 23:39
作業列を作って =COUNTIF(wk!C:C,C1) こんな式を入れて 0以外の行を削除。 後ろに wkシートのデータを貼り付け。
って作りにしてみてはどうですか? (HANA) 2014/08/18(月) 11:00
DBは一切使わない変更案ですが、既存を削除ではなく、全部削除してから、有効なものを追記してはいかが?
(1)結果シートの過去データを、タイトル行を除いてすべて削除。
(2)元シートを下から処理。同じ項目が無い場合のみ、1行コピペ。
(3)全データ処理後、必要であれば並べ替え。
(???) 2014/08/18(月) 13:54
>作業列を作って〜〜 って書きましたが、書いておられるコードで 新しいデータと重複するデータは削除されるので すべて終わった後に、新しいデータをコピペすれば良さそうですが。
既存のコードに 「後ろに wkシートのデータを貼り付け。」 を追加。 (HANA) 2014/08/18(月) 14:47
アドバイスをいただき、その通り行ってみました。 EXCELでは、うまくいきました。ありがとうございます。 ACCESSは利用しない運用で考えておりましたが、 技術習得の為に、教えていただけませんでしょうか? >具体的には、VALUESを指定する際に、すべて前後にダブルクォートを付けています。 >もし、数値型や日付型が混在しているならば、そこはダブルクォートを付けない工夫が必要です。 修正は複雑でしょうか? (MARU) 2014/08/18(月) 16:02
たとえば、特定の列が少しだけ文字列以外ならば、j のループ中にIf文でダブルクォートを付けないようにする。
多数の列で、様々な型が入り乱れている場合、フィールド名に規則性、例えば、数値型はiで始まる等、
一定の法則があれば、これを判定してダブルクォートを付ければ良いでしょう。
(???) 2014/08/18(月) 16:27
数値型は、5つ 日付型は、2つです。 他は、すべてテキスト型です。 一度試してみます。 この度は、ありがとうございました。 (MARU) 2014/08/18(月) 21:46
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.