ADOを使用して、パスワードの設定されているエクセルファイルを開く方法

このQ&Aのポイント
  • ADOを使ってパスワードの設定されたエクセルファイルを更新モードで開く方法について教えてください。
  • エクセルファイルにパスワードが設定されている場合、どのように記述すればいいのか教えてください。
  • パスワードの設定されていないエクセルファイルについては、下記の記述で開くことができます。
回答を見る
  • ベストアンサー

ADOを使用して、パスワードの設定されているエクセルファイルを開く方法

ADOを使いエクセルファイルを更新モードでオープンしたいのですが、このエクセルファイルにパスワード(例:読み込み用:aaa、書き込み用:bbb)が設定されていたら、どのように記述すれば良いですか。 パスワードが設定されていない場合は、下記の記述でうまくいきます。 ご存知の方がいらっしゃいましたら、よろしくお願い致します。 'ADOオブジェクトを作成 Set objADO = CreateObject("ADODB.Connection") '更新モードでオープン objADO.Open "Driver={Microsoft Excel Driver (*.xls)};" & "DBQ=" & SavePath & ";" & "ReadOnly=0"

質問者が選んだベストアンサー

  • ベストアンサー
noname#158371
noname#158371
回答No.1

> objADO.Open "Driver={Microsoft Excel Driver (*.xls)};" & "DBQ=" & SavePath & ";" & "ReadOnly=0" 上記の接続手法はODBC接続なので、 Excelファイルのパスワードまでをも管理する機能は、ODBC・Excelドライバにはありません。 Windows側でODBC設定でExcelドライバを指定して接続定義する画面を開くと良くわかるかと思いますが、 Excel側で設定しているパスワードも設定し、自動接続するようなことが できないのがおわかり頂けるかと思います。 理由は、パスワード機能はあくまで「Excel」の機能であり、 「ODBC」の機能ではないので、ODBC接続にExcelパスワードを設定することは不可能ということになります。 とにかく接続!というのも大事ですが、まずは上記の本質をご理解した上で、問題の回避方法を説明します。 ADOでExcelファイルを開いた後、ADO+ ODBC接続でExcelを開くのではなく、「Excel.Application」というオブジェクトを使ってExcelを開くとパスワード入りのExcelファイルを開けるようになります。 こんな感じで・・・(細かい引数などは間違っているかもしれないので、とりあえず感覚だけでもつかんでいただければ) Set xlsApp = Server.CreateObject("Excel.Application") Set xlsBook = xlsApp.Workbooks.Open(strGetFileName, , , ,"読み取り用か書き込み用のパスワード") . . . ワークブック(Excel)のパスワード自動入力させるやり方は、 http://okwave.jp/qa1693505.html あたりに掲載されています。 また、ASP側でExcelを操作する方法は、 http://okwave.jp/qa457833.html あたりをご参考にいただければと思います。 それから関係ないんですが、「ReadOnly=0」ではなく、「ReadOnly=False」と書いても動きますので、0, 1でReadOnly属性を設定するのは客観的にわかりずらいので、お勧めできません。 読み取り専用ならその反対で、「ReadOnly=True」になります。 それでは、宜しくお願いします。

参考URL:
http://okwave.jp/qa1693505.html
tsubu_0027
質問者

お礼

丁寧なご回答、ありがとうございます。しばらくチェックしていなかったため、今気がつきました。 上記を参考にして、やってみます。その後、またご報告したいと思っています。

tsubu_0027
質問者

補足

Excel.Applicationを使ってやってみたのですが、ブラウザが制御不能になってしまい、うまくいきませんでした。引数の記述の仕方を調べたのですが、はっきりしたことがわからず、試行錯誤してみましたが、だめでした。 結局、最終的には、パスワードを設定したエクセルファイルを扱わないで済むよう、仕様を変更したため、この問題については、解決しないままになってしまいました。せっかくご回答をいただいたのに、すみませんでした。

関連するQ&A

  • ADOで別ユーザが開いているエクセルを読み込む方法

    VisualBasic.NETからADOをEXCELデータで使用して、ブック内のシート内容を読み出して集計するソフトを作っています。 題名の通りなのですが、既に別ユーザが開いているEXCELブックの内容をADOを使って読み出すにはどうすれば良いでしょうか? 開かれていない状態のEXCELなら問題なく読めるのですが、既に別ユーザに開かれているEXCELを読もうとするとエラーとなってしまいます。 以下、ソースコードの一部です。 コメントアウト箇所はいろいろ試した残骸です。 fsに開こうとしているEXCELパスが入ってます。 rsExcel = CreateObject("ADODB.Recordset") cnExcel = CreateObject("ADODB.Connection") 'cnExcel.ConnectionString = "Driver={Microsoft Excel Driver (*.xls)};" & _ ' "DBQ=""" & fs(ii) & """;" 'With cnExcel ' .Provider = "MSDASQL" ' .ConnectionString = "Driver={Microsoft Excel Driver (*.xls)};" & _ ' "DBQ=" & fs(ii) & "; ReadOnly=True;" ' .Open() 'End With 'System.IO.File.Open(fs(ii), IO.FileMode.Open, IO.FileAccess.Read, IO.FileShare.Read) With cnExcel .Provider = "Microsoft.Jet.OLEDB.4.0" .ConnectionString = "Data Source=" & fs(ii) & ";" & _ "Extended Properties=Excel 8.0;" .Open() End With cnExcel.Mode = ADODB.ConnectModeEnum.adModeRead cnExcel.Open() sSQL = "SELECT * FROM [" & SheetName & "$]" rsExcel.Open(sSQL, cnExcel, ADODB.CursorTypeEnum.adOpenForwardOnly, ADODB.LockTypeEnum.adLockReadOnly) どの方法を試してもOPENしようとする所でエラーとなります。 エラーメッセージ「ファイル '' を開くことができませんでした。ほかのユーザーが排他的に開いているか、データを読み取る権限がありません。」 既に誰かが使用中の.xlsをダブルクリックしてEXCELで開けば、読み取り専用ですが開けて内容が読める訳ですが、それをADOで行う事は出来ないんでしょうか? COMコンポーネントのEXCELライブラリのWORKBOOKS.OPENで読み取り専用で事前に開いた後にADOでOPENすれば読めたのですが、ソフトをインストールする予定のPCはEXCEL未インストール状態なのでCOMを使う事は出来ない状況です。 何か良い手段は御座いませんでしょうか? 詳しい方が居られましたらご教示頂きたく思います。

  • Excelシートのあるセルから値を取り出す場合のASPの記述方式

    Excelファイル(Test.xls)の中のシート(sheet1)にあるセル(A3、B11等) にある値を取得したい場合のSQL文の表記方法が、わかりません。何方か教えて頂けないでしょうか? 【サンプルプログラム】 Set objADO = CreateObject("ADODB.Connection") objADO.Open "Driver={Microsoft Excel Driver (*.xls)};" & _ "DBQ=D:\Test.xls;" & _ "ReadOnly=1" Set objRS = objADO.Execute("【?】") すみませんが、よろしくお願い致します。

  • VBScriptにて、csvファイルから特定のレコードを取得したい

    以下のcsvファイルから例えば、「name」列が「aaa」の行を取得するVBScriptを作成したのですが、うまくいきません。ご教授お願いいたします。 --------------- name,id aaa,1 bbb,2 ccc,3 --------------- 作成したVBScriptは以下のものになります。 (SQL文のWhere句に直接、「where name= 'aaa'」と打つとうまくいきますが、変数を指定したいです。) ------------------------------------------- Option Explicit Dim objADO Dim objRS Dim strName strName = "aaa" 'ADOオブジェクトを作成 Set objADO = CreateObject("ADODB.Connection") 'ADOを使いCSVファイルを扱う準備(オープン)を行う objADO.Open "Driver={Microsoft Text Driver (*.txt; *.csv)};" & _ "DBQ=C:\sagyou\;" & _ "ReadOnly=1" 'SQLを実行し、当該タスクのデータを抽出します Set objRS = objADO.Execute("select * from test.csv where name= strName") 'レコードセットをクローズobjRS.Close objRS.Close 'ADOオブジェクトをクローズ objADO.Close

  • vbsによるMsアクセスへの接続について

    MsアクセスにADOで接続する場合、例えば、以下のようなVBスクリプトを実行した時、 Set obj_ado = CreateObject("ADODB.Connection") obj_ADO.Open "Driver={Microsoft Access Driver (*.mdb)}; DBQ=test_2000.mdb;" obj_ADO.Open "Driver={Microsoft Access Driver (*.mdb, *.accdb)}; DBQ=test_2007.accdb アクセス2000(mdbファイル)への接続は問題ないのですが、アクセス2007(accdbファイル)へは、エラーとなって接続出来ません。 ドライバーの指定方法が間違っているのでしょうか?

  • VBScriptでCSVファイルのデータ取得

    VBScriptで、ADOを使ってCSVファイルのデータを読み込みたいのですが、 うまういきません。 CSVファイル(Data.csv)の内容は下記です。 item1,item2 AA1,BB1 AA2,BB2 AA3,BB3 プログラムの内容は、下記です。 'ADOオブジェクトを作成 Set objADO = CreateObject("ADODB.Connection") 'ADOを使いCSVファイルを扱う準備(オープン)を行う objADO.Open "Driver={Microsoft Text Driver (*.txt; *.csv)};" & _ "DBQ=C:\Documents and Settings\houjyou-n\デスクトップ;" & _ "ReadOnly=1" 'SQLを実行し、当該タスクのデータを抽出します Set objRS = objADO.Execute("select * from Data.csv where item1 = 'AA3'") If Not objRS.Eof Then If objRS("item2") = "BB3" Then Flg = True End If End If 'レコードセットをクローズobjRS.Close objRS.Close 'ADOオブジェクトをクローズ objADO.Close 実行すると、「オブジェクト'Data.csv'が見つかりませんでした。オブジェクトが存在していること、名前やパス名が正しいことを確認してください。」というエラーが出ます。 パスもファイル名も間違っていないのですが、何がいけないのでしょうか。 手がかりになることがあれば、何でも教えていただければ幸いです。

  • Access2007からADO接続にてEXCEL

    Access2007からADO接続してEXCELのシートにSELECT文を発行すると、 『[Microsoft][ODBC Excel Driver]選択された CollatingSequence は OS でサポートされていません。』のエラーが出ます。 SELECT文に条件を付けると上記エラーが発生します、条件なしの場合はエラーが発生しません。 エラーが発生してもデバッグで F8 で実行すると正常に条件付きでSELECTされます、 エラーは一回目のSELECTだけで、以降はエラーが発生しません。 対処の方法をお教え下さい。 よろしくお願いします。 (("Microsoft.Jet.OLEDB.4.0"を使用してもエラーが発生しました。)) (例) 'テンポラリファイルを取り込む Dim querydef As DAO.querydef Dim adoCON As New ADODB.Connection Dim adoRS As New ADODB.Recordset Dim strV As String Dim strQ As String 'ADOを使い読み込み専用モードでExcelファイルを扱う準備(オープン)をします adoCON.Open "Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)}; " & _ "DBQ=" & "C:\test2014.xlsx" & ";" & _ "ReadOnly=True" 'SQLを実行(全件検索)   OK Set adoRS = adoCON.Execute("SELECT * FROM [Shite1$]") 'SQLを実行(条件付き検索) NGエラーが発生します。 Set adoRS = adoCON.Execute("SELECT * FROM [Shite1$] WHERE A = 7 ")

  • EXCELパスワード付ファイルでリンクの自動更新について

    EXCELでパスワードをファイルに設定したのですが、Linkの更新をするとき、マクロの記述でWorkbook.Open(,,password・・・)の様にパスワードを自動的に入力したいのですが、どのようなコードで可能になりますか。 EXCELのマクロ初心者です。よろしくお願いします。

  • エクセルファイルのadoでの編集

    下記のようにエクセルのレコード編集をこころみていますが 下記のように氏名に重複があると、重複レコードが一緒に編集されてしまいます。アドバイスをいただけないでしょうか。「加藤」さんのほうは問題なく編集できます。 id,氏名,住所 15,山田太郎,東京都 18,山田太郎,栃木県 20,加藤太郎,岩手県 sCoString = "DBQ=" & Server.MapPath("" & Session("DB") & "") & "; ReadOnly=False;" sCoString = sCoString & "DefaultDir=" & Server.MapPath("./") & ";" sCoString = sCoString & "Driver={Microsoft Excel Driver (*.xls)};" Set cn = Server.CreateObject("ADODB.Connection") cn.Open sCoString sSQL = Session("SR") & " where id = " & Request("key") Set rs = Server.CreateObject("ADODB.Recordset") rs.Open sSQL, cn, 3, 3, 1 For i = 0 to rs.fields.count - 1 'Each Fld in Rs.fields If rs.fields(i).name <> "id" Then Response.write getcgivalue(rs.fields(i).name) & "<BR>" rs(rs.fields(i).name) = getcgivalue(rs.fields(i).name) End if next rs.UpDate function getcgivalue(str) getcgivalue= Request.Form(str) 'POST if getcgivalue="" then getcgivalue= Request.QueryString(str) 'GET end function

  • エクセルからADOの参照設定

    エクセルからADOの参照設定をする時に 「Microsoft AxtiveX Data Objects X.X Library」 の2.7なのか2.8なのか6.0なのかどれにチェックを入れて良いかわからない場合って レジストリエディタのHKEY_CLASSES_ROOTのADODB.Connectionを見ればいいのでしょうか? ADODB.Connection ADODB.Connection6.0 がありますが、 これは参照設定の Microsoft AxtiveX Data Objects 6.0 Library にチェックを付けると言う意味でしょうか?

  • ADOでエクセルファイルの件数を取得したい

    エクセルvbaでadoを使って他ファイルの件数を取得することは可能でしょうか? もともと件数を取得したいファイルは共有フォルダに入っていて、 開くのにすごく時間がかかるのでADOで試みたいのです。 しかしうまくいきません。 当方の環境は Win7、エクセル2010です。 http://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_130_090.html を参考にしたのですが、 Const cnsProvider = "Microsoft.Jet.OLEDB.4.0" Const cnsExtProp = "Extended Properties" Const cnsExcel = "Excel 8.0" Const cnsDBName = "D:\Book1.xlsx" 'ローカルでテスト Sub ADO_WS_TEST1() Dim dbCon As ADODB.Connection Dim dbRes As ADODB.Recordset Dim GYO As Long, COL As Long Dim strSQL As String ' Connection生成 Set dbCon = New ADODB.Connection With dbCon .Provider = cnsProvider .Properties(cnsExtProp) = cnsExcel .Open cnsDBName End With の .Open cnsDBNameの部分で、 実行時エラー-2147467259 外部テーブルのフォーマットが正しくありません。 となります。 Excel 8.0が原因なのでしょうか? オフィス2010でもExcel 8.0でいいのでしょうか? ココがうまく通ったら、 "SELECT * FROM [Sheet1$]"の部分をCOUNTにして 件数が取得できるかなー と思うのです。 リンク先を読むと、adoでやってもあまり早くはならなそうですが一応やってみたいのです。 よろしくお願いします。

専門家に質問してみよう