• 締切済み

Access2000にエクセルデータを取り込み

お世話になります。 Access2000のVBAを使用して エクセルにデータを取り込みたいと 思っています。 現在は、下記の(1)のソースで、エクセルのデータを Access2000に取り込んでいます。 しかしながら、「取り込み開始」の箇所を >あと、アクセスのインサートはSQL一発のほうが早いと思う。 >http://www.1keydata.com/jp/sql/sql-insert-into.php というアドバイスを頂きました。 しかしながら、私の知識がまったくなく、どのように コーディングしていいのかわからない状態です。 そこで、お手数でもうしわけございませんが、 下記の(1)のソースをSQLで使用した場合のコードを 教えて頂けないでしょうか? 私が馬鹿のため、ソースコードで頂きたいので、 ソースコードがわからないかたは、回答頂かなくて 結構ですのでよろしくおねがいいたします。 ------------ソース(1)---------------- Set oApp = CreateObject("Excel.Application") oApp.Workbooks.Open FileName:=CurrentProject.Path & "\メイン.xlsm" ---------------取り込み開始------------- rs2.Open "選手", CurrentProject.Connection, adOpenForwardOnly, adLockOptimistic iRow = 2 sheet = "program" rs.Open "選手情報_選手ID", CurrentProject.Connection, adOpenForwardOnly, adLockOptimistic iRow = 2 ' ★ sheet = "program" While (oApp.Sheets(sheet).cells(iRow, 1) <> "") rs.Filter = "日=" & oApp.Sheets(sheet).cells(iRow, 2) rs.Filter = rs.Filter & " and 場=" & oApp.Sheets(sheet).cells(iRow, 1) rs.Filter = rs.Filter & " and 番号=" & oApp.Sheets(sheet).cells(iRow, 3) If (rs.EOF) Then rs.AddNew rs("日") = oApp.Sheets(sheet).cells(iRow, 2) rs("場") = oApp.Sheets(sheet).cells(iRow, 1) rs("番号") = oApp.Sheets(sheet).cells(iRow, 3) End If rs("1番") = oApp.Sheets(sheet).cells(iRow, 5) rs("2番") = oApp.Sheets(sheet).cells(iRow, 5 + 26) rs("3番") = oApp.Sheets(sheet).cells(iRow, 5 + 26 + 26) rs("4番") = oApp.Sheets(sheet).cells(iRow, 5 + 26 + 26 + 26) rs("5番") = oApp.Sheets(sheet).cells(iRow, 5 + 26 + 26 + 26 + 26) rs("6番") = oApp.Sheets(sheet).cells(iRow, 5 + 26 + 26 + 26 + 26 + 26) rs.Update iRow = iRow + 1 Wend rs.Close ---------------取り込み終了------------- ---------------取り込み開始------------- rs.Open "選手情報_選手名", CurrentProject.Connection, adOpenForwardOnly, adLockOptimistic iRow = 2 ' ★ sheet = "program" While (oApp.Sheets(sheet).cells(iRow, 1) <> "") rs.Filter = "日=" & oApp.Sheets(sheet).cells(iRow, 2) rs.Filter = rs.Filter & " and 場=" & oApp.Sheets(sheet).cells(iRow, 1) rs.Filter = rs.Filter & " and 番号=" & oApp.Sheets(sheet).cells(iRow, 3) If (rs.EOF) Then rs.AddNew rs("日") = oApp.Sheets(sheet).cells(iRow, 2) rs("場") = oApp.Sheets(sheet).cells(iRow, 1) rs("番号") = oApp.Sheets(sheet).cells(iRow, 3) End If rs("1番") = oApp.Sheets(sheet).cells(iRow, 1 + 5) rs("2番") = oApp.Sheets(sheet).cells(iRow, 1 + 5 + 26) rs("3番") = oApp.Sheets(sheet).cells(iRow, 1 + 5 + 26 + 26) rs("4番") = oApp.Sheets(sheet).cells(iRow, 1 + 5 + 26 + 26 + 26) rs("5番") = oApp.Sheets(sheet).cells(iRow, 1 + 5 + 26 + 26 + 26 + 26) rs("6番") = oApp.Sheets(sheet).cells(iRow, 1 + 5 + 26 + 26 + 26 + 26 + 26) rs.Update iRow = iRow + 1 Wend rs.Close ---------------取り込み終了-------------

みんなの回答

  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.1

質問の趣旨を確認させてください ・動いているけど遅いので速くしたい ・ただ単にSQL一発の方法に興味がある どちらになるのでしょう。 提示された VBA を見る限り、INSERT 一発では終わりませんね 存在したら UPDATE / 存在していなかったら INSERT 単に考えると、この切り分けは必要ですね。 過去の以下質問で回答していたと思います Access2000のVBAで上書き更新 http://okwave.jp/qa/q8139092.html 回答の1つ目に記述していたと思いますが、動かなかったという事になりますか。 (INSERT ではなく UPDATE でのものになっていますが) WHERE 部分を削除すれば、UPDATE / INSERT 区別なく処理していると思うのですが・・・ なので、今回の回答では、上記質問での回答を試してみてください。という事になります。 ただ、あの時の回答のまま動くのか?は、わかりません 今回の質問では、Excel ファイルの拡張子は xlsm になっているので。 (他の質問でも 拡張子は xlsm ですね) どの様な環境で動かそうとしていますか Excel は、2007 以降がインストールされていて、Access は 2000 だけとか? Access も 2007 以降が一緒にインストールされている?・・・とか 混在した環境は持ち合わせていないので、これについて補足いただいても回答できません。 (補足あれば、他の方が回答する際に役立つと思います) 以下は余談です:記述を見ていて気になった箇所2つ) > rs.Filter = "日=" & oApp.Sheets(sheet).cells(iRow, 2) > rs.Filter = rs.Filter & " and 場=" & oApp.Sheets(sheet).cells(iRow, 1) > rs.Filter = rs.Filter & " and 番号=" & oApp.Sheets(sheet).cells(iRow, 3) ここは以下の様に rs.Filter = として設定する回数を1回に rs.Filter = "日=" & oApp.Sheets(sheet).cells(iRow, 2) _      & " and 場=" & oApp.Sheets(sheet).cells(iRow, 1) _      & " and 番号=" & oApp.Sheets(sheet).cells(iRow, 3) rs.Filter = で設定されると、その都度 絞込み処理が動いたと思います つまり、現状では3回絞込み処理が・・・・→ 1回にする事で速くはなると思います。   Cells(4, 6) = "ABCD"   Cells(4, 6 + 26) = "abcd"   Cells(4, 6 + 26 + 26) = "1234" 雰囲気、上記の様な記述が見受けられますが、数値にこだわる必要はないと思います。 例えば、   Cells(4, "F") = "ABCD"   Cells(4, "AF") = "abcd"   Cells(4, "BF") = "1234" でも動いたと思います。 同じ動きをするのなら、後々わかりやすい方を選ばれたらと・・・

