出産前後の痔にはご注意!

ADOを使いエクセルファイルを更新モードでオープンしたいのですが、このエクセルファイルにパスワード(例:読み込み用:aaa、書き込み用:bbb)が設定されていたら、どのように記述すれば良いですか。
パスワードが設定されていない場合は、下記の記述でうまくいきます。
ご存知の方がいらっしゃいましたら、よろしくお願い致します。

'ADOオブジェクトを作成
Set objADO = CreateObject("ADODB.Connection")
'更新モードでオープン
objADO.Open "Driver={Microsoft Excel Driver (*.xls)};" & "DBQ=" & SavePath & ";" & "ReadOnly=0"

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

A 回答 (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

この回答への補足

Excel.Applicationを使ってやってみたのですが、ブラウザが制御不能になってしまい、うまくいきませんでした。引数の記述の仕方を調べたのですが、はっきりしたことがわからず、試行錯誤してみましたが、だめでした。

結局、最終的には、パスワードを設定したエクセルファイルを扱わないで済むよう、仕様を変更したため、この問題については、解決しないままになってしまいました。せっかくご回答をいただいたのに、すみませんでした。

補足日時:2008/11/18 19:26
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/08/25 15:21

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

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

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

QExcelからパスワード付きAccess

現在 パスワードが設定されたAccessファイル(accdb形式)のデータをExcelに取り込むプログラムを作成しています.
接続時のプログラムは以下のように記述しました.

Dim cn As New ADODB.Connection
Dim cnStr As String, dbDir As String, Pswd As String

dbDir = "c:\test\test.accdb"
Pswd = "pass"
cnStr = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=" & dbDir & ";" & _
"Jet OLEDB:Database Password=" & Pswd & ";"
cn.Open cnStr

上記でexcel2003及び2007からaccdbに接続したところ問題なくデータ取得できました.
excel2010で上記プログラムを実行すると
「パスワードが正しくありません」
と表示され,データが取得できません.

このような場合,どうすれば解決出来るでしょうか?

現在 パスワードが設定されたAccessファイル(accdb形式)のデータをExcelに取り込むプログラムを作成しています.
接続時のプログラムは以下のように記述しました.

Dim cn As New ADODB.Connection
Dim cnStr As String, dbDir As String, Pswd As String

dbDir = "c:\test\test.accdb"
Pswd = "pass"
cnStr = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=" & dbDir & ";" & _
"Jet OLEDB:Database Password=" & Pswd & ";"
cn.Open cnStr

上記でexcel200...続きを読む

Aベストアンサー

Access Excel ともに2010で試しました。
パスワード・・のエラー発生。
ググリまくると
http://www.access-programmers.co.uk/forums/showthread.php?t=220521
Franz Haidacher さんによれば
Access2010 から採用された既定の暗号化方法(高度なセキュリティ)は
ADO OLEDB では接続できないようです。

Accessのオプションのクライアントの設定から
以前の暗号化方法を使用するに変更したうえでパスワードを設定するしか
現在のところ方法がなさそうです。
(-"-)
DAOなら・・・と試しましたが同じく orz

QExcelブックの保護パスワード判定方法

VB6.0で、Excelブックが保護パスワードされているかどうかの
判定を行いたいです。
以下のようにHasPasswordプロパティを使用してみたのですが、
保護パスワード付きのExcelブックでテストしてみると
Workbooks.Openの部分で処理が止まってしまい、先にすすみません。
基本的にやり方が間違えているんでしょうか?
お分かりになる方がいらっしゃいましたら、教えてください。
よろしくお願いします。

  Dim xlApp  As Excel.Application
  Dim xlBook  As Excel.Workbook

  Set xlApp = CreateObject("Excel.Application")
  Set xlBook = xlApp.Workbooks.Open("C\:TEST.xls")
If xlBook.HasPassword Then
Msgbox("保護パスワードあり")
Else
Msgbox("保護パスワードなし")
End If
  Set xlSheet = Nothing
  xlBook.Close
  Set xlBook = Nothing
  xlApp.Quit
  Set xlApp = Nothing

VB6.0で、Excelブックが保護パスワードされているかどうかの
判定を行いたいです。
以下のようにHasPasswordプロパティを使用してみたのですが、
保護パスワード付きのExcelブックでテストしてみると
Workbooks.Openの部分で処理が止まってしまい、先にすすみません。
基本的にやり方が間違えているんでしょうか?
お分かりになる方がいらっしゃいましたら、教えてください。
よろしくお願いします。

  Dim xlApp  As Excel.Application
  Dim xlBook  As Excel.Workbook

  Set xlApp = Crea...続きを読む

Aベストアンサー

以下のよいうにして見ましょう

Set xlApp = CreateObject("Excel.Application")
Set xlBook = nothing
On Error Resume Next
Set xlBook = xlApp.Workbooks.Open("C\:TEST.xls", PassWord:="")
if err.Number <>0 then
  if err.Number = 1004 then
    MsgBox("保護パスワードあり")
  else
    MsgBox( Err.Description )
  end if
else
  MsgBox("保護パスワードなし")
  xlBook.Close
end if
on error goto 0
xlApp.Quit
set xlApp = Nothing
set xlBook = Nothing
といった具合です

Q[Excel]ADODBでNull変換されてしまう

お世話になります。
今、Office2003で次のようなマクロを作成しています。
マクロが保存されているブックM、
参照するデータが保存されているブックD、
出力先のブックOがあり、
ブックMにてADODBをつかって、ブックDからSQLによる条件でブックOへ出力します。

このとき、ブックDのセルではちゃんとデータがセットさせているのに
出力したブックOでは空になってしまうという現象が発生して困っています。

デバッグ等して確認してみたところ、
書式が標準のセルで、文字列型の数値(文字列型のセルから値コピーした場所)が入っていると
RecordSetにとれた段階でNullに変換されてしまてしまっているように見えました。

この問題を解決するために何かよい方法はありますでしょうか?

ソースコードの詳細は確認できないのですが
こんな感じだったと思います。
※ rs.Requeryにて、rsの中身を確認した時点でNullだったので QueryTablesによる取り込みは関係ないと考えています。

Set conn = CreateObject("ADODB.Connection")
conn.Open ConnectString

Set sql = CreateObject("ADODB.Command")
sql.CommandType = 1
sql.ActiveConnection = conn
sql.CommandText = SQL文(? とUNION含む)
sql(0) = パラメータ設定
...

Set rs = CreateObject("ADODB.RecordSet")
Set rs = sql.Execute
With Sheet1.QueryTables.Add(rs, "A1")
.AdjustColumnWidth = False
.FieldNames = True
.BackgroundQuery = False
.Refresh False
.Delete
End With
...

お世話になります。
今、Office2003で次のようなマクロを作成しています。
マクロが保存されているブックM、
参照するデータが保存されているブックD、
出力先のブックOがあり、
ブックMにてADODBをつかって、ブックDからSQLによる条件でブックOへ出力します。

このとき、ブックDのセルではちゃんとデータがセットさせているのに
出力したブックOでは空になってしまうという現象が発生して困っています。

デバッグ等して確認してみたところ、
書式が標準のセルで、文字列型の数値(文字列型のセルから値コピーし...続きを読む

Aベストアンサー

度々失礼。
http://support.microsoft.com/kb/194124/ja
全てが強制的に文字列に変わるようですが

With conn
  .Provider = "Microsoft.Jet.OLEDB.4.0"
  .Properties("Extended Properties").Value = "Excel 8.0;IMEX=1" '■
  .Properties("Data Source") = "c:\temp\data.xls"
  .Open
End With
..『オプション IMEX=1;』を追加する方法でもいいかもしれません。

さっきのSub try()のQueryTableオブジェクトだけで使う場合はConnectionを以下に変更です。

wkCON = "OLEDB;" & _
    "Provider=Microsoft.Jet.OLEDB.4.0;" & _
    "Data Source=C:\temp\data.xls;" & _
    "Extended Properties=""Excel 8.0;IMEX=1;"""

度々失礼。
http://support.microsoft.com/kb/194124/ja
全てが強制的に文字列に変わるようですが

With conn
  .Provider = "Microsoft.Jet.OLEDB.4.0"
  .Properties("Extended Properties").Value = "Excel 8.0;IMEX=1" '■
  .Properties("Data Source") = "c:\temp\data.xls"
  .Open
End With
..『オプション IMEX=1;』を追加する方法でもいいかもしれません。

さっきのSub try()のQueryTableオブジェクトだけで使う場合はConnectionを以下に変更です。

wkCON = "OLEDB;" & _
    "Provider=Mi...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング