
表記のとおり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
No.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
お答えありがとうございます。
その後自身でもいろいろ調べて、ある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を開けたり閉めたり無駄があります。修正します。
No.1
- 回答日時:
エクセルのデータ部分に名前をつけてその名前でレコードセットを取得してみてはいかがですか
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
といった具合で ・・・
すみません。質問の仕方がまずかったようです。
Access側のテーブル書込みのみADOを使用してます。
Excelの取り込み側をADOでやるとこういうコードになるのですね。
勉強になります。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
教えて下さい
-
「0x00ff0000」?
-
EXCELVBAでSQLserverからデータ...
-
不規則なデータのfft処理
-
Fortran カンマを含む数値デー...
-
C言語で2桁Hex文字列を10進...
-
配列でデータが入っている要素...
-
【エクセル】測定時間がバラバ...
-
C言語を用いて、GNUPLOTでリア...
-
VBA 空白セルを削除ではない方...
-
<VB>String→Object
-
プログラミング python pandas ...
-
Visual Basic によるNC機械制御
-
S9タイプからXタイプにデータ...
-
ハミング窓関数とFFT(高速フー...
-
C# でDataTableの更新を高速化...
-
特定のデータの抽出方法を教え...
-
GridViewの行の一部を複数行にする
-
この行は既に別のテーブルに属...
-
メモ帳(テキストデータ)をExc...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
教えて下さい
-
【エクセル】測定時間がバラバ...
-
メモ帳(テキストデータ)をExc...
-
この行は既に別のテーブルに属...
-
多量のSUMIF式を軽くしたい
-
配列でデータが入っている要素...
-
EXCELVBAでSQLserverからデータ...
-
エクセルで2つの時系列のデー...
-
ACCESS VBA インデックスが有効...
-
二分探索の平均探索回数
-
Accessで該当データにフラグを...
-
ビットシフトについて
-
Rails4 Redirect_Toで送信
-
CString型の文字列連結について
-
[C言語] コメント文字列を無視...
-
ブレーカー落ちで壊れたりしな...
-
ActiveReportについて
-
バーコードリーダーの読込デー...
-
C# でDataTableの更新を高速化...
-
プログラミング python pandas ...
おすすめ情報