人に聞けない痔の悩み、これでスッキリ >>

EXCEL2003 VBAで2つのDBに接続してSQLを実行し、異なるDBのTBLを結合する。

こんな方法あるのかどうかわかりませんが、
VBAでDBに接続する際に同時?に2つのDBに接続し1つのSQLで違うDB同士を任意のキーで結合はできるのでしょうか?
どなたかわかる方お願いします。

今考えているのは最初に1つのDBに接続し、データを取得後、再度違うDBに接続し取得したデータを先ほどのデータとVBA内で結合しようと考えています。

ほかにいい方法があればアドバイスおねがいします。

※今まではACCESSを介してこの処理を行っていましたが引継ぎの関係でEXCELのみでこの処理を
 実行しなければなりません。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

DBが違うものを一つのクエリで処理することは


できません。Accessではリンクテーブルとして、
処理できますが、これを使わないとなると、まず
無理でしょう。

どちらかのDBをエクスポート→インポートする方が
現実的な解決のように思います。

VBAで1件ずつ処理するのはデータ量が僅少ならば
考える余地はありますが、バグ取りの手間、処理に
かかる時間を考えると、やる気がしません。
    • good
    • 0

>2つのDB


質問には大げさにDBと書くのでなく、そのファイルなどのファイル形式を書かないと。
例えばテキストファイルなどなら、相当やさしくなる。
エクセルでSQLを使うといっても、操作では、MSクエリ(データー外部データの取り込みー新しいデータベースクエリ)があるぐらいと思う。
>引継ぎの関係でEXCELのみでこの・・
相手はエクセル以外は知らないということか。そういうレベルの人には、質問が実現しても、余計難しくなると思うが。相手はVBAは経験あるのか。
エクセルからアクセスを起動して(VBAで)・・のようなのは考慮外か。
エクセルからADOを使って処理するなどはどうか。
こんなところに質問を出す前にGoogleででも「ado エクセル SQL」「ado エクセル 」などの記事を読んだのですか。「エクセル SQL」でも参考になる記事があるようだ。
ーー
>VBA内で結合しようと考えています。
これはキーによる「マッチングのアルゴリズム」を使えば出来る。
Googleで「キーマッチング」ででも沢山記事があった
http://homepage2.nifty.com/sak/w_sak3/doc/sysbrd …
    • good
    • 0

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QExcelVBAからADOで複数のDBへの接続

いつもお世話になっています。

ExcelVBAの初心者ですが、Oracle、Access、ExcelデータへADO接続してデータを表示するものをExcelかACCESSで作ろうとしています。

それぞれのデータは社内ネットワークのバラバラ位置にあるのですが、
ADOとは下記のイメージでいいでしょうか?

1.インポートする手間がない。
2.それぞれのDBが更新されたら、その前までのデータで表示される
3.3つのDBを同時に接続しても問題はない・・・

まだイメージが固まっていないのですが、上3つが気になっています。
また自宅でネットワーク環境になくても練習できるものでしょうか?

Aベストアンサー

>>1.インポートする手間がない。

はい

>>2.それぞれのDBが更新されたら、その前までのデータで表示される

基本的に、手元にデータを保存しているなら、直前のデータが表示される。
接続して、DBのデータを表示すれば、その時点での最新が表示される。
と思っておけばいいと思います。

>>3.3つのDBを同時に接続しても問題はない・・・

基本は問題ないですね。ただ、それぞれのDBを接続して更新するなどの処理をすると、やっかいな問題が起こるかもしれません。
でも、参照するだけなら、問題ないと思います。

>>また自宅でネットワーク環境になくても練習できるものでしょうか?

自分のPCにDBサーバを入れてしまえば、練習できると思います。


なお、最近は、「社内システムを各部署が勝手に開発するのは、業務統制上好ましくない(不正・誤りの原因になる)」という理由で、「エクセルでの業務禁止!」という話を目にしたこともあります。まあ、現実実があまりない話だとは思うのですが・・・。
質問者さんの会社では、そんなことはないと思いますけどね。

QVBとアクセスでSQL文に変数を使いたいのですが

したいことはレコードの挿入をSQL文で変数を使用して処理したいのですがうまく動作してくれません

StrSQL_1 = _
"insert into 行先情報テーブル (社員ID, 行先, 帰社予定時刻, 備考)" & _
"values (7,'(変数1)','(変数2)','(変数3)')"

