Windows

[Oracle]VBAからSELECT文を実行しデータを取得する方法

microsoft Windows

VBAからOracleデータベースでSELECT文を実行してデータを取得するライブラリを作成しましたので記載します。

Oracle接続にはOracle Clientのインストールと参照設定が必要になりますので、過去の記事を参考に設定してください。

Oracle接続情報の設定

Oracleへの接続は、TNSサービス名で接続する場合とTNSサービス名を使用せず直接接続する場合の2パターン用意しています。

どちらかの接続方法を選択してヘッダ部に定義してある定数を変更します。

'TNSサービス名で接続する場合(tnsnames.ora)
Private Const PROVIDER As String	= "OraOLEDB.Oracle"
Private Const DATA_SOURCE As String	= "orcl"		'ネットサービス名

'TNSサービス名を使用せず直接接続する場合
Private Const HOST_NAME As String	= "localhost"	'データベースのホスト名orIPアドレス 
Private Const PORT_NO	As String	= "1521"		'データベースのポート
Private Const SERVICE_NAME As String = "orcl"		'サービス名

'データベースのアカウント情報
Private Const USER_ID As String		= "user"		'データベースのユーザID
Private Const PASSWORD As String	= "password"	'データベースのパスワード

TNSサービス名を使用せず直接接続する場合は、本体部分のコードを以下のように変更します。

'	'TNSサービス名で接続する場合
'	cn.ConnectionString	= "Provider=" & PROVIDER _
'						& ";Data Source=" & DATA_SOURCE _
'						& ";User ID=" & USER_ID _
'						& ";PASSWORD=" & PASSWORD
'	cn.Open

	'TNSサービス名を使用せず直接接続する場合
	cn.ConnectionString	= "Provider=" & PROVIDER _
						& ";Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)" _
						& "(HOST=" & HOST_NAME & ")" _
						& "(PORT=" & PORT_NO & "))" _
						& "(CONNECT_DATA=" _
						& "(SERVICE_NAME=" & SERVICE_NAME & ")))" _
						& ";User ID=" & USER_ID _
						& ";PASSWORD=" & PASSWORD
	cn.Open

呼出元の設定

呼出元ではライブラリに渡す引数の設定を行います。

第1引数には、実行したいSELECT文を定義します。

第2引数には、SELECT文を実行して取得したデータを格納する配列を定義します。

配列の要素数はライブラリ内で再定義しますので、動的配列として宣言します。

Dim sql As String
sql = "select * from dual"
Dim dataArray() As Variant
ExecDBSelect(sql, dataArray)

取得データの取り出し

ライブラリの戻り値には、実行結果のステータスコードとして正常に終了した場合はTrue、異常終了した場合はFalseを設定しています。

取得データは引数として渡した配列に2次元配列として格納されています。

実行結果が正常終了の場合のみ、取得データを1要素ずつ取り出してシートに書き出しています。

If ExecDBSelect(sql, dataArray) Then
    Dim y As Integer, x As Integer
    For y = LBound(dataArray, 1) To UBound(dataArray, 1)
        For x = LBound(dataArray, 2) To UBound(dataArray, 2)
            ActiveSheet.Cells(y + 1, x + 1) = (dataArray(y, x))
        Next
    Next
End If

OracleデータベースでSELECT文を実行するライブラリ

最後にライブラリのコードを記載します。

Option Explicit

'TNSサービス名で接続する場合(tnsnames.ora)
Private Const PROVIDER As String	= "OraOLEDB.Oracle"
Private Const DATA_SOURCE As String	= "orcl"		'ネットサービス名

'TNSサービス名を使用せず直接接続する場合
Private Const HOST_NAME As String	= "localhost"	'データベースのホスト名orIPアドレス 
Private Const PORT_NO	As String	= "1521"		'データベースのポート
Private Const SERVICE_NAME As String = "orcl"		'サービス名

'データベースのアカウント情報
Private Const USER_ID As String		= "user"		'データベースのユーザID
Private Const PASSWORD As String	= "password"	'データベースのパスワード

'----------------------------------------------------------------------------------------------------
'	関数名	:	ExecDBSelect
'	機能	:	OracleデータベースでSELECT文を実行してデータを取得する
'	引数	:	sSQL	SELECT文
'			:	vArray	取得データ格納配列
'	戻り値	:	True:正常終了	False:異常終了
'	備考	:
'----------------------------------------------------------------------------------------------------
Public Function ExecDBSelect(sSQL As String, vArray() As Variant) As Integer
	On Error GoTo ERR_HANDLER
	ExecDBSelect = False

	'--------------------------------
	' データベース接続				
	'--------------------------------
	Dim cn As New ADODB.Connection

	'TNSサービス名で接続する場合
	cn.ConnectionString	= "Provider=" & PROVIDER _
						& ";Data Source=" & DATA_SOURCE _
						& ";User ID=" & USER_ID _
						& ";PASSWORD=" & PASSWORD
	cn.Open

'	'TNSサービス名を使用せず直接接続する場合
'	cn.ConnectionString	= "Provider=" & PROVIDER _
'						& ";Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)" _
'						& "(HOST=" & HOST_NAME & ")" _
'						& "(PORT=" & PORT_NO & "))" _
'						& "(CONNECT_DATA=" _
'						& "(SERVICE_NAME=" & SERVICE_NAME & ")))" _
'						& ";User ID=" & USER_ID _
'						& ";PASSWORD=" & PASSWORD
'	cn.Open

	'--------------------------------
	' SQLの実行
	'--------------------------------
	Dim rs As New ADODB.Recordset
	'レコード件数の取得ため、CursorTypeにadOpenStaticを指定する
	rs.Open sSQL, cn, adOpenStatic

	'--------------------------------
	' 取得データを配列に格納
	'--------------------------------
	'配列を再定義する
	Redim vArray(rs.Fields.Count - 1, rs.RecordCount - 1)
	'レコードセットの内容を配列に格納
	vArray = rs.GetRows

	'--------------------------------
	' データベース切断
	'--------------------------------
	If Not rs Is Nothing Then
    	If rs.State = adStateOpen Then rs.Close
		Set rs = Nothing
  	End If 
	If Not cn Is Nothing Then
		If cn.State = adStateOpen Then cn.Close
		Set cn = Nothing
	End If 

	'戻り値設定
	ExecDBSelect = True

Exit Function

ERR_HANDLER:

	'エラーメッセージ
	Debug.Print Err.Number & ")" & Err.Description

	'--------------------------------
	' データベース切断
	'--------------------------------
	If Not rs Is Nothing Then
    	If rs.State = adStateOpen Then rs.Close
		Set rs = Nothing
  	End If 
	If Not cn Is Nothing Then
		If cn.State = adStateOpen Then cn.Close
		Set cn = Nothing
	End If 

End Function

呼出元のサンプルコードを記載します。

Sub main()
    Dim sql As String
    sql = "select * from dual"

    Dim dataArray() As Variant
    Dim y As Integer, x As Integer
    If ExecDBSelect(sql, dataArray) Then
        For y = LBound(dataArray, 1) To UBound(dataArray, 1)
            For x = LBound(dataArray, 2) To UBound(dataArray, 2)
                ActiveSheet.Cells(y + 1, x + 1) = (dataArray(y, x))
            Next
        Next
    End If
End Sub
タイトルとURLをコピーしました