質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

Q&A

解決済

4回答

16876閲覧

ExcelのVBAでOracleのtnsnames.oraのある場所を知るには

jm1156

総合スコア866

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

0グッド

1クリップ

投稿2016/06/05 23:53

クライアント側の環境、
Windows7,Excel2003~2010のVBA
Oracle10gもしくは11gもしくはInstantClient

ExcelのVBAからADO2.8のMicrosoft ODBC for OracleでOracleに接続しており、
Oracleサーバーが複数あります。

ユーザー環境のtnsnames.oraに接続文字列が無い場合、
VBAでエラーになるのでそれをキャッチして、
tnsnames.oraに接続文字列を書き加えようとしているのですが、
tnsnames.oraの場所がクライアントごとに違っていて、
取得方法に困っています。

環境変数'TNS_ADMIN'があればそれを取得するのですが、
無いクライアントもありました。

Cドライブをすべて検索していけば見つかるとは思うのですが、
それだと時間がかかってしまうし、
tnsnames.oraが複数あった場合、
Oracleが参照していないファイルを見つけることもあります。

なにか良い手は無いでしょうか?

よろしくおねがいします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

Windows Clientの場合はtnsnames.ora(=ORACLE_HOME)の場所を突き止めるのは容易ではないようです。

gusao様が教えてくださったHPの
NLS_LANG、ORACLE_HOME、ORACLE_SID などの設定を調べるには

"Windows におけるオラクル環境変数の確認方法"を見る限り、
ORACLE_HOMEはレジストリに書き込まれているので、そこから確認するのが確実かなと思います。

VBAで以下のようにプログラムを組めばできる気がします(VBAは詳しくありません…)

①"HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_<任意>"でレジストリ検索
※ただし複数インストールされている場合はインストール数だけ見つかるのでループ処理?

②その下にある"ORACLE_HOME"からnetwork/admin/tnsnames.oraを特定して追記。

##一般的かわかりませんので、是非有識者のご意見を伺いたいところです…(;´Д`)##

ところでODBCドライバを使用して接続しているということは、
端末1台ずつODBCドライバを設定する手順が発生しているということですよね?
その手順の中にtnsnames.oraの追記とODBC接続テストを含めれば良いのではないでしょうか。

投稿2016/06/06 02:15

編集2016/06/06 02:23
Yuna.S

総合スコア81

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jm1156

2016/06/06 02:46

ありがとうございます。レジストリでとれるか試してみます。 ODBCドライバは設定不要です。 Microsoft ODBC for Oracleは基本的にインストールされているので、 ADOならコントロールパネルに設定なしでも接続が可能なのです。
Yuna.S

2016/06/06 03:38

