マンガでよめる痔のこと・薬のこと

office2003、XP SP3を使っています。

前までは,新規にmdbファイルを作成した時のVBEの参照設定は、
Microsoft ActiveX Data Objects 2.1 Libraryにチェックがついてなかったような気がしたのですが
今は
新規ブックを立ち上げて、参照設定を確認すると、
Microsoft ActiveX Data Objects 2.1 Libraryにチェックがついています。

Dim cn As New ADODB.Connection
cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source= " & CurrentProject.FullName
cn.Close: Set cn = Nothing

のコードを標準モジュールに張り付けて実行した時に、
問題なく作動します。

昔は、参照設定に
Microsoft ActiveX Data Objects 2.1 Libraryがデフォルトで
ついてなかったから、
http://www.happy2-island.com/access/gogo03/capte …
のようにチェックしないと、
「cn As New ADODB.Connection」の部分で、
”コンパイルエラーユーザー定義型は定義されていません。”
となっていたのですが、どういう事なのでしょうか?

自分が聞きたいことは
なぜ昔は新規にファイルを作った時に
Microsoft ActiveX Data Objects 2.1 Library
にチェックがついてなかったのに、
今はMicrosoft ActiveX Data Objects 2.1 Libraryにチェックが
つくようになったのか?という事です。

ウインドウズアップデートが原因なのでしょうか?

A 回答 (4件)

> マイクロソフトのページの


> Microsoft ActiveX データ オブジェクト 2.5 ライブラリへの参照 (Msado25.tlb)
> がADOですかね。

そうです。ActiveX Data Object の頭文字が ADO です。

ちなみに、DAO は Data Access Object の頭文字です。
    • good
    • 0
この回答へのお礼

ありがとうございました。

お礼日時:2012/10/23 23:30

> 「事前バインディング」について


つまりオブジェクト名を明示的に指定してコーディングされているならば、
昔から参照設定はついていたということになります。

つまりADODB.Connectionの型定義部分がそれにあたります。
参照設定していない場合はObject型でしか定義できませんし、
そこから新たにオブジェクトを作成する場合は
Set hoge = CreateObject("ADODB.Connection")
という記述が必ずどこかにあるはずです。
    • good
    • 0
この回答へのお礼

ありがとうございました。

お礼日時:2012/10/23 23:30

> なぜ昔は新規にファイルを作った時に


> Microsoft ActiveX Data Objects 2.1 Library
> にチェックがついてなかったのに、
> 今はMicrosoft ActiveX Data Objects 2.1 Libraryにチェックが
> つくようになったのか?という事です。

私の記憶では、新規作成時の参照設定の既定は、Access97 ではDAOのみチェックが付いていて、Access2000、2002 ではのADOのみチェック、Access2003から、両方にチェックがついてDAOが上にある、ということだったと思っています。

下記のMSのサポートページにも、既定で、DAO, ADOに参照設定されているとの記述があります。

Access 2003 でデータベースを操作する際に設定する必要があります参照
http://support.microsoft.com/kb/870962/ja

私の記憶違いかつMSのページの間違い、か、質問者さんの記憶違いのどちらかということになりますね。

Office2003 をアンインストールして、また、再インストールすれば確認できますが、そこまでして確認するほどの問題でもないと思いますので私はしませんが、気になるようでしたら確認してみてはどうでしょうか。
    • good
    • 0
この回答へのお礼

Access2003からは、DAOとADOの両方にデフォルトで参照設定が付いてるという事ですか。

マイクロソフトのページの
Microsoft ActiveX データ オブジェクト 2.5 ライブラリへの参照 (Msado25.tlb)
がADOですかね。

機会があれば、再インストールをして確認してみたいと思います。

お礼日時:2012/10/05 21:34

えっと、事前バインディングでプログラムがコードされていたのなら、


前から参照設定はついていたと思いますよ。

何かの拍子にファイルが変更されたのではないでしょうか?

