GEN MUTO'S HOMEPAGE  エクセル大事典  エクセルVBAを極める

エクセルExcel大事典 エクセル大事典TOPページへ
 ■ エクセルVBAを極める−VBAスーパーテクニック
  エクセルのワークシートに接続してみよう!
 
■ データオブジェクトを使用してデータを取得しよう
 
ここではActiveXデータオブジェクト(ADO)とMicrosoftJetOLE DB4.0プロバイダを使用した、ワークシートからのデータ取得について解説します。
初級編の最後に、オブジェクト指向プログラミングによるデータセット取得のサンプルを記述しました。
しかし現実に、あのようなコードが使われることはまずないでしょう。

なぜならデータオブジェクトというデータベースのテーブルを直接操作できる便利なオブジェクトがすでに用意されており、ExcelVBAからでも簡単に使用することができるからです。

ADOにはレコードの追加・削除・検索・抽出・並び替えなどの基本的な操作が用意されており、SQL文を組み合わせることで複数のテーブルから、必要なデータセットを如何ようにでも抽出できます。
ですので開発者が自らレコードセットを扱うクラスを設計する必要はないのです。

では早速、このADOを使用してエクセルのワークシートをデータベースのテーブルのように使用してみましょう。
入門編9のコードを以下のように置き換えてみましょう。
実行するにはVBEの参照設定(ツール>参照設定)で「Microsoft ActiveX Data ObjectX.X Library」にチェックを入れる必要があります。

(X.Xはバージョン名でできるだけ最新のものにチェックを入れてください)

' フォームモジュールに記述ここから −−−−−−−−−−−−−−−−−−−−−−−−−
Dim CN As ADODB.Connection

Private Sub UserForm_Initialize()
  On Error GoTo ErrGyo
  Set CN = New ADODB.Connection
    CN.Provider = "Microsoft.Jet.OLEDB.4.0"
    CN.Properties("Extended Properties") = "Excel 8.0"
    CN.Open ThisWorkbook.FullName
  Call ClearLabel
  BtnOK.Caption = "OK"
Exit Sub
ErrGyo:
  MsgBox "SyainMSTへの接続に失敗しました", vbCritical
  BtnOK.Enabled = False
End Sub

Private Sub BtnOK_Click()
Dim RS As ADODB.Recordset
Dim SQL As String
  Call ClearLabel
  If ChkSyainID(TxtID) Then
    SQL = "SELECT * FROM [SyainMST$] WHERE SyainID = " & TxtID
    Set RS = New ADODB.Recordset
      RS.Open SQL, CN, adOpenStatic, adLockReadOnly
    If Not RS.BOF Then
      LblName = RS.Fields("SyainNAME")
      LblKinzoku = RS.Fields("Kinzoku")
      LblSyozoku = RS.Fields("Syozoku")
      LblYakusyoku = RS.Fields("Yakusyoku")
    Else
      MsgBox "入力された社員IDは存在しません", vbCritical
    End If
    Set RS = Nothing
  Else
    MsgBox "社員IDが有効ではありません", vbCritical
  End If
End Sub

Private Function ChkSyainID(ByVal pTxtID As String) As Boolean
Dim i As Long
  If IsNumeric(pTxtID) Then
    If Len(pTxtID) = 4 Then
      ChkSyainID = True
      Exit Function
    End If
  End If
  ChkSyainID = False
End Function

Private Sub UserForm_Terminate()
  Set CN = Nothing
End Sub
' フォームモジュールに記述ここまで −−−−−−−−−−−−−−−−−−−−−−−−−

標準モジュールのTestプロシージャとフォームモジュールのClearLabel関数は前回のものをそのまま使用します。
クラスモジュールSyainClsは今回使用しません。
ずいぶんと見慣れないコードが並んでいますね。順を追って説明していきます。

まずUserForm_InitializeのときにADOのコネクションを確立します。
Dim CN As ADODB.Connection はモジュールレベルでコネクション変数を定義しています。以降、UserForm_Terminate されるまでこのコネクション変数はモジュール内のどこからでも呼び出しが可能です。
Set CN = New ADODB.Connection でコネクション変数のインスタンスを作成しました。

CN.Provider = "Microsoft.Jet.OLEDB.4.0" は使用するOLE DBプロバイダを指定しています。Accessに接続する時も同じものを使用します。
CN.Properties("Extended Properties") = "Excel 8.0" 拡張プロパティにExcel8.0を指定することで97以降のExcelに接続できるようになります。
CN.Open ThisWorkbook.FullName 現在開いているブックのフルパス+ファイル名を指定します。つまり自分の中にあるシートにアクセスさせるわけです。

