こんにちは

「データベースなら任せて!!」
という方におたずねします。

最近、EXCEL2000のVBA講習をやることになりました。
VBAの基本的な説明はできるのですが、困ったことに外部データとのやり取りについては
うまく説明できません。

いろいろ調べてますが、よくわかりません。

やりたいことは、

複数のデータベースファイル(*.dbf)があります、
それをEXCEL上でフォームパネルを用意しデータを抽出・検索などできるように
制御したいのですが、

まず、
疑問(1)ODBCやSQLをVBAを使って制御しデータベースファイル(*.dbf)を扱うには。
疑問(2)データベースファイル(*.dbf)を扱えたとしてその後、どのように抽出や検索をさせるのか。

おたすけください。

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

A 回答 (2件)

私はdBASEを使用したことがないので(dbfってdBASEですよね?)、


一般的にODBCを使用する方法を書きます。
参考にできるところがあれば幸いです。
ただし、ご質問の内容に回答しようと思うと本が書けますので・・・^^;
全体の流れでご勘弁を・・
>(1)ODBCやSQLをVBAを使って制御しデータベースファイル(*.dbf)
>を扱うには。
まず、Excelからデータベースまでの経路を簡単に書きます。
Excelシート
 ↓↑
ExcelVBA
 ↓↑
ADOもしくはDAO
 ↓↑
ODBC
 ↓↑
データベース

まず、この経路を確保する必要があります。
ここで要求されること。
1・ODBCドライバの設定
2・ExcelVBAがADOかDAOを使えるようにする設定
3・VBAからADOかDAOを使用して、ODBC経由でdBASEデータベースを開く方法
(1、2は設定、3はVBAで記述)
なぜADOやDAOというものを使うのかというと、Excel単体のVBAの機能では、外部データベースとやり取りする能力がないからです。
ない機能なら、借りちゃえってことです。
1から3までがすべてうまくいけば、Excelからデータベースまでの1本の道ができたことになりますので、その道を使って、データのやり取りが可能になります。

>(2)データベースファイル(*.dbf)を扱えたとしてその後、どのように抽出
>や検索をさせるのか。
(1)の結果、経路は確保できていますから、要求を出して、結果を受け取ることをやればいいことになります。
要求を出すには?→SQL文を使いましょう。
結果をもらうには?→レコードセット(RecordSet)変数を使いましょう。

基本的なSQL文はSQL文が使用できるデータベースなら同じなので、問題ないと思います。
レコードセット変数というのは、SQL文で要求した結果のデータというのも、縦横のテーブル構造になってますので、それを受け取るためのものです。
これは、ExcelVBAにはなく、ADOやDAOの機能になります。
レコードセットにデータが入ったら、あとはエクセルのシートにぺったんぺったん張ってください。
実際のレコードセット変数にデータを受け取るまでのコードは、一番単純なモデルにすると3~4行ぐらいですみます。
(これだけ書いておいて・・・・^^;)

ほかの設定ができているとして、
DAOの場合
Dim DB As Database
Dim Rec as Recordset

Set DB = DBEngine.WorkSpace(0).OpenDataBase('ここに接続する設定を入れます')
Set Rec = DB.OpenRecordSet('ここにSQL文が入ります')
あとは、Recからデータを貼り付けるだけ。
ADOはちょっと手元に資料がないので・・・
あまりお役に立たないような内容ですいません^^;
調べたり質問したりする方向性にでもお役に立てればと思います。

調査する対象が多いので大変かと思いますが、がんばってください。

この回答への補足

アドバイスありがとうございます。

確かに今回の質問を説明するとなると本が書けるでしょうね。全体の雰囲気はわかりましたが、「ADOやDAO」はどこから導入すればよろしいのでしょうか。
SQLは少しかじったので、なんとかなりそうですが、ADOやDAOがよくわかりません。

補足日時:2001/09/22 11:50
    • good
    • 0

かなり専門的な内容ですね。


以下のFAQページをお勧めします(^。^)
私もかなりお世話になったページです。

参考URL:http://www.ngy.1st.ne.jp/~pinball/
    • good
    • 0

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

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

関連するカテゴリからQ&Aを探す

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

QエクセルVBAでアクセスデータベースを抽出して読み込む方法

エクセルVBAでアクセスデータベースを抽出して読み込む方法

アクセスで見積の提出情報のデータベースを作成しています。
このデータベースをエクセルのフォームで日付指定し抽出したいと考えております。

データベースの全てを読み込む事には成功したのですが、
いざフォームを作成し日付を入力。
実行したのですが、日付の構文エラーとなってしまいました。
抽出条件を表すSQLステートメントがおかしいのかもしれません。
どこを訂正したらよいのでしょうか?

Private Sub CommandButton1_Click()
 Dim rcs As ADODB.Recordset
 Dim cnStr As String, sqlStr As String
 Dim sday As Date

 sday = TextBox1.Text

'一覧のクリア、始点へ移動
 Range("A5:N300").Select
 Selection.ClearContents
 Range("A5").Select
'データベースの保存場所
 cnStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Accexl\見積予定.mdb"
'検索条件
 sqlStr = " SELECT * FROM 予定表 WHERE 作成日 = # sday #"
'データベースの読込、コピー、閉じる
 Set rcs = New ADODB.Recordset
 rcs.Open Source:=sqlStr, ActiveConnection:=cnStr, CursorType:=adOpenStatic

 ActiveCell.CopyFromRecordset rcs

 rcs.Close

 Set rcs = Nothing

  Range("C:C,E:E").Select
  Selection.NumberFormatLocal = "h:mm;@"
  Range("B:B,D:D").Select
  Selection.NumberFormatLocal = "m/d;@"

 Range("A3").Activate

End Sub

フォームの中にテキストボックス(日付を入力)、コマンドボタン(検索実行)を配置しています。
テキストボックスには日付表示するようにしています。

Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
Dim ret As Long
  ret = 0
  If KeyCode = vbKeyReturn Or KeyCode = vbKeyTab Then
    With TextBox1
      .Text = Replace(.Text, "/", "")
      If IsNumeric(.Text) Then
       If IsDate(Format(.Text, "0000""/""00""/""00")) Then
        .Text = Format(.Text, "0000""/""00""/""00")
        Else
         ret = 1
        End If
      Else
       ret = 1
      End If
     If ret = 1 Then
      MsgBox "日付指定です"
      KeyCode = 0
    End If
    End With
   End If
End Sub

エクセルVBAでアクセスデータベースを抽出して読み込む方法

アクセスで見積の提出情報のデータベースを作成しています。
このデータベースをエクセルのフォームで日付指定し抽出したいと考えております。

データベースの全てを読み込む事には成功したのですが、
いざフォームを作成し日付を入力。
実行したのですが、日付の構文エラーとなってしまいました。
抽出条件を表すSQLステートメントがおかしいのかもしれません。
どこを訂正したらよいのでしょうか?

Private Sub CommandButton1_Click()
 Dim rcs A...続きを読む

Aベストアンサー

以下でどうですか。

sqlStr = " SELECT * FROM 予定表 WHERE 作成日 = #" & sday & "#"

Qデータベースウィンドウを表示しないで、データベースウィンドウを更新する

http://support.microsoft.com/kb/304256/ja
マイクロソフト技術情報で、RefreshDatabaseWindow メソッド は、 Access2000形式で保存されたプロジェクト(ADP)で動作しませんと出ており、データベースオブジェクトの作成、削除、または名前の変更が行われた後で、データベース ウィンドウを更新する処理が、データベースウィンドウを表示している状態でしか更新できません。データベースウィンドウが表示されていない状態で、データ入力フォームが表示されて、何かの処理がされたときにデータベースウィンドウを最新の状態に更新したい場合、何か方法をご存知の方いらっしゃいましたらご指導ください。
テーブル作成をした後、テーブルにアクセスする処理をしようとするとテーブルがないため、エラーになってしまうことがあるのですが、一時的にデータベースウィンドウを表示させてF5を押下して最新にして作成したテーブルが表示されるとエラーは発生しません。

Aベストアンサー

こんにちは、
どうしてデータベースウィンドウが表示されていてはいけないのか、わかりませんが、
処理の実行中に
画面の描画をストップさせて、データベースウィンドウ
を表示→処理→データベースウィンドウを非表示→
画面の描画をスタートさせてはいかがでしょうか。

参考URL:http://oshiete1.goo.ne.jp/kotaeru.php3?q=2229389

Qリレーショナルデータベースの概念とエクセルのマクロとVBA

よろしくお願いします。
2つあります。

1.リレーショナルデータベースの概念とはどのようなものなのでしょうか?会社から「リレーショナルデータベースの概念は理解している?」と聞かれたのですが、正直言ってどういうものかわかりませんでした。

2.エクセルのマクロとVBAとはどう違うのでしょうか?私は同じような気がするのですが・・・同じく会社から「マクロとVBAが出来ないとだめだよ」と言われました。

私のスキルとしてはアクセスで簡単なマクロが組めます。
エクセルは簡単なマクロが組めます。

よろしくお願いします。

Aベストアンサー

1.
非常に解説が難しいです。
「リレーショナルデータベースの概念」と一口に言っても、学術的なRDBの概念なのか?RDBMSを設計する概念なのか?RDBMSを利用してRDBを使うシステムを設計する概念なのか?RDBMSを利用するだけの概念なのか?それとも上っ面の概念なのか?
(私はRDBMSを設計したり作ったりする方の専門ですけど)

たとえば、「ACCESSみたいなソフトを作るときに必要なRDBMSの概念」と「ACCESSでVBAを使ってテーブルを使うための概念」ではかなりレベルの違う概念となります。
リレーショナル理論なんてRDBMS設計者でもない限り知らないでも困ることはないでしょうが、本来の意味では【基礎概念】です。

どのようなレベルの概念が知りたいのですか?

2.
VBAはマクロを実現するための技術です。
一般的には「プログラム言語としてのVBA」と「開発環境としてのVBA」の両方を使えて「VBAが使える」と言うようです。

MicrosoftOffice環境においてマクロはVBAの利用技術です。
マクロ機能を持つアプリケーション/システムは数多く存在しますがVBAが使える環境は少数(っていうかMicrosoftOfficeファミリだけ)です。

1.
非常に解説が難しいです。
「リレーショナルデータベースの概念」と一口に言っても、学術的なRDBの概念なのか?RDBMSを設計する概念なのか?RDBMSを利用してRDBを使うシステムを設計する概念なのか?RDBMSを利用するだけの概念なのか?それとも上っ面の概念なのか?
(私はRDBMSを設計したり作ったりする方の専門ですけど)

たとえば、「ACCESSみたいなソフトを作るときに必要なRDBMSの概念」と「ACCESSでVBAを使ってテーブルを使うための概念」ではか...続きを読む

Qエクセル+VBAからデータベースを使う場合、何がよいでしょうか?

連続質問で恐縮ですが、教えてください。

エクセル+VBAで株価分析を行おうと思い、データをアクセスに記録するようにしようとしていましたが、
データ量が増えると、アクセスだと重くなるとの指摘を頂きました。

プログラムはエクセル+VBAで書きたいと思っているのですが、
エクセル+VBAから使いやすいデータベースって、アクセスの他にあるでしょうか?

出来上がったプログラムは、スタンドアロンというか、私一人で使用します。

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

Aベストアンサー

先のご質問でチラッと指摘がありましたが
http://oshiete1.goo.ne.jp/qa2956553.html
どれ位の銘柄数やレコード数を考えていらっしゃるのでしょう?
それによって変わってくるかと思いますけど。

データテーブルの更新処理は無いかと思いますのでインデックスの設定を行っておけば
10万レコード位なら軽く動くのでは?
ここから昔のデータがダウンロードできますので検証されては?
http://www.rain-net.com/kabu/data.htm
一ヶ月で7万レコード強でした。どえりゃー量ですね。年間で90万レコード!ふう。

また最終的にはExcelでローソク足?のようなグラフを作りたいのかな?とも
思いますが
上記リンクのトップページにツールらしきものがあります。どんな内容かは見てません。
http://www.rain-net.com/kabu/

QAccessから主キーの無いOracleテーブルにVBAで主キー設定付のODBC接続するには

Oracle7--------------- Access97
Workgroup Server
Release 7.3.2.2.1

TABLE_A----------------ODBC接続(リンクテーブル)    
項目1
項目2
項目3
項目4

項目1~項目4は
空白レコードがあり
主KEYが張れない

********************************************************************
主キーの作成出来ないオラクルテーブルがあります。

Access97からODBC接続を作成する時は

(1)マニュアルであれば
  対象テーブルに主キーが無ければ
任意の10項目を仮の主キーとして設定出来ますが

(2)VBA(自動?)で リンク張ると

Dim tab01 As TableDef
 Dim db01 As Database
 Dim strTABname As String

strTABname = TABLE名
Set db01 = CurrentDb
Set tab01 = db01.CreateTableDef(UserName & "_" & strTABname, dbAttachSavePWD)
tab01.SourceTableName = UserName & "." & strTABname
tab01.CONNECT = "ODBC;DSN=****;UID=" & UserName & ";PWD=" & Password & ";ConnectString=con;"
db01.TableDefs.Append tab01

主キー設定の無いODBC接続が出来て
  データの更新などが出来なくなります。

VBAでも仮の主キー設定付きのODBC接続は
 出来ないでしょうか?

Oracle7--------------- Access97
Workgroup Server
Release 7.3.2.2.1

TABLE_A----------------ODBC接続(リンクテーブル)    
項目1
項目2
項目3
項目4

項目1~項目4は
空白レコードがあり
主KEYが張れない

********************************************************************
主キーの作成出来ないオラクルテーブルがあります。

Access97からODBC接続を作成する時は

(1)マニュアルであれば
  対象テーブルに主キーが無ければ
任...続きを読む

Aベストアンサー

手元にACC97は無いのですが、擬似インデックスを作成すれば可能だったはず。

作成方法は通常のINDEX作成と変わりはありません。

db01.Execute "CREATE INDEX ・・・・;"


人気Q&Aランキング

おすすめ情報