関連するQ&A

  • Access2000のVBAコードの最適化

    お世話になります。 Access2000のVBAでコードを作成したのですが、 処理をもっと早く出来る方法ありましたら教えて頂ければと 思います。 処理している内容としては、 (1)データ元のエクセルファイルを開く (2)エクセルファイルに記載されているセルの内容をAccessに挿入 ※取り込み開始・終了が200回程繰り返す ※While (oApp.Sheets(sheet).cells(iRow, 1) <> "")のループは500回程繰り返す 少しでも処理を速くする方法があれば教えて頂きたいので 宜しくお願い致します。 ------------ソース---------------- Set oApp = CreateObject("Excel.Application") oApp.Workbooks.Open FileName:=CurrentProject.Path & "\メイン.xlsm" ---------------取り込み開始------------- rs2.Open "選手", CurrentProject.Connection, adOpenForwardOnly, adLockOptimistic iRow = 2 sheet = "program" rs.Open "選手情報_選手ID", CurrentProject.Connection, adOpenForwardOnly, adLockOptimistic iRow = 2 ' ★ sheet = "program" While (oApp.Sheets(sheet).cells(iRow, 1) <> "") rs.Filter = "日=" & oApp.Sheets(sheet).cells(iRow, 2) rs.Filter = rs.Filter & " and 場=" & oApp.Sheets(sheet).cells(iRow, 1) rs.Filter = rs.Filter & " and 番号=" & oApp.Sheets(sheet).cells(iRow, 3) If (rs.EOF) Then rs.AddNew rs("日") = oApp.Sheets(sheet).cells(iRow, 2) rs("場") = oApp.Sheets(sheet).cells(iRow, 1) rs("番号") = oApp.Sheets(sheet).cells(iRow, 3) End If rs("1番") = oApp.Sheets(sheet).cells(iRow, 5) rs("2番") = oApp.Sheets(sheet).cells(iRow, 5 + 26) rs("3番") = oApp.Sheets(sheet).cells(iRow, 5 + 26 + 26) rs("4番") = oApp.Sheets(sheet).cells(iRow, 5 + 26 + 26 + 26) rs("5番") = oApp.Sheets(sheet).cells(iRow, 5 + 26 + 26 + 26 + 26) rs("6番") = oApp.Sheets(sheet).cells(iRow, 5 + 26 + 26 + 26 + 26 + 26) rs.Update iRow = iRow + 1 Wend rs.Close ---------------取り込み終了------------- ---------------取り込み開始------------- rs.Open "選手情報_選手名", CurrentProject.Connection, adOpenForwardOnly, adLockOptimistic iRow = 2 ' ★ sheet = "program" While (oApp.Sheets(sheet).cells(iRow, 1) <> "") rs.Filter = "日=" & oApp.Sheets(sheet).cells(iRow, 2) rs.Filter = rs.Filter & " and 場=" & oApp.Sheets(sheet).cells(iRow, 1) rs.Filter = rs.Filter & " and 番号=" & oApp.Sheets(sheet).cells(iRow, 3) If (rs.EOF) Then rs.AddNew rs("日") = oApp.Sheets(sheet).cells(iRow, 2) rs("場") = oApp.Sheets(sheet).cells(iRow, 1) rs("番号") = oApp.Sheets(sheet).cells(iRow, 3) End If rs("1番") = oApp.Sheets(sheet).cells(iRow, 1 + 5) rs("2番") = oApp.Sheets(sheet).cells(iRow, 1 + 5 + 26) rs("3番") = oApp.Sheets(sheet).cells(iRow, 1 + 5 + 26 + 26) rs("4番") = oApp.Sheets(sheet).cells(iRow, 1 + 5 + 26 + 26 + 26) rs("5番") = oApp.Sheets(sheet).cells(iRow, 1 + 5 + 26 + 26 + 26 + 26) rs("6番") = oApp.Sheets(sheet).cells(iRow, 1 + 5 + 26 + 26 + 26 + 26 + 26) rs.Update iRow = iRow + 1 Wend rs.Close ---------------取り込み終了-------------

  • Access2000のVBAで上書き更新

    お世話になります。 Access2000のVBAで作成しております。 Excelに記載した情報をAccessのテーブルに 取り込むために下記のソースを作成致しました。 既にテーブルに主キーが重複しないものを取り込むときは 正常に処理が走るのですが、 主キーが重複する場合は、重複する旨メッセージを出して 処理が止まります。 どのようにソースを修正すれば、「主キーが重複する場合、上書き更新」 するように処理が走るのでしょうか? 以上宜しくお願い致します。 --------------ソース------------------------------ Dim rs As New ADODB.Recordset Dim oApp As Object Dim iRow As Long Set oApp = CreateObject("Excel.Application") oApp.Workbooks.Open Filename:="hogehoge.xls" rs.Open "テーブル", CurrentProject.Connection, adOpenForwardOnly, adLockOptimistic iRow = 2 ' ★ While( ループ )   rs.AddNew   rs("ID") = oApp.Cells(iRow, 1)   rs("名前") = oApp.Cells(iRow, 2)   rs.Update   iRow = iRow + 1 Wend rs.Close oApp.Quit Set oApp = Nothing

  • Accessのテーブル取り込み付いて

    お世話になります。 Access2000のVBAで、テーブルの取り込み処理に ついて教えて下さい。 下記のようなソースで、ACCESSのテーブルを取り込み →エクセルに書き出しをしているのですが、 (1)の箇所で取り込み処理の時間が大量にかかっていることが わかりました。 処理速度が速くなるような、別のコーディングがあるのでしたら 教えて頂きたいので宜しくお願いします。 ----------ソース-------------------------- --------(1)--------------- With CurrentDb.QueryDefs(テーブル) .Parameters("[ID]") = "1111" Set rs = .OpenRecordset End With --------(1)--------------- If (Not rs.EOF) Then oApp.Sheets(1).cells(count, i + 1) = rs(i).Name oApp.Sheets(1).cells(count + 1, 1).CopyFromRecordset rs End If rs.Close Set rs = Nothing db.Close -----------------------------------------

  • ACCESS SQLで複数データ表示させるには?

    *************************************************** Private Sub Form_Load() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Set cn = CurrentProject.Connection mySQL = "select * from テーブル" rs.Open mySQL, cn, adOpenForwardOnly, adLockOptimistic ’コントロールに代入 Me.No = rs![No] Me.項目 = rs![項目] ・・・ End Sub *************************************************** こんな感じで、クエリでなくSQLで フォームにテーブルの全レコードを表示させたい場合、 どのようにすればよいのでしょうか? 上の文には、何が不足しているのでしょうか? http://www.accessclub.jp/ado/09.html を見ましたが、解決できませんでした。

  • アクセスADO 複数のレコードがあるのに-1が返る

    アクセスのADOを作っています。 テーブルにレコードは複数あるのですが、Filterをすると必ず-1が返ります。 どうしてでしょうか? エラーになってるのでしょうか? ---------------------------------------------------- Set cn = CurrentProject.Connection myStr = "test" rs.Open "Tテーブル", cn, adOpenForwardOnly, adLockReadOnly rs.Filter = ("フィールド1=" & "'" & myStr & "'") MsgBox rs.RecordCount ’マイナス-1になる rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing ---------------------------------------------------- rs.Open の下に、MsgBox rs.RecordCountを置いても、-1になることから、Filter のせいではないと思うのですが 原因がわかりません。 ご教授よろしくお願いします。

  • Access クエリ抽出結果をExcel(特定フォーム)に出力させたい

    いつもいつもお世話になっております(><) 今までこちらで色々質問しながら、 「条件入力フォームで入力した条件で、レコードを条件抽出し、この抽出結果をフォームに出力、かつ、伝票発行する」 というシステムを作っています。 今、伝票発行の部分で、下記のようなプロシージャを組みました。 そして、下記★(コード内参照)の2点で詰まっています。 ★1 指定しているクエリは抽出結果のフォームなのですが、これが「SQLステートメントが正しくありません」となります。どうしてでしょうか。ちなみに実在する別のクエリ名にすると、一応動きます。 ★2 フォーム上に抽出されたレコードがEOFになるまで、というループ条件にしたいのですが、この部分の記述は正しいでしょうか。 いつも初心者的質問で恐縮です。 どうぞよろしくお願い致します。 --------------------------------------------- Option Compare Database Private Sub 伝票発行_Click() Dim db As ADODB.Connection Dim rs As ADODB.Recordset Dim app As Object Dim wb As Excel.Workbook Dim iRow As Long Dim iColm As Long '■初期化 iRow = 12 iColm = 1 '■確認 If MsgBox("伝票を出力します。", vbOKCancel) = vbOK Then '■DBコネクション Set db = CurrentProject.Connection '■レコードセットの取得 Set rs = New ADODB.Recordset rs.Open "受注集計クエリ_f", db, adOpenStatic, adLockReadOnly '★1 '■Excelアプリの起動及びファイルオープン Set app = CreateObject("Excel.Application") app.Workbooks.Open filename:=CurrentProject.Path & "\nouhinsyo.xls" '■Excelシート名指定 app.Worksheets(1).Select Do Until rs.EOF '★2 ws.Cells(iRow, iColm + 2) = rs("品番") ws.Cells(iRow, iColm + 3) = rs("商品名") ws.Cells(iRow, iColm + 4) = rs("受注数の合計") ws.Cells(iRow, iColm + 8) = rs("備考") rs.MoveNext iRow = iRow + 1 Loop MsgBox "発行完了。" End If rs.Close app.Quit 'エクセルセッションをクローズする。 Set ws = Nothing '変数の初期化 Set wb = Nothing '変数の初期化 Set app = Nothing '変数の初期化 Set db = Nothing End Sub

  • Access VBAでExcel連携時のエラー(ワークシート指定時)

    いつもお世話になっております。 現在、ExcelファイルのデータをAccessに取り込むVBでエラーが起こります。 (問題のおこる部分のみ、ソースを下記に記します。) ★の部分で、「実行時エラー1004 'Worksheets'メソッドは失敗しました:'_Global'オブジェクト」 というエラーが、出ます。 しかも、毎回ではなく、出たりでなかったりします。 これはなぜでしょうか? 定義の指定やappの指定に問題があるのでしょうか。 おわかりになる方がいらっしゃいましたら、ご指導願います。 宜しくお願いします。 --------------------------------------------------- Private Sub 取込み_Click() '■変数 Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Dim app As Object Dim iRow As Long Dim iUsed As Long Dim iCnt As Long (中略) '■接続 Set cn = CurrentProject.Connection '■Excelアプリの起動及びファイルオープン Set app = CreateObject("Excel.Application") app.Workbooks.Open filename:=CurrentProject.Path & "\h.xls" '■レコードセットの取得 Set rs = New ADODB.Recordset rs.Open "マスタ", cn, adOpenForwardOnly, adLockOptimistic '■DBへのレコード追加 'h.xlsの取り込みスタート行設定 iRow = 13 ''h.xlsの最終使用行 取得および設定 iUsed = Worksheets(1).UsedRange.Rows.Count'★ 'MsgBox "使用行は" & iUsed & "です。" (以下略)。。。。

  • 【VB6】EXCELのシート名を変更したい

    お世話になっております。 VB6(visual basic 6)プログラムからEXCELのシート名を指定したいです。 EXCEL:EXCEL 2000 OS: win XP 以下の記述ではシート名がデフォルトのままです。 (sheet1のままで変更できていない) Dim fs As Object Dim oApp As Object Set oApp = CreateObject("Excel.Application")'EXCEL起動 oApp.Visible = True oApp.UserControl = True oApp.Workbooks.Add '新規のワークシートsheet1を追加する oApp.Cells(1, 1) = "シート名を指定したい!" 'セル入力はできた oApp.Sheets("sheet").select oApp.Sheets("sheet").Name = "新シート名" ご覧のように (1)自動EXCEL起動して (2)セル1,1に文字入力して (3)シート名を指定 しようとしております。 セル(1,1)に「シート名を指定したい!」は入力されております。 ブック名(ファイル名)はデフォルトのBook1.xlsです。 シート名の指定方法が間違っているからうまくいかないと思っております。 どうぞよろしくお願いいたします。

  • ACCESS2000 VBA フォームのコントロールに値を転記

    <やりたいこと> 保存されているレコードのフィールド値を修正するために、修正用非連結フォームを開くとき、当該レコードの値を転記したい。 <できないこと> コンボボックスに値が転記できない。 (テキストボックスには値が転記できる。) Private Sub Form_Load() Dim Sql As String Sql = "SELECT* FROM T_履歴 WHERE NO.=" & Key & ";"  'KeyはPublic変数、別のフォームモジュール内で値が格納されている。  'Keyによって、レコードはひとつに絞られている。 Dim DB As ADODB.Connection Set DB = CurrentProject.Connection Dim RS As New ADODB.Recordset RS.Open Sql, DB, adOpenForwardOnly, adLockOptimistic, adCmdText Me!氏名combo = RS!氏名 ↑この式で思うような結果が得られない。  .Text .Value のプロパティを付加しても結果は同じ。  ACCESS97ではこのように コンボボックス名="値" で、  値が代入され、コンボのソースの中からその値が選ばれた状態になったのに…。  

  • WHERE レコードが抽出されない

    ADOでSQL文を作ってるのですが WHERE句がうまくできません。 rs.Open "T_テーブル", cn, adOpenKeyset, adLockOptimistic rs.Filter = "URL like '#*'" なら、うまくいくのですが、 Filterを使うのをやめて、WHEREに書きかえると、エラーにはならないのですが 取得レコードが0件になります。 rs.Open "T_テーブル WHERE [URL] like '#*';", cn, adOpenKeyset, adLockOptimistic も rs.Open "T_テーブル WHERE URL like '#*';", cn, adOpenKeyset, adLockOptimistic も、0件が返ります。 何がおかしいのでしょうか? URLフィールドで、#で始まるレコードを抽出したいです。

専門家に質問してみよう