Access2000のVBAで初歩的な質問があります。

「tblShi」というテーブルがあります。
フォームにボタン「btn1」を作り、
デザインビューでボタンのプロパティを開いて
イベントのクリック時のところで、
「ビルダの選択」をコードビルダにしました。

そして「Private Sub btn1_Click()」の中に、最初に
  Dim db As Database
という記述をしています。

このフォームを開いてボタンを押すと、なぜか
  コンパイルエラー
  ユーザ定義型は定義されていません
というエラーが表示されてしまいます。

たしかにコードを書いているときに、
  Dim db As
のところまで入れると、小さいウィンドウの中に
たくさん候補が表されますが、
その中に「Database」というのがないです。
「QueryDef」とか「Workspace」とかもありませんでした。
(「Recordset」はありまして、それはコンパイルが通ります)

いろいろな解説を見ても、やはり最初はどれも
「Database」型を宣言しているようなんですが…

何がよくないのでしょうか。
もしわかる方がいらっしゃったら教えてください。

A 回答 (3件)

御疲れ様です



多分、参照設定がされていないだけだと思われます。
参照設定の方法は、VisualBasicEditorにて、
メニューバー→「ツール」→「参照設定」

参照するものは、「Microsoft DAO Library *.*」
または、「Microsoft ADOX *.*」
のどちらかを参照します。
(確認してないですが...)

使用する目的によってどちらを参照するか決めましょう。
また、宣言するときもきちんと宣言するのも心がけましょう。
[例]Dim DB As DAO.Database

参考になれば...
    • good
    • 0
この回答へのお礼

ありがとうございます。

まったくその通りでした。
DAOのライブラリのようなものを読込んでいないのが
原因だろうというのは想像ついていたんですが、
設定がこんなところにあったんですね。
VBAもVBも経験がなかったので、知りませんでした。
ソースの中で何か宣言するのかな?と思ってました。

お礼日時:2002/03/15 09:52

以前DAOの解説に使った一例です。


ご希望に沿うかわかりませんが、よろしかったら・・・どうぞ!

AccessVBAでTblの件数を取得すると↓
1.Mainフォームにテキストボックスを1つ作って下さい。名前は「txt1」
2.デザインフォームのプロパティのイベントで「開く時」の右にある
「...」3点リーダーをクリックし、コードビルダを選択します。
3.コードビルダが開いたら ツール→参照設定→Microsoft DAO 3.6
Object Libraryにチェックを付けて下さい。
下記の点線の部分を↓にカット&ペースト


Private Sub Form_Open(Cancel As Integer)
●●●←ここにカット&ペースト
End Sub

'---------------------------↓
Dim db1 As Database '変数宣言
Dim rs1 As Recordset
Dim aCnt As Integer

'総件数の取得
aCnt = 0
Set db1 = CurrentDb
Set rs1 = db1.OpenRecordset("T_全件")
If rs1.EOF Then '1件も存在しない場合はエラー
Msgbox("T_全件テーブルに該当データは存在しません。")
Exit Sub
End If
rs1.MoveLast
aCnt = rs1.RecordCount
Me.txt1.Value = aCnt  'テーブルの合計値をTxt1に表示する。
rs1.Close
db1.Close
    • good
    • 0
この回答へのお礼

ありがとうございます。

VBAは初めてなので、手探り状態なのです。
とても参考になりました。
また困ったら質問するかもしれませんので、
よろしくお願いします。

お礼日時:2002/03/15 10:03

DAOの参照設定が、されていますでしょうか?



モジュールウィンドウを開いて、ツール→参照設定で、
Microsoft DAO 3.6 Object Library がチェックされていないようでしたら、チェックしてみください。

今、Access2000が手元にないので自信がありませんが、Recordsetは ADO でも使えるようですが、Database はDAO のオブジェクトかと思います。
    • good
    • 0
この回答へのお礼

ありがとうございます。

どうやらそのようですね。
Recordsetは両方にあるみたいです。
参照設定の優先順位の関係で、「Recordset」だけで宣言すると
DAOの方を見てくれてなかったりしました。

Dim db As Database
Dim rs As Recordset
Set db = CurrentDB
Set rs = db.OpenRecordset(ほにゃらら)

としたら、型がちがうとやらのエラーになりました。
最初の方がおっしゃったとおり、
「DAO.Database」「DAO.Recordset」と
記述するように心がけるべきみたいです。

お礼日時:2002/03/15 09:59

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

関連するカテゴリからQ&Aを探す

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

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

QDB2で SQL1032N start database managerエラー

はじめまして。初めて書き込みさせていただきます。
WebSphereでDB2をデータベースとして行っているのですけど、今日起動してDB2にconnectしようと思ったら

COM.ibm.db2.jdbc.DB2Exception: [IBM][CLI Driver] SQL1032N start database manager コマンドが発行されていません。 SQLSTATE=57019