変数の部分が置き換わりません、いろいろ調べてみたのですがどうもわかりませんvaluesでは変数を使えないのでしょうか?

もしそうだとするとどのようにすればレコードを挿入するSQL文で変数を利用できるのかをおしえていただけないでしょうか

Aベストアンサー

文字列なんで、&で連結すればOKです。

StrSQL_1 = _
"insert into 行先情報テーブル (社員ID, 行先, 帰社予定時刻, 備考)" & _
"values (7,'" & 変数1 & "','" & 変数2 & "','" &(変数3)& "')"

Q他のデータベースとのテーブル結合

いつもお世話になっております。
VB.netでwindowsアプリケーションの作成しているところです。
SQLサーバーのテーブルを参照していますが、テーブルの結合は同じデータベース内にないと結合できないのでしょうか?

'SQL接続処理
Dim strConn As String = "Password='';User ID=sa;Initial Catalog=test;Data Source=server1"

と、testというデータベースがありその中に幾つかテーブルがあります。
このtestデータベースにないテーブルが必要になり、aaaデータベース内の
テーブルを結合しようとしたのですが、出来ません。
Catalog=test,aaaとやってみたり、SELECT * FROM tbl1,aaa.tbl2などとしてみましたが、遠いようです。
SQLのクエリを使って、テーブルの追加をすると同じデータベース内のテーブルしか出てこないので、出来ないのかなと思っていますがどうでしょうか?

わかる方がいましたら教えてください。

いつもお世話になっております。
VB.netでwindowsアプリケーションの作成しているところです。
SQLサーバーのテーブルを参照していますが、テーブルの結合は同じデータベース内にないと結合できないのでしょうか?

'SQL接続処理
Dim strConn As String = "Password='';User ID=sa;Initial Catalog=test;Data Source=server1"

と、testというデータベースがありその中に幾つかテーブルがあります。
このtestデータベースにないテーブルが必要になり、aaaデータベース内の
テーブルを結合しよう...続きを読む

Aベストアンサー

select * from tbl1,[aaa].[dbo].[tbl2]
のように、[データベース名].[オーナー].[テーブル名]の様式で指定すれば、良いかと思います。
(当然、権限の問題がない前提ですが・・)

Q複数のデータベースを検索したい

困っている内容ですが、
別々のサーバに構築されたAとBというデータベースがあります。
そのAとBにADOによる接続を行いますが、
AとBのテーブルを結合して情報を取得したいと考えています。
SQL文で言うと、
顧客情報はデータベースAに
顧客詳細はデータベースBに存在するテーブルであり
会員IDはそれぞれのテーブルにある

SELECT * FROM 顧客詳細 INNER JOIN 顧客情報 ON 顧客情報.会員ID = 顧客詳細.会員ID

のようなことがしたいのです。

テーブルを読み込む場合

'' ADO接続オブジェクト
Dim adoCon As ADODB.Connection

'' 新しいADOレコードセットオブジェクトを作成する
Set rs = New ADODB.Recordset
'' 読み取り専用でテーブルを開く
rs.Open SQL, adoCon, adOpenForwardOnly, adLockReadOnly

と書いていまして、adoConの部分が1つのADO接続オブジェクトしか設定できません。
どうにかして2つのデータベースをまたがって
結合できないものでしょうか?

環境は
Win2000 + VB6 + SQLSERVER2000
です。

DB初心者なので、説明がうまくいかないと思いますが、
もしおわかりの方がいましたらよろしくお願いします。

困っている内容ですが、
別々のサーバに構築されたAとBというデータベースがあります。
そのAとBにADOによる接続を行いますが、
AとBのテーブルを結合して情報を取得したいと考えています。
SQL文で言うと、
顧客情報はデータベースAに
顧客詳細はデータベースBに存在するテーブルであり
会員IDはそれぞれのテーブルにある

SELECT * FROM 顧客詳細 INNER JOIN 顧客情報 ON 顧客情報.会員ID = 顧客詳細.会員ID

のようなことがしたいのです。

テーブルを読み込む場合

'' ADO接続オブジェクト
Di...続きを読む

Aベストアンサー

残念ながらこれはSQLだけでは困難かと思います。

ADOでもDAOでも内部では最終的にDBMSを使うためには
SQL文を発行しますが、SQLには異なったデータベース内の
テーブルを同時に連結できる書式は存在しません。

