dポイントプレゼントキャンペーン実施中!

昨日も
http://oshiete.coneco.net/qa8283354.html
で質問し、nicotinism様にご回答いただいたのですが
またわからなくなったので教えてください。

エクセルからアクセスでDAOで接続した時に、
フィルタをかけて該当のレコードの他のフィールドの値を返すにはどうすればいいでしょうか?

-------------------------
Sub test()
Dim ac As Object
Dim db As DAO.database
Dim DAOrs As DAO.Recordset

Set ac = CreateObject("Access.Application")
Set db = ac.DBEngine.OpenDatabase("PW.accdb", False, True, ";pwd=0000")
Set DAOrs = db.OpenRecordset("select * from TPW")

DAOrs.Filter = "サイト名 = " & "'nanaco'"

MsgBox DAOrs("Password")

DAOrs.Close: Set DAOrs = Nothing
db.Close: Set db = Nothing
ac.Quit: Set ac = Nothing
End Sub
-------------------------

これだとエラーにもならないけどフィルタがかかってない為、全然関係ないレコードの値を取得してしまいます。

再度ご回答いただければ助かります。
ご教授よろしくお願いします。

A 回答 (2件)

すみませんが前回の続きを少し。


確かにAccessからならパスワード付のアクセスに接続できました。
なのでそのときに出来た
cn.connectionString をExcelに持って行って試しましたが
『実行時エラー 3001
引数が間違った型、許容範囲外、または競合しています』
であえなく撃沈でした orz

http://www.connectionstrings.com/access-2010/
でも
『Note! Reports say
that a database encrypted using Access 2010 - 2013 default encryption scheme
does not work with this connection string.
In Access; try options and choose 2007 encryption method instead.
That should make it work. We do not know of any other solution.
Please get in touch if other solutions is available!』
ということなので諦めることにします。。。

私はレコードセットの Filter は遅いので実際に使用したことはありません。
WHERE 句 で指定しています。
Set DAOrs = db.OpenRecordset("select * from TPW WHERE サイト名 = 'nanaco'")
のように。

レコード数が少なければ運用上問題はなさそうなので、
Set DAOrs = db.OpenRecordset("select * from TPW")
DAOrs.Filter = "サイト名 = " & "'nanaco'"

Set DAOrs = db.OpenRecordset("TPW", dbOpenSnapshot)
DAOrs.Filter = "サイト名=" & "'nanaco'"
Set DAOrs = DAOrs.OpenRecordset() '開き直し
DAOrs.MoveLast '以下2行余計ですがレコード数を取得したいときに
MsgBox DAOrs.RecordCount
MsgBox DAOrs("Password")
のようになるかと。

ただ、ここまで書きながら、いまさら言うな!と怒られるかもですが、
良からぬ人がExcelのコードを見てAccessファイルのパスワードを知り悪用・・・
の心配はないですか。
Excel の VBAProjectの保護をクラックする方法がネット上に一杯あります。
Accessファイルを accdb → accde に変換して、
AccessでExcelに書き込むか、Excelで
sPWD=inputbox("パスワードは?")
Set db = ac.DBEngine.OpenDatabase("PW.accdb", False, True, ";pwd=" & sPWD)
のように平文のパスワードは書き込まない方が安全かもです。
    • good
    • 0
この回答へのお礼

何度もご回答ありがとうございます。

アクセス→アクセスを試していただいたのですね。
私は英語が全く読めないのですが、リンク先はそういう意味なのですか。

Filter が遅いことも知りませんでした。

>良からぬ人がExcelのコードを見てAccessファイルのパスワードを知り悪用・・・
の心配はないですか。

確かにその可能性もありますね。
考えてなかったです。

>Excel の VBAProjectの保護をクラックする方法

そのような方法があるのですか。
それも知りませんでした。

パスワードの管理にも気を付けます。

ありがとうございました。勉強になりました。

お礼日時:2013/09/29 12:42

DAO の Filter とか Sort は、ADO での動き、設定&適用っていう事はなく、


設定してから OpenRecordset して、新しく求める手順だったかと
以下、雰囲気

Dim DAOrs2 As DAO.Recordset

DAOrs.Filter = "サイト名 = " & "'nanaco'"
Set DAOrs2 = DAOrs.OpenRecordset()


※ DAOrs2 は使わずに、Set DAOrs = DAOrs.OpenRecordset() でも

※ OpenRecordset してから Filter するより、
 初めから "select * from TPW WHERE サイト名 = 'nanaco'"
 で求めた方が速かったかと思います。
 ただ、後に DAOrs を使う処理が控えているのであれば、そのままでも
    • good
    • 0
この回答へのお礼

なるほど!
フィルタせずにWHEREしちゃえばいいのですね!うまくできました。
ありがとうございます。

お礼日時:2013/09/29 12:30

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