プロが教えるわが家の防犯対策術!

表記のとおりADOを使用してExcelデータをAccess取込むのですが、Sheet1のデータを読込んだ後、引続きSheet2のデータを読込む様にVBAコードを書いたつもりですが、Sheet1をアクティブにした状態でExcelデータを保存していたらSheet1のデータを重複して取込み、Sheet2をアクティブにした状態でExcelデータを保存していたらSheet2のデータを重複して取込んでしまいます。どこをどうすればSheet1のデータを読込んだ後、引続きSheet2のデータを読込む様に出来るのでしょうか?

====== VBAコードの抜粋 =========
  Dim xlApp As Object       ' Excelのアプリケーション定義
  Dim xlBook As Object      ' ExcelのワークブックのフォルダPath+ファイル名を定義
  Dim xlSheet As Object      ' Excelの参照するシート名を定義
  Dim SheetName As String     ' シート名を代入
  Dim SheetCount As Byte     ' シートの選択

For SheetCount = 1 To 2       ' 1回目のループでSheet1から2回目のループでSheet2からデータを取り込む
If SheetCount = 1 Then SheetName = "Sheet1"
If SheetCount = 2 Then SheetName = "Sheet2"

Set xlApp = CreateObject("Excel.Application")
Set xlBook = xlApp.Workbooks.Open("ファイルPath+ファイル名")
Set xlSheet = xlBook.Worksheets(SheetName)
Set Wcell = xlSheet.Range("A1")
Set Cn = CurrentProject.Connection
Rs.Open "取込みテーブル", Cn, adOpenKeyset, adLockOptimistic
xlApp.Application.Visible = True

  データを取込むコードあり(省略)

xlBook.Close
xlApp.Visible = False
Set xlSheet = Nothing
Set xlBook = Nothing
Set xlApp = Nothing
Next SheetCount

A 回答 (2件)

>ADOを使用してExcelデータをAccess取込む際のExcelシートの選択について



ソースを拝見しましたが、「取り込み」の部分はADOは使ってませんね。
(取り込んだデータを、テーブルに保存する所がADOです。)

「ADOで取り込む」が目的なら、No1さんの回答になると思います。

-----------------------------------------------------------
このままの方針で、話を進める場合・・・

質問のソースは、問題ありません。(動作確認しました)
省略した、「データを取込むコード」に問題があると思います。

この部分を、補足して下さい。

推測ですが、xlBook.ActiveSheet を使ってないですか?
ちゃんと、Wcell を使ってデータを参照してますか?

-----------------------------------------------------------
また、間違いではないですが、高速化の為に
修正した方が良いと思われる点があります。
下記のソースのコメントをご覧下さい。

以下、私が動作確認したソース(抜粋)


 'ブックを開く部分は共通なのでループの外へ
 Set xlApp = CreateObject("Excel.Application")
 Set xlBook = xlApp.Workbooks.Open("c:\temp\001.xls")

 For SheetCount = 1 To 2       ' 1回目のループでSheet1から2回目のループでSheet2からデータを取り込む
  If SheetCount = 1 Then SheetName = "Sheet1"
  If SheetCount = 2 Then SheetName = "Sheet2"
 
  Set xlSheet = xlBook.Worksheets(SheetName)
  Set Wcell = xlSheet.Range("A1")
  
  '確認のため、A1 の内容を表示してみる
  MsgBox Wcell.cells(1,1)
 
 Next SheetCount

 'ブックを閉じる処理もループの外へ
 xlBook.Close
    • good
    • 0
この回答へのお礼

お答えありがとうございます。
その後自身でもいろいろ調べて、あるWebページでシートをセレクトすり必要があることがわかりました。

http://www.accessclub.jp/bbs/0079/beginers29334. …

そこで
ループの際のシート選択のコードを次のように変更しうまくいきました。

If SheetCount = 1 Then xlApp.Sheets("Sheet1").Select ' 取込み先シートの選択 SheetCountが1の場合
If SheetCount = 2 Then xlApp.Sheets("Sheet2").Select ' 取込み先シートの選択 SheetCountが2の場合

> また、間違いではないですが、高速化の為に
修正した方が良いと思われる点があります。

アドバイスありがとうございます。
そうですよね、ExcelやBookを開けたり閉めたり無駄があります。修正します。

お礼日時:2008/01/07 11:33

エクセルのデータ部分に名前をつけてその名前でレコードセットを取得してみてはいかがですか



Dim cnExl as new ADODB.Connection
Dim rsExl as new ADODB.Recordset
dim n as integer
' Excelのバージョンにあわせて『Excel 8.0』を適宜修正してください
cnExl.ConnectionString = "Provider=Microsoft.jet.oledb.4.0;" & _
  "DataSource=" & ファイルパス & ";" & _
  "Extended Properties=Excel 8.0;"
cnExl.Open
for n=1 to 2
  ' ExcelでTable1,Table2と名前をつけたデータを取得
  rsExl.Open "Table"& n, cnExl, adOPenKeyset, adLockOptimistc
  rsExl.MoveFirst
  do until rsExl.Eof
    ' ここでレコードのインサートコマンドを実行
    rs!ID = rsExl!ID
    rsExl.MoveNext
  Loop
  rsExl.Close
next
cnExl.Close
といった具合で ・・・
    • good
    • 0
この回答へのお礼

すみません。質問の仕方がまずかったようです。
Access側のテーブル書込みのみADOを使用してます。
Excelの取り込み側をADOでやるとこういうコードになるのですね。
勉強になります。

お礼日時:2008/01/06 22:21

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!