というエラーメッセージが出てきてconnectできなくなってしまいました。どなたか改善方法知っている方いらっしゃいましたら教えてください。よろしくお願いします。

Aベストアンサー

こんにちは。業務でDB2を使用しているものです。(でもまだ素人)

表示されたエラーは、インスタンスが開始されていない、という内容です。DB2は、インスタンスという単位を作成し、その中にデータベースを作成しています。そのため、インスタンスが開始されていない場合、その中にあるデータベースにCONNECTすることができなくなります。インスタンスを開始すれば、無事にデータベースに接続できるはずです。

DB2サーバーのOSは何でしょうか?UNIXであれば、OSのコマンド・プロンプト上から、Windowsであれば、DB2のコマンド・プロンプト(コマンド・ウィンドウ)上から、db2startというコマンドを実行することで、DB2を開始することができます。

もし、それ以外のOSを使用されているようであれば、手元に資料がないのですが、調べることも可能だと思いますので、補足にてお教えください。また、これでも解決しない場合も、補足にてご連絡くだされば、もう少しお答えできるかもしれません。

QアクセスフォームAのIDボタンをクリックするとテキスト1の内容をフォームXのテキスト7にコピーする

こんにちは、たびたびお世話になります。

すみませんいつも質問ばかりで申し訳ありません。
どうぞよろしくお願いいたします。

出荷DBと、在庫DBがあります。
出荷DB(帳票フォーム)から在庫DB(データシート)を開き、
在庫DBの在庫IDをクリックすると、
その在庫IDの製品NOを
出荷DBの出荷製品NOにコピーしたいのです。

そのようなことって多分できると聞いたのですが、

どうにやればいいのかさっぱり分からず
お助けいただきたくお願いいたします。

Aベストアンサー

Private Sub 在庫ID_Click()
Forms!出荷DB!出荷製品NO = Forms!在庫DB!在庫ID
End Sub

' これでいけると思います。

QAS/400のDBについて

現在オフコンで基幹業務管理しております。

得意先のマスタの項目を何項目か追加するよう情報システム部に依頼を出したところ
フィールドの桁数の制限を既にオーバーしている為、これ以上追加するわけにはいかない???、との回答であっさり却下されてしまいました。意味が不明な為、よく追求すると、マスタ全体に桁数制限があり、現状その限界まで来ているとの事でした。オフコンの世界は良く分からないのですが、その追加する項目だけ別なテーブルに分けて対応することは不可能なのでしょうか?

Aベストアンサー

#2です。
>プログラムの分だけ変更が必要になるということですか?
プログラムの変更をしなくても、物理ファイル又は論理ファイルが
変更されたときはコンパイルという作業を行わないとプログラムが
エラーとなり動きません。
>あたらしいテーブルを作成するということですか?
オープン系でいうテーブルAS/400では物理ファイルといいますが
キーとなる項目(ここでは得意先CD)と追加したい項目だけ別の
物理ファイルを作成し、プログラム内でその項目を見に行くときは
得意先マスタではなく、新しいファイルを見に行くようにすることで
得意先マスタを変更するよりも楽に項目の追加の様なことはできます。
>後のメンテナンスとはどういったことですか?
後でプログラムの変更などがあった場合など、プログラムの仕様を
調べる必要があるときに、意味も無く行き当たりばったりのファイルを
多く使用していると、見づらく、理解するのに時間がかかり、
余計な時間をとられてしまいます。
※AS/400ではファイルの読み書きのタイミングが結構
難しいためファイル数が多いとそのときの状況をイメージするのに
苦労します。

#2です。
>プログラムの分だけ変更が必要になるということですか?
プログラムの変更をしなくても、物理ファイル又は論理ファイルが
変更されたときはコンパイルという作業を行わないとプログラムが
エラーとなり動きません。
>あたらしいテーブルを作成するということですか?
オープン系でいうテーブルAS/400では物理ファイルといいますが
キーとなる項目(ここでは得意先CD)と追加したい項目だけ別の
物理ファイルを作成し、プログラム内でその項目を見に行くときは
得意先マスタではなく...続きを読む

QAS400にてサブファイルレコードの再定義

現在RPGをはじめて3ヶ月程度のものです。

全体の流れ:
1.品目マスタを「作成日、注文番号、納期、品目番号」の順番で読み取る。
2.1をサブファイルレコードとして一覧表示する。
3.2の際に選択項目を設け、修正レコードを選択できるようにしてある。
4.選択項目を指定して実行すると修正画面に移動する。
5.修正項目は納期と納品数のみで、それ以外は表示のみを指定。
5.修正して実行すると、品目マスタが修正されて一覧の画面に戻る。
6.戻ってきた後の一覧画面は修正したレコードは修正した内容を表示して、
  修正していないレコードはそのままにする。