あぁ自分の無知がさらけ出されました…大変失礼しました(´・ω・`)
guest

0

ベストアンサー

WScript.Shellを利用して標準出力の結果を取得する

ORACLE_HOMEのレジストリ値取得であれば以下のようなコードでできると思います。

Sub Sample() Dim strPath As String strPath = GetOraHome("OraClient11g_home1") MsgBox strPath End Sub Function GetOraHome(ByVal vHOME_NAME As String) As String Dim WSH As Object Dim wExec As Object Dim sCmd As String Dim Result As String Dim strPath As String Set WSH = CreateObject("WScript.Shell") sCmd = "reg query ""HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_" & vHOME_NAME & """ /v ""ORACLE_HOME""" Set wExec = WSH.Exec("%ComSpec% /c " & sCmd) Do While wExec.Status = 0 DoEvents Loop Result = wExec.StdOut.ReadAll strPath = Trim(Mid(Result, InStr(Result, "REG_SZ") + 6, LenB(Result))) GetOraHome = strPath Set wExec = Nothing Set WSH = Nothing End Function

Oracle環境が複数インストールされているということでしたので、これとは別に対象環境の特定が必要だと思いますが、参考までに。

投稿2016/06/08 09:09

編集2016/06/09 00:34
jawa

総合スコア3013

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jm1156

2016/06/08 23:35

jawaさん、返信ありがとうございます。 sCmd = "reg query ""HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_""" & vHOME_NAME & " /v ""ORACLE_HOME""" この部分を、 sCmd = "reg query HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_" & vHOME_NAME & " /v ""ORACLE_HOME""" こう変更したら取得できました。 対象環境の特定は、いまのところ10g,11g,InstantClient3パターンしかないので、 全部を検索するようにしたいと思います。
jawa

2016/06/09 00:33 編集

ダブルクォートの位置が間違ってましたね。。失礼しました。 ``` sCmd = "reg query ""HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_" & vHOME_NAME & """ /v ""ORACLE_HOME""" ``` でも私の環境では提示したコードでちゃんと取得できてしまうのが不思議(^-^; 何とかなりそうでよかったです。がんばってください。
guest

0

コマンドプロンプトでpathと入力してそれらしいのを探す。。。ってのじゃあまりに乱暴なので、
こんな方法はいかがでしょうか?

1.SQL*Plusでログインする
2.「@?」とコマンドを入力して実行する
この時に出力されるパスの.sqlを省いた部分がORACLE_HOMEにあたります。

実行例

SQL

1SQL>@? 2SP2-0310: ファイル"C:\app\client\product\12.1.0\client_1.sql"をオープンできません。

まぁ、ORACLE_HOME配下にフォルダ名と同一のsqlファイルがないことが条件にはなりますが。。。
とりあえず、ご参考までに。

投稿2016/06/06 06:03

Tommy.103

総合スコア94

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jm1156

2016/06/06 06:54

回答ありがとうございます。 しかしVBAのマクロで行いたいのです・・・。
Tommy.103

2016/06/06 08:27

実行結果をファイルに出力するまでをバッチ化することはできます。あとはバッチを実行した後で出力したファイルの中身を確認することはVBAでもできます。 かなりな無理やり感はいなめませんがね(苦笑
Tommy.103

2016/06/06 08:31

そういえば、SQL*Plusがインストールされていることも条件でした。 失礼しました。
guest

0

TNS_ADMINが設定されていない場合は、$ORACLE_HOME/network/adminを参照するようです。

参考:http://www.shift-the-oracle.com/oracle-net/tnsnames.html

投稿2016/06/06 00:03

gusao

総合スコア185

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jm1156

2016/06/06 00:13

環境変数でORACLE_HOMEを探したのですがみつかりません・・・。 環境変数ではないのでしょうか?
Yuna.S

2016/06/06 01:53

コメントだけで申し訳ありません。 =====(以下抜粋)===== Windows の場合にはデフォルトの環境変数相当のものがレジストリに設定されているために改めてコントロールパネルなどから設定することは少ない。 特に、別途設定したい場合にはコントロールパネル「システム」プロパティの「詳細」タブの環境変数で上書きする。 ================ なのでインストールして使っていく上でORACLE_HOMEという環境変数は作られないようです。 使用しているPCにOracle11が入っていますが、やはりORACLE_HOMEという環境変数はありませんでした。
gusao

2016/06/06 02:16 編集

Yuna.Sさん ご指摘ありがとうございます。 環境変数と勘違いしていました。ORACLE_HOMEはレジストリに登録されているんですね。 jm1156さん 勘違いで混乱させてしまい申し訳ありません。 ORACLE_HOMEはレジストリに登録されているので、レジストリ値を取得すればtnsnames.oraのパスが取得できると思います。
gusao

2016/06/06 02:27 編集

すみません、VBA標準でアクセスできるレジストリは限られているようです。 http://officetanaka.net/excel/vba/tips/tips43.htm >なお、VBAのコマンドで操作できるレジストリは、HKEY_CURRENT_USERの下にあるSoftware内のVB and VBA Program Setting内です。そのほかの場所を操作したいときはAPIなどを使います。
jm1156

2016/06/06 02:46

みなさんコメントありがとうございます。 やはりレジストリなんですね。 ちょっと調べて試してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問