大体プログラムを書く時、事前バインディングでコードしていき、
最後に参照設定を外して、実行時バインディングに変え、
事前バインディングしている部分をObjectに変換かけると
思います。

何を思ったか、
元々実行時バインディングだったが事前バインディングに書き換えた
もしくは
事前バインディングでプログラムを書いてた時のファイルを操作してた

のいずれかだと思いますけど。
    • good
    • 0
この回答へのお礼

「事前バインディング」について
ちょっとよくわからないので調べてみます。

お礼日時:2012/10/05 21:33

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

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

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

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

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

QAccess 2013 でADOがうまく使えません

Access 2013 でADOが使えません。

下記のように記載しています。

Dim DB as ADODB.Connection
Dim rs as ADODB.Recordset

Set DB = CurrentProject.Connection

Set rs = New ADODB.Recordset
rs.Open "xxxxxxx", DB, adOpenKeyset, adLockOptimistic

「参照設定」で
Microsoft ActiveX Data Objects Recordset 6.0 Library
にはチェックを入れています。

実行すると
最初の Dim DB as ADODB.Connection の部分で

コンパイルエラー
ユーザー定義型は定義されていません

と出てストップしてしまいます。
何が間違いなのでしょうか。

Aベストアンサー

> 「参照設定」で
> Microsoft ActiveX Data Objects Recordset 6.0 Library
> にはチェックを入れています。

2013 は使ったことがないので確かなことは言えませんが、
普通は
[Microsoft ActiveX Data Objects x.x Library]
を参照設定するのではないでしょうか?

QACCESS IIF関数 複数条件の設定について

 選択クエリにおいて、あるフィールド「 X」 のレコード数値が
 
  0<[X]<=50   であれば A 
  50<[X]<=100  であれば B 
  100<[X]<=150  であれば C

 と表記させるフィールド「Y」を追加したいと考えています。
 この場合、Yのフィールド設定で指定する数式についてご教授願います。

 一応、
  IIf(0<[X]<=50,"A","") Or IIf(50<[X]<=100,"B","") Or IIf(100<[X]<=150,"C","")

  としましたが、実行すると、Yの列がすべて「-1」と表記されてしまいます。

 何卒よろしくお願いいたします。

Aベストアンサー

a)IIF関数で対応する場合:
 IIF関数の第2引数または第3引数に、IIF関数を入れ子とする必要があります。

式: IIF([X]<=0, "", IIF([X]<=50, "A", IIF([X]<=100, "B", IIF([X]<=150, "C", ""))))


b)別の組込関数を使用する場合:
 IIF関数は二択ですので入れ子にする必要がありますが、Accessのクエリで
 使用できる、似た機能の関数に、Switch関数というものもあります。
 これであれば、入れ子にする必要がなくなります。
 (詳しくは、Accessのヘルプを参照下さい)

式: Switch([X]<=0, "", [X]<=50, "A", [X]<=100, "B", [X]<=150, "C", True, "")


なお、数学あるいは一般生活では確かに「0<[X]<=50」という表記をしますが、
Accessの関数などではこれだと正しい結果が得られません。
正しく認識させるためには、等号・不等号を挟んだ式は、「左辺」と「右辺」の
2つの要素からなる形にする必要があります。
(「0<[X]<=50」は「[X]>0 And [X]>=50」と分割してやる、と)

但し、今回のご質問のような『連続した範囲』であれば、前(左)で既出となる
式の要素で「[X]<=0」が「真(=-1)」とならなかった時点で、「[X]>0」が保証
されますので、上記のように、「[X]>0」を省略して「[X]<=50」だけを条件として
指定すればOk、ということになります。
(「0<[X]<=50」の次が「80<[X]<120」などのように、「50~80」が欠けた
 場合は、省略ができない、と)


【参考】
「0<[X]<=50」は、このままだと「0 < ([X]<=50)」という式と解釈されます。
この場合、「[X]<=50」は、「真(=-1)」か「偽(=0)」か「Null」のいずれかに
なります。
何にせよ、「0<[X]<=50」全体として「正(=-1)」となることがないため、
ご質問の式では、IIF関数は常に第3引数に指定された値「""」を返す
ことになります。

この結果、式全体としては「"" Or "" Or ""」という形となり、「0かNull」
以外なので、「真(=-1)」という値が返された、ということです。

なお、Nullについては、以前、他の方の質問につけた回答も、併せて参考までに:
http://oshiete.goo.ne.jp/qa/4850675.html

a)IIF関数で対応する場合:
 IIF関数の第2引数または第3引数に、IIF関数を入れ子とする必要があります。

式: IIF([X]<=0, "", IIF([X]<=50, "A", IIF([X]<=100, "B", IIF([X]<=150, "C", ""))))


b)別の組込関数を使用する場合:
 IIF関数は二択ですので入れ子にする必要がありますが、Accessのクエリで
 使用できる、似た機能の関数に、Switch関数というものもあります。
 これであれば、入れ子にする必要がなくなります。
 (詳しくは、Accessのヘルプを参照下さい)

式: Switch([X]<=0, "", [X]<=50, "A"...続きを読む

QDAOとADOの違いについて

Accessからイントラネット上のデータベースに接続するための接続方法で困っています。
DAOとADOの違いが分からず困っています。
メリット、デメリットが分かる方、どうか教えてください。

宜しくお願い致します。

Aベストアンサー

DAO(データアクセスオブジェクト)はAccessで使用されるMicrosoftJetデータベースエンジン を公開した最初のオブジェクト指向インターフェイスです。DAOは単一システムのアプリケーションや小規模でローカルなネットワークで使用するのに最も適しています。
とMSDNライブラリでは説明しています。
DAOはJetデータベースエンジンを対象にして開発されているのでJetのもつセキュリティ機能・データ定義機能などを十分に操作することができます。
ADO(ActiveXDataObjects)ではオブジェクトの種類が簡素化されているためJetデータベースエンジンの細かな機能を制御することができないといった点が不足している部分がありますがADOXやJROの各オブジェクトモデルで使用できる機能を使えばADOで不足している機能をほとんど補うことができます。
DAOはデータベースにAccessを使用するアプリケーションの場合、最大のパフォーマンスを得ることができます。しかしアプリケーションを運用していくうちに規模が大きくなってデータベースをSQLServerに移行することがあるかもしれません。
そのような可能性が含まれているのであれば最初からADOで開発しておいたほうが無難です。ADOはSQLServerに対する処理で良いパフォーマンスを得ることができます。

Jetデータベースエンジンを主なターゲットにしているならDAOで可。それ以外のデータベースを利用するのであればADOを選択する方が良いのではと思います。

DAO(データアクセスオブジェクト)はAccessで使用されるMicrosoftJetデータベースエンジン を公開した最初のオブジェクト指向インターフェイスです。DAOは単一システムのアプリケーションや小規模でローカルなネットワークで使用するのに最も適しています。
とMSDNライブラリでは説明しています。
DAOはJetデータベースエンジンを対象にして開発されているのでJetのもつセキュリティ機能・データ定義機能などを十分に操作することができます。
ADO(ActiveXDataObjects)ではオブジェクトの種類が簡素化されて...続きを読む

QアクセスVBAのMe!と[ ]

基本的なことですみません。

アクセスのイベントプロシージャで、Me!ってありますけど、これはどういう意味なんでしょうか?

また、Me!の後に、Me!.~~と書く場合と、Me!.[~~]と書く場合がありますが、どこが違うのでしょうか?

Aベストアンサー

>プロシージャ内で[]を使う場合は、そのフォーム外のオブジェクトを使う場合と考えてよろしいでしょうか?
別のオブジェクトを使う場合だけではありません。
Hensu = Me![Text1]のようにHensuという変数に自身のTest1の値を代入する場合のように。
[]で括られているのがオブジェクト名やコントロール名だよという事。
クエリの抽出条件に存在しない[?]とすれば?というコントロール等が参照できないので?というダイアログが表示されるように?というオブジェクトやコントロールは何?と聞いてくるように。
>フォーム内のオブジェクトの場合はあくまでMe!で良いのでしょうか
Forms.[フォーム名]![コントロール名]やForms![フォーム名]![コントロール名]が構文。
アクティブなフォームが自分自身ならForms![フォーム名]の変わりにMeでもOKですという事。

と言う解釈の方が良いと思います。

QAccessで別テーブルの値をフォームに表示したい

初めてのAccessで分からない事があり質問させてください。

<会社テーブル>
会社ID
会社名
住所

<社員テーブル>
会社ID
社員名
ソート番号

*1社に対し複数の社員レコードが存在

以上のようなテーブルがあるとします

現在「会社テーブル」を表形式で一覧表示しています
会社ID,会社名、住所とフィールドが並んでいるのですが、その後ろに「社員テーブル」のソート番号が一番若い社員名を表示したいと考えています(現状は番号関係なく表示させる方法すら分かりません)

色々いじくりまわしたのですが、初めてAccessをさわる事もあってよくわかりません

リレーション等でひっぱってくる事ができるのでしょうか?

どなたか教えて頂けませんでしょうか

何卒よろしくお願い致します

PS.Access2013で作成中です

Aベストアンサー

単純にテーブル[会社]のみでフォームを作成し、社員表示用テキストボックスを追加。そして、そのプロパティを表示し

コントロールソース=DBLookup("SELECT 社員名 FROM 社員 WHERE 会社ID=" & [会社ID] & " ORDER BY ソート番号")

これは、以下の標準モジュールに登録したユーザ関数 DBLookup()を使っています。これで、クエリを用意しなくても目的を達成できます。

さて、かかるユーザ関数を標準ライブラリに登録したくない場合、

1、"社員ソートクエリ"を作成します。

SELECT 社員.会社ID, 社員.社員名
FROM 社員
ORDER BY 社員.ソート番号;

2、コントロールソースに次のように書きます。

=DLookUp("社員名","社員ソートクエリ","会社ID=" & [会社ID])

http://office.microsoft.com/ja-jp/access-help/HA001228825.aspx

DLookup()については、マイクロソフトの解説を参照されてください。

【DLookup()の限界を破るにはVBAで同じ関数を作るしかない】

マイクロソフトの解説を読めば判りますが、ORDER BY 節を指定する引数が用意されていません。ですから、どうしても、"社員ソートクエリ"を作成するという手間が必要となります。そこで、SQL文を引数とするDBLookup()をVBAで書けば、その手間を省けるという算段になります。この辺りは、好みと趣味の問題。どっちでも良いと思います。そういうお断りをした上で DBLookup()を紹介しておきます。なお、ADOは、つぎのように参照設定しないと利用できません。

http://www.happy2-island.com/access/gogo03/capter00307.shtml

Public Function DBLookup(ByVal strQuerySQL As String, _
             Optional ByVal ReturnValue = Null) As Variant
On Error GoTo Err_DBLookup
  Dim DataValue
  Dim rst     As ADODB.Recordset

  Set rst = New ADODB.Recordset
  With rst
    .Open strQuerySQL, _
       CurrentProject.Connection, _
       adOpenStatic, _
       adLockReadOnly
    If Not .BOF Then
      .MoveFirst
      DataValue = .Fields(0)
    End If
  End With
Exit_DBLookup:
On Error Resume Next
  rst.Close
  Set rst = Nothing
  DBLookup = IIf(Len(DataValue & ""), DataValue, ReturnValue)
  Exit Function
Err_DBLookup:
  MsgBox "SELECT 文の実行時にエラーが発生しました。(DBLookup)" & Chr$(13) & Chr$(13) & _
      "・Err.Description=" & Err.Description & Chr$(13) & _
      "・SQL Text=" & strQuerySQL, _
      vbExclamation, " 関数エラーメッセージ"
  Resume Exit_DBLookup
End Function

単純にテーブル[会社]のみでフォームを作成し、社員表示用テキストボックスを追加。そして、そのプロパティを表示し

コントロールソース=DBLookup("SELECT 社員名 FROM 社員 WHERE 会社ID=" & [会社ID] & " ORDER BY ソート番号")

これは、以下の標準モジュールに登録したユーザ関数 DBLookup()を使っています。これで、クエリを用意しなくても目的を達成できます。

さて、かかるユーザ関数を標準ライブラリに登録したくない場合、

1、"社員ソートクエリ"を作成します。

SELECT 社員.会社ID, 社員.社員名
FR...続きを読む

QAccessのRefresh・Requery・Repaintの違い

Requeryはもう一度ソースレコード(テーブル)を読み込むようです。このとき、テーブルの先頭レコードに移動してしまいます。
Refreshは最新のレコード(テーブル)を再表示するような気がします。レコードの移動は起こらない気がします。
Repaintは、VBAでキャプションなどを変更したとき使っています。
でも、よくわかっていません。
どんなときにどんなメソッドを使えばいいのでしょうか?
詳しい方、よろしくお願いいたします。

Aベストアンサー

たびたびすみません。
調べてたらこんなのがでてきました。
http://www.nurs.or.jp/~ppoy/access/access/acF007.html

参考URL:http://www.nurs.or.jp/~ppoy/access/access/acF007.html

Qコンパイルエラー:ユーザ定義型は定義されていません、と出るのですがどのライブラリファイルかわかりません。

VB6で以前誰かが作ったプログラムの修正をしているのですが、コンパイルができません。

コンパイルエラー:ユーザ定義型は定義されていません。と表示されてしまします。

参照設定のライブラリファイルにチェックを入れればいいと思うのですが、どのライブラリファイルにチェックを入れればいいのかわかりません。
どなたか教えていただけないでしょうか?

現在チェックが入れてあるのは
Visual Basic For Applications
Microsoft Access 10.0 Object Library
OLE Automation
Microsoft Visual Basic for Applications Extensibility5.3
Microsoft DAO3.6 Object Library
の五つです。

ソースは以下のとおりです。

-------------------------------------------
Private Sub timTimer_Timer()
Dim objCmpct As PharmitCompact

timTimer.Enabled = False

Set objCmpct = New PharmitCompact
objCmpct.DatabaseFolder = App.path & "\Database"
objCmpct.DBCompactType = phrCmpTypeAll
objCmpct.Exec
Set objCmpct = Nothing

Unload Me

End Sub
---------------------------------------------
上のソースで
objCmpct As PharmitCompact
の部分の色がエラーで変化します。

原因が違っていたらごめんなさい。
どうぞよろしくお願い致します。

VB6で以前誰かが作ったプログラムの修正をしているのですが、コンパイルができません。

コンパイルエラー:ユーザ定義型は定義されていません。と表示されてしまします。

参照設定のライブラリファイルにチェックを入れればいいと思うのですが、どのライブラリファイルにチェックを入れればいいのかわかりません。
どなたか教えていただけないでしょうか?

現在チェックが入れてあるのは
Visual Basic For Applications
Microsoft Access 10.0 Object Library
OLE Automation
Microsoft Visual Basi...続きを読む

Aベストアンサー

#1です。


PharmitCompact型のクラスまたは構造体が、どこにあるかは
わかりませんが、どこかにコードがあるようですね。

Q抽出条件でデータ型が一致しません。のエラーメッセージが出る

フォームで入力された値を、
次のファイルでクエリを読み込むときに代入するASPを作成しましたが、実行しようとすると、
「データ型が一致しません。」のエラーメッセージが出ます。
DBはACCESSを使用しています。ACCESSの対象テーブルで、
データ型を「テキスト型」にすると問題ないのですが、
「数値型」にすると、「データ型が一致しません」の
エラーメッセージになります。
フォームでは、プルダウンで「数値」を選択するようになっています。
宜しくお願いします。

Aベストアンサー

Where区に指定した条件のフィールドが数値なら『'』でくくる必要がありません

Set rs = db.Execute("SELECT テーブル3.* FROM テーブル3 WHERE (テーブル3.番号)=" & bangou)
といった具合に修正してみましょう

『'』でくくる必要があるのは対象のフィールドが文字列の場合です

Q実行時エラー -2147217900 ADODBでレコードセットオープン時エラー

お世話になります!
AccessVBAで実行時エラーが出ます。

SQLステートメントが正しくありません。 DELETE INSERT PROCEDURE SELECT または UPDATEを使用してください。

と表示されます。

Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset 'URLマスタ
'接続
Set cn = Application.CurrentProject.Connection
Set rs = New ADODB.Recordset

'レコードセットを取得

rs.Open "URLマスタ", cn ・・・・・・・・・・・・・ここでエラー

つい先日までエラーが出ませんでした。
久しぶりにすると、私のPCではエラーが出ます。
他のPCでは出ません。

Windows7
Access2016 Office solo
を使用しています。
よろしくお願い申し上げます。

お世話になります!
AccessVBAで実行時エラーが出ます。

SQLステートメントが正しくありません。 DELETE INSERT PROCEDURE SELECT または UPDATEを使用してください。

と表示されます。

Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset 'URLマスタ
'接続
Set cn = Application.CurrentProject.Connection
Set rs = New ADODB.Recordset

'レコードセットを取得

rs.Open "URLマスタ", cn ・・・・・・・・・・・・・ここでエラー

つい先日...続きを読む

Aベストアンサー

No.1 です。

> rs.Open "URLマスタ", cn , adCmdTable
> こうでしょうか?

これでは 3番目の引数ですね。 (^^;)

rs.Open "URLマスタ", cn , , , adCmdTable

これは
rs.Open "URLマスタ", cn ,adOpenForwardOnly ,adLockReadOnly , adCmdTable
と同等です。

良く使うメソッドでも、一応ヘルプで確認することをお勧めします。
https://msdn.microsoft.com/ja-jp/library/cc364218.aspx

QSub ***( ) と Private Sub ***( ) の違い

初歩的な質問で申し訳ありませんが・・・

自分でコードを書いていても、イベントが発生したりした時の処理で、コードのウィンドウで上のドロップダウンリストで選択できる時の処理などは自動的に[Private Sub Command1_Click( )]などと出てくるのでそのまま使っています。自分で別途プロシージャーを作成する時は[Sub ****( )]としています。
ですがその違いを理解しないまま、自分で作成する時は[Private Sub]ではなくて[Sub]を使っています。

Sub ***( ) と Private Sub ***( ) の違いは何なんでしょうか?
どなたか説明頂けませんか?
よろしくお願いします。

Aベストアンサー

「Sub」の部分にカーソルを置いて[F1]を押せばヘルプが起動します。
「指定項目」のところに「Public」と「Private」の説明がありますよ。
省略して「Sub hogehoge()」とした場合は「Public」とみなされます。

Publicは「すべてのモジュールから呼び出せるプロシージャ」ということになります。
Privateとすると「同じモジュールの中からしか呼び出せないプロシージャ」となります。

もしExcelをお持ちでしたらExcelのVBEで標準モジュールを追加し、「Sub Test1()」と「Private Sub Test2()」を作成してみてください。
そしてExcelの[ツール]-[マクロ]-[マクロ(Alt+F8)]でマクロ実行のダイアログを表示させてみるとわかります。
ここには実行できるプロシージャの一覧が表示されますが、Test1は表示されているけれどTest2は表示されません。
Test1はPublicで、Test2はPrivateだからです。


人気Q&Aランキング