しかし、MS Jetエンジンであればリンクテーブルという
機能で顧客情報だけ外部から連結できるので、MS SQLでもこの機能が使えないのか調べてください。

あとMS SQLで使えるかわかりませんが、CREAT
E TEMPORARY TABLE文で一時的に連結用の顧客情報を用意することもできるかもしれません。

QAccessのテーブルデータを一気にVBAで追加したい・・

Accessのテーブルデータを一気にVBAで追加したい・・

Accessに一時商品登録データというテーブルがあり、
問題なければ商品登録データにデータを流し込みたいと思っています

テーブルのデータ構造は全く同じです

VBAで一時商品登録のテーブルから一件ずつデータを読み取って
商品登録データに追加することは出来るのですが
一気にデータを追加する方法があれば教えていただけないでしょうか?

よろしくお願いいたいます

Aベストアンサー

本当にいろいろな方法があります。

一番簡単なのは、
あらかじめ「追加クエリ」を作成しておき

 Docmd.OpenQuery "追加クエリ名"

あるいは DAO で

 Set dbs = CurrentDB
 dbs.Excute "追加クエリ名"

追加クエリを使用しない場合は
追加クエリの SQL文 に相当するSQL を 実行。

 strSQL="INSERT INTO 商品登録データ SELECT 一時商品登録データ.* FROM 一時商品登録データ"

 Docmd.RunSQL strSQL

あるいは DAO で

 Set dbs = CurrentDB
 dbs.Excute strSQL

とか。

直書き、間違いがあったら御免。

QVBAで複数のCSVからレコードセットを作りたい

D:\DATA\ORDER\SOURCE.CSVに売上のデータがあり、
D:\DATA\STOCK\SOURCE.CSVに在庫のデータがあります。
売上には
注文NO,売上日,売上額,在庫NO
在庫には
在庫NO,仕入日,仕入額
とあるとして
在庫.在庫NO,利益,滞留日数,売上.注文NOというような、2つのCSVを結合した結果をADOでレコードセットに格納したい場合どのようなソースになるのでしょうか?
一つのCSVからレコードセットに結果を格納するやりかたならネットに多々掲載されてますが、複数のCSVについてのやり方の掲載が探せなかったので質問します。

Aベストアンサー

> 既存のものとのからみで、別々の場所にしなければならないのです。

提案します。

現在の CSV の位置を動かせないなら、別途 Tmp フォルダに CSV をコピー
して、そこをワークフォルダとしてみれば?

ファイルのコピー方法は、

 ・FileCopy を使った方法(VBA 標準コマンド)
  http://officetanaka.net/excel/vba/statement/FileCopy.htm
 ・CopyFile を使った方法(FileSystemObject)
  http://officetanaka.net/excel/vba/filesystemobject/filesystemobject.htm#CopyFile

などがあります。作業が終わったら、

 ・Kill ステートメント(VBA 標準コマンド)
  http://officetanaka.net/excel/vba/statement/Kill.htm
 ・DeleteFile メソッド(FileSystemObject)
  http://officetanaka.net/excel/vba/filesystemobject/filesystemobject.htm#DeleteFile

などで削除することもできますよ。

> 既存のものとのからみで、別々の場所にしなければならないのです。

提案します。

現在の CSV の位置を動かせないなら、別途 Tmp フォルダに CSV をコピー
して、そこをワークフォルダとしてみれば?

ファイルのコピー方法は、

 ・FileCopy を使った方法(VBA 標準コマンド)
  http://officetanaka.net/excel/vba/statement/FileCopy.htm
 ・CopyFile を使った方法(FileSystemObject)
  http://officetanaka.net/excel/vba/filesystemobject/filesystemobject.htm#CopyFile

などがあ...続きを読む

Qセルの値を取得してSQL文に組み込みたい

VBAで、ADOを使ってSQLServerに接続しています。
データベースからSQL文でデータを取得してセルに表示させています。
そこで、今はwhere 月 = '4月' …等としているのですが
4月の部分をA1等にして、セルから取得して可変できるようにしたいのです
どういうSQL文を書けば実現できるでしょうか?

Aベストアンサー

例えば
strSQL = "Select * From xxx "
strSQL = strSQL & "where 月 = '" & Range("A1") & "'"

参考にして下さい。

Q(ACCESS)複数mdbからのデータ取得方法

よろしくお願いします。
ACCESSはあまり使ったことがない者です。
下記ようなACCESSのデータ取得の方法を教えてください。