という流れです。

上司のアドバイスではCHAINを使って、
再度品目マスタをユニークキーで読み取って、
修正した内容のみを読み取ればよいといいますが、
いまいちやり方が分かりません。

ただイメージとしては、
サブファイルを表示する際にS1という件数を表示する為の仮のフィールド?があり、
それをS1SEQNというサブファイル上のレコード件数を表示するフィールドとして使っています。
(Z-ADD S1 S1SEQN という具合です。)

で、品目マスタ内のフィールドとしてE1SEQNというのがあります。
ですので、最初に順次アクセスする際に
(Z-ADD S1 S1SEQN )の以外にも
(Z-ADD S1 E1SEQN )を使って(現在はしていない)、UPDAT 品目マスタを行っておいて、

修正画面から戻ってきてから、S1SEQNと品目マスタ内のE1SEQNを引っ掛ければいけるのかと思っています。

ところがCHAINを使った場合の、このやり方がさっぱり分かりません。

もしかすると私のイメージ自体が間違っている可能性は凄く高いのですが、
どなたかアドバイスの程お願いします。

現在RPGをはじめて3ヶ月程度のものです。

全体の流れ:
1.品目マスタを「作成日、注文番号、納期、品目番号」の順番で読み取る。
2.1をサブファイルレコードとして一覧表示する。
3.2の際に選択項目を設け、修正レコードを選択できるようにしてある。
4.選択項目を指定して実行すると修正画面に移動する。
5.修正項目は納期と納品数のみで、それ以外は表示のみを指定。
5.修正して実行すると、品目マスタが修正されて一覧の画面に戻る。
6.戻ってきた後の一覧画面は修正したレコードは...続きを読む

Aベストアンサー

かななか回答が付かないですね^^;

私は画面系は苦手なのでAS/400系の掲示板などのサイトをご紹介します。(全て日本語のページです)
教えてgooはAS関係の技術者が少ないのか質問も回答も少ないです。AS/400会議室で聞けば一発で答えて貰えると思いますよ。

【AS/400会議室】
http://www7.big.or.jp/~pinball/discus/as400/index.html

【AS-400 Tips&Techniques】
http://www.as400-net.com/

【HRM】
http://hrm.fixa.jp/

【くっすんの最強リンク集】
http://kusuda777.web.infoseek.co.jp/links/59.htm
http://kusuda777.web.infoseek.co.jp/links/61.htm

ご検討をお祈り申し上げます。

QDBの定義のサイズを大きくし過ぎると問題ある?

データベースとしては基本的な話になると思いますが、ご返答よろしくお願いいたします。

例えば日本人の名前はどう考えてもせいぜい漢字10文字で収まるため、名前を入力するためのDB定義は、nvarchar(20)などと少し大きめに設定すると思います。私もこれまでは当たり前のようにそうしてきました。

しかし、nvarchar型の最大サイズは4000なので、全ての項目でnvarchar(4000)としてしまえばいいような気がするのですが……誰もしてないところを見るとやはり何か問題があるのでしょうか?それはどんな問題なのでしょうか?

Aベストアンサー

SQL Serverの話ですよね?

> ntextの代わりにnvarchar(4000)を使う
そういうことでしたらそうしてください。
ただし、インデックスに使わないのであればnvarchar(max)の方がよいでしょう。

http://technet.microsoft.com/ja-jp/library/ms187993.aspx
> ntext 、text、および image の各データ型は、将来のバージョンの Microsoft SQL Server で削除される予定です。
 (中略)
> 代わりに、nvarchar(max)、varchar(max)、varbinary(max) を使用してください。


で、本題の「nvarcharを使うときはとりあえずnvarchar(4000)でいいんじゃないか?」という話ですが、
1列または1レコードのサイズが大きすぎるとこんな落とし穴があるようです。
クエリ関連
http://msdn.microsoft.com/ja-jp/library/ms345371%28v=sql.105%29.aspx

キー・インデックス関連
http://technet.microsoft.com/ja-jp/library/ms163207%28v=sql.105%29.aspx
http://technet.microsoft.com/ja-jp/library/ms143432.aspx

このあたりのことも理解した上でサイズを決めた方が良さそうです。

SQL Serverの話ですよね?

> ntextの代わりにnvarchar(4000)を使う
そういうことでしたらそうしてください。
ただし、インデックスに使わないのであればnvarchar(max)の方がよいでしょう。

http://technet.microsoft.com/ja-jp/library/ms187993.aspx
> ntext 、text、および image の各データ型は、将来のバージョンの Microsoft SQL Server で削除される予定です。
 (中略)
> 代わりに、nvarchar(max)、varchar(max)、varbinary(max) を使用してください。


で、本題の「nvarcharを使うときはとりあえずnvar...続きを読む


人気Q&Aランキング

おすすめ情報