さて、フォームが開いた段階でADOのコネクションが確立しています。しかしレコードセットはまだなにも取得していません。BtnOK_Click が押された時に初めてレコードセットを取得するのです。

Dim RS As ADODB.Recordset レコードセット変数を定義しています。
SQL = "SELECT * FROM [SyainMST$] WHERE SyainID = " & TxtID これがSQL文と呼ばれるものです。このクエリー文次第で様々なレコードセットを取得することが可能です。
FROM [SyainMST$] でレコードセットに取得するワークシート名を指定しています。
WHERE SyainID = " & TxtID はTxtIDの値に一致したレコードを取得しなさいという意味になります。

Set RS = New ADODB.Recordset レコードセットのインスタンスを実体化しました。
RS.Open SQL, CN, adOpenStatic, adLockReadOnly レコードセットRSにOpenメソッドをおくりレコードセットを取得しています。adOpenStatic はカーソルタイプ adLockReadOnly はロックタイプです。今回は参照のみに使用するのでこの値をセットしています。カーソル・ロックの種類には以下のようなものがあります。



カーソルの種類 定数 説明
順方向専用 adOpenForwardOnly 0 レコードセットを順方向のみ移動します。個別のレコードを検索するためには使用できません。レコードセット内のレコードの数を返すことはできません
キーセット adOpenKeyset 1 レコードセットを順方向および逆方向にスクロールします。Find の使用が可能で、レコード数を返します。既存のレコードの変更は動的に反映され、新しいレコードの作成は反映されません
動的 adOpenDynamic 2 レコードセットを順方向および逆方向にスクロールします。Find の使用が可能で、レコード数を返します。レコードセットは全ての変更が反映されます
静的 adOpenStatic 3 レコードセットを順方向および逆方向にスクロールします。Find の使用が可能で、レコード数を返します。レコードセットは変更が動的に反映されません
ロックの種類 定数 説明
読み取り専用 adLockReadOnly 1 レコードをロックせずリソースを解放します。ただしレコードセットは読み取り専用になります
ペシミスティック adLockPessimistic 2 編集開始の時点でレコードをロックしたら、Update メソッドを呼び出すまで解放しません
オプティミスティック adLockOptimistic 3 Update メソッドを呼び出すときのみ、レコードを瞬間的にロックします
一括 adLockBatchOptimistic 4 一括更新に使用します

レコードセットを読み取りだけでなく更新する必要があるならば adOpenDynamic, adLockOptimistic の値をセットしてやればいいわけです。

If Not RS.BOF Then 「BOF」プロパティは最初のレコードの前方にカーソルがあるということです。「EOF」は逆に最後のレコードの後方にカーソルがある状態を表します。BOFがTRUEのときはレコードが一件もないということをさしています。
LblName = RS.Fields("SyainNAME") フィールドプロパティの名前は取り込んだワークシートの一行目が項目名になります。SyainNAME は社員名でしたね。以降、同じ要領でラベルに項目値をセットしていきます。
Set RS = Nothing 必要のなくなったRSオブジェクトを廃棄しています。

ADOを使用することでこんなに簡単にワークシートをデータベースとして使用することができました。
このやり方の素晴らしい点は、将来データベースをワークシートからMDBファイル、SQLサーバーに移行したときもほとんど同じコードが再利用できる点です。
また現時点でSQLやOracleサーバーを使用している場合も、エクセルのワークシートをワークファイル代りに使用することができます。
非常に応用のきく、汎用性のある手法です。

次回は同じ方法を使って、ExcelからAccessのデータベースを操作したいと思います。

 ※ 今回の内容に関する詳しいMicrosoftのリファレンスはこちらです。
  http://support.microsoft.com/kb/257819
  http://support.microsoft.com/default.aspx?scid=kb;ja;278973

 

>> 次の話にすすむ


サイト内検索ができます

Microsoft Most Valuable Professional

Microsoft MVP Excel
武藤 玄 プロフィール
 

■■■ 執筆した書籍 ■■■
 

EXCEL VBA 業務自動化
 

Excel VBA を5日でマスターする本
 

仕事を速くする Excel VBA 入門
 

Excel VBAと業務改善のポイントがわかる本
 

Access VBA ベーシック スタンダード
 

Excel VBA アクションゲーム作成入門
 

■■■ 連載中の記事 ■■■
 

Excel VBAで業務改善!
 

実務で使うExcel VBA
 


TOPページ


■ エクセルVBA超入門

 ・9ステップで"Hello World!"
  からオブジェクト指向まで!
  1."Hello World!"を表示しよう
  2.基本はデータの入出力
  3.繰り返し処理
  4.シートで簡易データベース
  5.名前をつけよう
  6.構造化プログラムに挑戦
  7.構造体を使ってみよう
  8.フォームを使ってみよう
  9.オブジェクト指向に挑戦

■ エクセルVBA中級編

 ・VBAでいろんなテクニック
  変数・関数のスコープ
  引数の参照方法を明示
  配列の中身を一気に複写
  識別子がよいコードを作る
  データ定義型をもっと知ろう
  定数と列挙型を活用しよう
  エラー処理の重要性1
  エラー処理の重要性2
  いろいろな条件分岐
  いろいろな繰り返し処理
  演算子について知ろう
  文字列操作 連結 変換 置換
  文字列操作 検索 比較 書式
  日付操作関数を知ろう
  数値操作・評価・その他関数
  並び替えソートをマスター
  いろいろな検索をマスター
  VBEditorを使いこなそう
  マクロの記録を活用しよう1
  マクロの記録を活用しよう2
  VBAからVBEを操作しよう1
  VBAからVBEを操作しよう2
  VBAからVBEを操作しよう3
 ・ワークシートを使いこなす
  セルの参照をマスターしよう
  セルの選択をマスターしよう
  セルの操作をマスターしよう
  セルの書式設定をマスターしよう
  行・列の操作をマスターしよう
  シートの参照をマスターしよう
  シートの操作をマスターしよう
  ブックの操作をマスターしよう
  ウィンドウの操作をマスターしよう
  イベントプロシージャを活用しよう
  ワークシートを印刷しよう1
  ワークシートを印刷しよう2
  音声(読み上げ)機能を操作しよう
  グラフを操作しよう
 ・ユーザーフォームを使いこなす
  ユーザーフォームを使おう
  UserFormsオブジェクト
  Labelコントロール
  TextBoxコントロール
  ComboBoxコントロール
  ListBoxコントロール
  CheckBoxコントロール
  OptionButtonコントロール
  ToggleButtonコントロール
  CommandButtonコントロール
  ScrollBarコントロール
  SpinButtonコントロール
 ・VBA関数の一覧
  Aから始まる関数の一覧
  Cから始まる関数の一覧
  Dから始まる関数の一覧
  Eから始まる関数の一覧
  Fから始まる関数の一覧
  Gから始まる関数の一覧
 
■ エクセルVBAを極める
 VBAスーパーテクニック
 
 ・データベースへ接続してみよう!
  CSVファイルへの接続
  ワークシートへの接続
  mdbファイルへの接続
  SQL Serverへの接続
  ADOレコードセットの操作1
  ADOレコードセットの操作2
 ・ファイルを操作してみよう!
  FileSystemObjectの操作
  Drive File Folderの操作
  TextStream ダイアログ
  ステートメントでファイル操作1
  ステートメントでファイル操作2
 ・他アプリと連携してみよう!
  ActiveXオートメーションの操作
 ・ゲーム技でマクロを超える
  エクセルで音を鳴らす1
  エクセルで音を鳴らす2  
  スクリーン座標を取得
  様々なイベント取得
  リボンUIを制御しよう1
  リボンUIを制御しよう2
  シート上でアニメを動かそう
 
■ 一歩上行くエクセル
 基本操作の完全マスター!

 
 ・あなたはいったい
  エクセルで何をしたいのか?
  エクセルで業務効率化
  エクセル関数を使いこなす
  エクセルの便利技
  エクセルは最高の帳票ツール
 ・エクセル基本操作上級編!
  セル選択、コメント、シリアル値
  オート機能を使いこなそう!
  参照、条件付書式、入力規則
  関数をもっと理解しよう!
  配列数式を有効利用しよう!
  データの正規化をしよう!
  ショートカットキーを利用しよう1
  ショートカットキーを利用しよう2
  Office用アプリを作成しよう!
  PowerPivotとExcelで簡単BI!
 ・世間の誤ったエクセルの
  べからず集
  エクセルで文章を書くべからず
  エクセルで図形を描くべからず
  エクセルでシステムをつくるな
 
■ エクセル関連その他

 ・エクセルコミニュティにあなたも
  参加しませんか?
  Excel関連リンク・コミニュティ
 ・VBの理解がVBAをマスターする
  最短距離!
  VB関連の老舗・大家サイト
 ・エクセルExcel大事典掲示板
 ・プライバシーポリシー

2000アイテムを超えるラベルを販売
送料無料、即納対応の優良ショップ
今買っているラベルより確実に安い!
OAラベルの販売専科グラフトラベル




エクセルExcel大事典ははリンクフリーです エクセル大事典Excel大事典
お問い合わせはこちら gengengen@yahoo.co.jp

Copyright© Gen Muto 武藤 玄 All Rights Reserved,