構造の同じテーブルを持つ複数のmdbから、1つのリストを作りたいと考えています。
各mdbの違いは、ファイル名と中身のデータのみで、他は全く同じです(ひとつのテンプレートの複製です)。

A部門.mdb (商品リストテーブル ・・・A部門の商品リスト)
B部門.mdb (商品リストテーブル ・・・B部門の商品リスト)

Z部門.mdb (商品リストテーブル ・・・Z部門の商品リスト)

全商品リスト.csv (全社分の商品リストテーブルのデータ)

mdbが数十ファイルあるので、一つずつcsv取得して繋げるのはたいへんです・・・。
何か一発で取得できるような方法はないでしょうか?
ユニオンクエリ?等を使うとできるのでしょうか・・・。
同じフォルダ下にあるmdbを次々に開いて同じクエリを実行する機能とか、マクロとか?

現状こうなってしまっており、一つのmdbに統合するのは、運用上制約があって無理なのです。

何かうまいアイデアがあれば教えていただきたくお願いします。

よろしくお願いします。
ACCESSはあまり使ったことがない者です。
下記ようなACCESSのデータ取得の方法を教えてください。

構造の同じテーブルを持つ複数のmdbから、1つのリストを作りたいと考えています。
各mdbの違いは、ファイル名と中身のデータのみで、他は全く同じです(ひとつのテンプレートの複製です)。

A部門.mdb (商品リストテーブル ・・・A部門の商品リスト)
B部門.mdb (商品リストテーブル ・・・B部門の商品リスト)

Z部門.mdb (商品リストテーブル ・・・Z部門の商品リスト...続きを読む

Aベストアンサー

VBAによる処理ですが。

データの取り出しで、配列を使ったり、SQL文でレコードを
取り出したりすることもありますが、一応ノーマルにしておきます。

前提として、mdbファイルが一つのフォルダにあるものとします。
新しいmdbファイルを同じフォルダに作り、名前を 「司令塔.mdb」
とします。一応、「商品リストテーブル」の構造は、

商品ID、商品名、価格、サイズ

のようしておきます。違うようでしたら補足してください。
分かりやすいように「司令塔.mdb」にフォームを作り、
それにボタンを設定し、そのクリックイベントに以下を
設定します。ボタンの名前などは適当にしています。
標準モジュールでボタンクリックの中身を実行しても
同じではありますが。


設定が終わったらコード表のツールから参照設定を
選択して、Microsoft DAO xx Object Library に
チェックを入れてOKとしてください。xxは3.6のような
数字です。



Private Sub コマンド1_Click()
  If MsgBox("データをCSVへ移します。よろしいですか", vbYesNo) = vbNo Then Exit Sub
  Dim db As DAO.Database
  Dim rs As DAO.Recordset
  Dim strFile As String

  'mdbファイルの検索用
  strFile = Dir(CurrentProject.Path & "\" & "*.mdb", vbNormal)

  'CSVファイルのオープン、なければ作成
  Open CurrentProject.Path & "\" & "全商品リスト.csv" For Append Access Write As #1

  'CSVファイルへの書き込み作業
  Do While strFile <> ""
    If strFile <> "司令塔.mdb" Then
      Set db = DBEngine.Workspaces(0).OpenDatabase(CurrentProject.Path & "\" & strFile)
      Set rs = db.OpenRecordset("商品リストテーブル")

      'テーブルからデータを取り出しCSVへ
      If rs.RecordCount > 0 Then
        rs.MoveFirst
        Do Until rs.EOF
          Print #1, rs!商品ID & "," & rs!商品名 & "," & rs!価格 & "," & rs!サイズ & ","
          rs.MoveNext
        Loop
      End If

      rs.Close: Set rs = Nothing
      db.Close: Set db = Nothing
    End If
    strFile = Dir()
  Loop

  Close #1
  MsgBox ("データの移動が終了しました")
End Sub


なお、"全商品リスト.csv"がすでに存在している場合の
処理はしていません。その処理が必要ならば以下に
http://oshiete.goo.ne.jp/qa/7324183.html
しています。参考に。

わからないところがあれば補足してください。

VBAによる処理ですが。

データの取り出しで、配列を使ったり、SQL文でレコードを
取り出したりすることもありますが、一応ノーマルにしておきます。

前提として、mdbファイルが一つのフォルダにあるものとします。
新しいmdbファイルを同じフォルダに作り、名前を 「司令塔.mdb」
とします。一応、「商品リストテーブル」の構造は、

商品ID、商品名、価格、サイズ

のようしておきます。違うようでしたら補足してください。
分かりやすいように「司令塔.mdb」にフォームを作り、
それにボタンを設定し、そのク...続きを読む

Qカレントレコードが無い事を判定させる方法

SQLを使ってmdb内のレコードセットを取得し、
無かったらエラーを返す、という処理を作成
する場合、カレントレコードが無い事を
判定するにはどうすれば良いでしょうか?
イメージは下記のような感じです。

レコードセット as DAO.Recordset

'レコードセット取得
 Set レコードセット = db.OpenRecordset(作成したSQL文)

'判定
If カレントレコード無 Then
MsgBox "エラーメッセージ"
Exit Sub
End If

Aベストアンサー

カレントレコード無は"レコードセット.RecordCount = 0"
で行けませんか?

Qレコードセットの中身を配列に、そしてワークシートに。

今excel2003のVBEで外部データベースから店舗別の売上データを取得し
それをエクセルのワークシートに出力するというプログラムを作成しています。
ここで問題なのが扱うデータの量が多すぎでレコードセット検索を
使用してそれをDo Until RS.EOFで各店舗の日別売上に出力していくとものすごく時間がかかってしまいます。
そのため配列を使う方法を見つけたのですが配列を使ったことなくて
どうしたらよいのかわかりません。
なんとかレコードセットの中身を配列に格納後にそれを一気に範囲貼り付けしたいと思います。
でも配列内で売上表のフォーマットに整形を行うことができるのでしょうか?

レコードセットのフィールドは店舗別日別売上、売上日付、店舗コード、ブランドセクションです。

売上日付|ブランドセクション|店舗コード|店舗別日別売上
20100201      100     1001     100000
20100201      100     1002     10000
・          ・      ・      ・
・          ・      ・      ・ 


売上表のフォーマットは縦列に1から月末までの日にち、横行に各店舗名が並んでいて各店舗の日別売上が一目でわかるつくりになっています。

各店舗名の上に店舗コードを持たせてそれを元に入力列を取得するという方法も考えたのですがそれも効率的とは思えません。
なにか良い方法はないでしょうか?
アドバイスお願いします。

最後に文章だけの説明でわかりにくくてすみません。
よろしくおねがいします。

今excel2003のVBEで外部データベースから店舗別の売上データを取得し
それをエクセルのワークシートに出力するというプログラムを作成しています。
ここで問題なのが扱うデータの量が多すぎでレコードセット検索を
使用してそれをDo Until RS.EOFで各店舗の日別売上に出力していくとものすごく時間がかかってしまいます。
そのため配列を使う方法を見つけたのですが配列を使ったことなくて
どうしたらよいのかわかりません。
なんとかレコードセットの中身を配列に格納後にそれを一気に範囲貼り付けしたいと...続きを読む

Aベストアンサー

実際データベースとか、クエリを見ていないので
レコードセットの中身が分かりませんので
ソースをかけませんが、配列に入れてシートに貼り付ける
サンプルを作ってみました。

Sub test()

Dim varArray(1 To 100, 1 To 26) As Variant

varArray(1, 1) = "日付" 'range("A1")
varArray(1, 2) = "1001" 'range("B1")
varArray(1, 3) = "1002" 'range("C1")
varArray(1, 4) = "1003" 'range("D1")
varArray(1, 5) = "1004" 'range("E1")

varArray(2, 1) = 20100201 'range("A2")
varArray(3, 1) = 20100202 'range("A3")
varArray(4, 1) = 20100203 'range("A4")
Range("A1:Z100") = varArray
End Sub

これだとデータがどんなに多くても高速です。

実際データベースとか、クエリを見ていないので
レコードセットの中身が分かりませんので
ソースをかけませんが、配列に入れてシートに貼り付ける
サンプルを作ってみました。

Sub test()

Dim varArray(1 To 100, 1 To 26) As Variant

varArray(1, 1) = "日付" 'range("A1")
varArray(1, 2) = "1001" 'range("B1")
varArray(1, 3) = "1002" 'range("C1")
varArray(1, 4) = "1003" 'range("D1")
varArray(1, 5) = "1004" 'range("E1")

varArray(2, 1) = 2...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング