プロが教えるわが家の防犯対策術!

Access97でグローバル変数を持ちたいと思ったのですが、
それらしきものが見つかりません。

Public変数というものがあるのですが、これはプロシージャ-単位で
しか定義できないようです。

ひとつのデータベース全体でグローバルに定義できる定数を持ちたいのです。
たとえば、データベース内で頻繁に読み込む必要があるファイルのPATH
"C:\Program Files\Netscape\Communicator\"を
固定で持っておきたい。

何か方法はないでしょうか?
よろしくお願いします。

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

A 回答 (2件)

もし、定数でいいのであれば、


標準モジュールに、

Const DATAPATH = "C:\Program Files\Netscape\Communicator\"

のように書けば、どこからでもDATAPATHと言う名前で参照することができます。

変数である必要があるのなら、同じく標準モジュールに、

Global glbDataPath as String

Public Sub PathSet()

glbDataPath = "C:\Program Files\Netscape\Communicator\"

Exit

と書いておき、AutoExecマクロのモジュールを開くでPathSetサブルーチンを呼び出せばよいと思います。

この回答への補足

すみません。基本的なことも分からずちょっと混乱しています。
プロシージャとモジュールの概念を間違っていましたので整理します。
aptivaさんのご指摘は、モジュール内で有効な手法なのでしょうか?
それとも、データベース全体(すべてのモジュール)から
参照可能なのでしょうか?

データベースの「モジュール」タブで新規にモジュールを作成しても
他のクラスモジュールから参照することができません。

基本的に標準モジュールの作成方法が間違っているような気もします!?
クラスモジュールはたくさん作成しているのですが、
標準モジュールは作ったことがありません。

基本的な質問で申し訳ありませんが、ご助言お願いします。

補足日時:2003/02/12 13:42
    • good
    • 1

aptivaさんからすでに回答が出ていますが、まだ補足がないようですので代わりに私が、



標準モジュールで定義してやれば、データベース全体から参照が可能です。

具体的には、

まず、モジュールタブで新規作成をクリックして、標準モジュールを開きます。

定数として定義するなら、標準モジュールのモジュール レベルで (宣言セクション:Option Explicitの次の行に)、
Public Const DataPath As String = "C:\Program Files\Netscape\Communicator\"
と記述してやれば、定数 DataPath が使えます。

変数として定義するなら、宣言セクションに
Public DataPath As String
と記述して、Public変数を定義してやり、

さらに、以下のような Functionプロシージャをつくり、
Public Function PathSet()
DataPath = "C:\Program Files\Netscape\Communicator\"
End Function

これを AutoExecマクロで実行(プロシージャの実行でプロシージャ名に PathSet() と記述、マクロ名を“AutoExec”とする。)してやれば、データベースを開く際に、変数にパスの内容が代入されます。

HELP で、Const ステートメント、Public ステートメント、AutoExec マクロ を確認してみてください。
    • good
    • 1
この回答へのお礼

具体的に分かりやすくご説明していただきありがとうございました。
しかし、まったく同じようにしてもできませんでした。
でも、お蔭様で解決しました。
単純に定数名(変数名)を既にクラスモジュールでpublic宣言して使用していた
ものを使ってしまっていただけでした。
お騒がせいたしました。
そして、ありがとうございました。

お礼日時:2003/02/13 09:42

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

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

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

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

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

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

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【ACCESS】フォーム名/コントロール名を文字列型変数で指定するには

バージョン:Access2002

フォーム「frm01」にテキストボックス「tb01」が作ってある場合、
Forms.frm01.tb01.Value="あいう"
とすれば、フォームもコントロールも指定できるのですが、
Dim strTxt As String
strTxt = "tb01"
Forms.frm01.strTxt.Value="あいう"
だと、文字列型変数"strTxt"が展開されないのでフォーム「frm01」のコントロール「strTxt」を探してしまいエラーになってしまいます。

文字列型変数でフォームやコントロールを指定するには、どのようにすればよいのでしょうか?

Aベストアンサー

フォームの場合
 Forms(strFrm)

フォームのコントロールの場合
 Forms(strFrm).Controls(strTxt)


これでも参照できますが、普通ここまで省略しませんね。
 Forms(strFrm)(strTxt)

あとで見たとき、訳がわからなくなりそう。

QAccess サブフォームでの選択行の取得

こんにちは。

Access初心者です。

サブフォームでテーブルの項目を表示させていますが、
選択された行を取得する方法はありますか?
サボフォームの下の方に現在選択されているレコード数が表示されてますが、その値でかまいません。

調べているのですが、なかなか検討がつきません。
宜しくお願い致します。

Aベストアンサー

フォーム名がフォーム1、サブフォームコントロールの名前がサブフォーム1だとすると、

Forms!フォーム1!サブフォーム1.Form.CurrentRecord

で取得できます。
(「Forms」と「Form」がありますのでご注意下さい)


また、フォーム1にコードを記述する場合であれば

Me!サブフォーム1.Form.CurrentRecord

サブフォーム1へのコード記述であれば

Me.CurrentRecord

という構文によっても、それぞれ取得が可能です。

QACCESSで空白のデーターをクエリで判定/識別する方法を教えてくださ

ACCESSで空白のデーターをクエリで判定/識別する方法を教えてください。
EXCELでは空白を""で判定/識別表していますがACCESSではどうなるのでしょうか。

下の例はフィールドに試験番号があればその番号を、空白なら”欠席”と表示しようとしています。
IIf(([試験番号]="空白の場合何を入れる?"),[試験番号],"欠席")

Aベストアンサー

もうひとつの書き方は
式1: IIf([試験番号] Is Not Null,[試験番号],"欠席")
第2、第3引数の、質問の順序にあわせるとこうなる。

Qカレントレコードが無い事を判定させる方法

SQLを使ってmdb内のレコードセットを取得し、
無かったらエラーを返す、という処理を作成
する場合、カレントレコードが無い事を
判定するにはどうすれば良いでしょうか?
イメージは下記のような感じです。

レコードセット as DAO.Recordset

'レコードセット取得
 Set レコードセット = db.OpenRecordset(作成したSQL文)

'判定
If カレントレコード無 Then
MsgBox "エラーメッセージ"
Exit Sub
End If

Aベストアンサー

カレントレコード無は"レコードセット.RecordCount = 0"
で行けませんか?

QAccess-VBAのPublic変数について =基本的な事です=

フォームAのテキストボックスに入力された値をフォームBで使用したいのですが、調べるとPublic変数に値を代入しておけばフォームAを閉じても値を保持できるとの事でした。
そこで、
(1) 標準モジュール(My_Moduleという名前)を作成しそこに1行Public Hensu as Long
と定義しました。

(2) フォームAにボタンを作成し、そのクリックイベントに、
Hensu=Text1.Value
というコードを記述しました。

(3) フォームBにボタンを作成し、そのクリックイベントに、
Text1.Value=Hensu
というコードを記述しました。

フォームBのボタンをクリックすると、Text1に値が代入されるかと思いましたが、意に反しHensuの中身はNullでした。

どのようにすればフォームBで変数の値を取得することが出来るのでしょうか?

ちなみにフォームAからPublic Hensuには値が代入されているようで、イミディトウインドウで?Hensuとするとちゃんと代入された値が表示されます。

フォームAのテキストボックスに入力された値をフォームBで使用したいのですが、調べるとPublic変数に値を代入しておけばフォームAを閉じても値を保持できるとの事でした。
そこで、
(1) 標準モジュール(My_Moduleという名前)を作成しそこに1行Public Hensu as Long
と定義しました。

(2) フォームAにボタンを作成し、そのクリックイベントに、
Hensu=Text1.Value
というコードを記述しました。

(3) フォームBにボタンを作成し、そのクリックイベントに、
Text1.Value=Hensu
というコードを記述しまし...続きを読む

Aベストアンサー

念のため確認しましたが、Option Explicitなしでも、
質問のソースの書き方で Public 変数を参照出来ました。

My_Module.Hensu とした方が確実みたいですが、
今回の不具合の原因では無さそうですね。

・フォームAにPublic変数を作成して解決
 フォームBのソースは正常だった?

・イミディトウインドウで?Hensuと入力しEnterを押すとNull
 Public変数でもなく、新規のローカル変数でもなく、
 何か別の変数を参照している?

謎が多いですね。(^^;


以下、Access2000での検証結果を書いておきます。

----My_Module----
Option Compare Database

Public Hensu As Long
----------------

----フォームA----
Option Compare Database

Private Sub コマンド0_Click()
 Hensu = 100
End Sub
-----------------

----フォームB----
Option Compare Database

Private Sub コマンド0_Click()
 MsgBox "Type: " & TypeName(Hensu) & " / Value: " & Hensu
End Sub
-----------------

フォームAでボタンをクリック後、
フォームBのボタンをクリックすると。

Type: Long / Value: 100

念のため確認しましたが、Option Explicitなしでも、
質問のソースの書き方で Public 変数を参照出来ました。

My_Module.Hensu とした方が確実みたいですが、
今回の不具合の原因では無さそうですね。

・フォームAにPublic変数を作成して解決
 フォームBのソースは正常だった?

・イミディトウインドウで?Hensuと入力しEnterを押すとNull
 Public変数でもなく、新規のローカル変数でもなく、
 何か別の変数を参照している?

謎が多いですね。(^^;


以下、Access2000での検証結果を書...続きを読む

Qフォームを開くときに、コンボボックスの値を選択(アクセスVBA)

こんにちは。
アクセスVBAで、フォームを開いたとき
(フォームのOpenイベント)に、
コンボボックスの値を選択したいのですが、
どういう方法が、あるでしょうか。

理想は、
フォームのOpenないし、Loadイベント内で、
コンボ0.ItemData(2).Selected
と、書くような感じです。
(無論、Selectedは使えませんでした)。

よろしくお願いします。

Aベストアンサー

これでいいのかな?
※テキスト書きなので検証していません

If コンボ0.ListCount > 0 Then
  コンボ0.Value = コンボ0.Column(0, 2)
End If

QAccessで、フォームからフォームへ値を引き継ぐやり方

フォームからフォームへ値を引き継ぐやり方を教えて下さい。

たとえば、フォームAのテキストボックスに対して取引先コードを入れるような場合に、
取引先検索専用画面(フォームB)で検索して、選択したレコードのデータをフォームAのテキストボックスに入れたいのです。

心優しい方、宜しくお願いいたします。

Aベストアンサー

フォームBにコマンドボタンなどを作成して
クリック時のイベントプロシージャに
forms![フォームA]![テキストボックス名]=me![選択した値のあるコントロール名]
を入れればとりあえず出来るでしょう。

Qアクセエスのレコードの更新をVBAでするには?

アクセスで、一覧表のフォームにボタンを取りつけています。レコードの内容を変更したら、ペンの形のマークが現れますね。これは変更中ということですが、そこでボタンを押しても変更は確定されないから、更新確定させたいのです。

それで、DoCmd.Requery を最初の行に入れてみたら、元の一覧表は最初のレコードに飛んでしまう。

元の一覧表の位置を動かさないために、Ctrl+Enter キーを押して更新確定させたような状態をVBAで実現する方法あるのでしょうか?

よろしくお願いします。

Aベストアンサー

No1 です。
今回の場合には
Docmd.RunCommand acCmdSaveRecord の方が良かったですね
文字通りレコードを保存します。
Requery に引きづられてしまいました (^_^;)

Recalc、Refresh、Requery の使い分けは下記が参考にはなりますか?
http://www.nurs.or.jp/~ppoy/access/access/acF007.html

Qサブフォームに対してGoToRecordするには?

フォームに対してRequeryすると先頭のレコードへ移動してしまうので
Requeryする前のレコードの番号を取得して
Requery後にそのレコード番号へ移動したいのですが

Sub test()
i = Forms("Form").Controls("SubForm").Form.CurrentRecord
Forms("Form").Controls("SubForm").Requery
DoCmd.GoToRecord acActiveDataObject, Forms("Form").Controls("SubForm"), acGoTo, i
End Sub

これをすると、実行時エラー2498
指定した式は、いずれかの引数とデータ型が対応していません。
になりますが、
どこがおかしいのでしょうか?

Aベストアンサー

【要旨】
サブフォームのレコード移動では、対象サブフォームは引数で指定するのではなく、
SetFocusメソッドで移動後、引数を省略したGotoRecordを使用します:
  Forms("Form").Controls("SubForm").SetFocus
  DoCmd.GotoRecord , , acGoto, i

但し、「Requery前後でのレコード移動の回避」が目的の場合は、Requeryの
対象を「親フォームまたはサブフォームのFormオブジェクト」ではなく「サブフォーム
コントロール」とすればOkです。
 <現状・例1>
  Forms("Form").SetFocus
  DoCmd.Requery
 <現状・例2>
  Forms("Form").Requery
 <現状・例3>
  Forms("Form").Controls("SubForm").Form.Requery
 <代替策>
  Forms("Form").Controls("SubForm").Requery
  ※「現状・例3」との違い(→途中の「.Form」の有無)に注意。


【詳細】
> 実行時エラー2498

このエラーの直接の原因は、GotoRecordメソッドの第2引数に指定している
「Forms("Form").Controls("Subform")」の部分です。

ここに指定するのはオブジェクト名になりますが、そのデータ型は文字列型です。
一方、「~.Controls(~)」の形で指定した場合、取得できるのは
 a)オブジェクトそのもの
 b)そのオブジェクトのデフォルトプロパティ
のどちらかです(→状況によって変化します)。
(例えばテキストボックスなら、TextBoxオブジェクトまたはValueプロパティの値)

サブフォームのデフォルトプロパティは調べていませんが(汗)、少なくとも文字列
型のプロパティではないため、「型が一致しない」とのエラーとなります。
サブフォームのコントロール名を取得する場合は、
  Forms("Form").Controls("SubForm").Name
というように、Nameプロパティを明示的に指定する必要があります。

ただ、「サブフォームのレコード移動」の場合、明示的に「Name」プロパティを
指定しても解決には至りません(汗)
これは、GotoRecordメソッドの第2引数には、直接開いているオブジェクトの
名前のみが有効なためで、サブフォームを直接的に指定することはできない、
ということです。
(注:Microsoftの資料を探したわけではなく、経験則から記述していますので、
 私の勘違いでしたらご容赦願います(汗))

サブフォームのレコード移動には、冒頭に記述したとおり、「フォーカスの移動」と
「一部の引数を省略したGotoRecord」を使用します:
  Forms("Form").Controls("SubForm").SetFocus
  DoCmd.GotoRecord , , acGoto, i

なお、これも冒頭に書きましたが、サブフォームのRequeryの仕方には幾つか
方法がありますが、Requeryの対象を「コントロールとしてのサブフォーム」にすれば、
レコード移動が発生しませんので、GotoRecord自体が不要になります。
http://www.f3.dion.ne.jp/~element/msaccess/AcTipsFrmHowToRequeryAndReturn.html

【要旨】
サブフォームのレコード移動では、対象サブフォームは引数で指定するのではなく、
SetFocusメソッドで移動後、引数を省略したGotoRecordを使用します:
  Forms("Form").Controls("SubForm").SetFocus
  DoCmd.GotoRecord , , acGoto, i

但し、「Requery前後でのレコード移動の回避」が目的の場合は、Requeryの
対象を「親フォームまたはサブフォームのFormオブジェクト」ではなく「サブフォーム
コントロール」とすればOkです。
 <現状・例1>
  Forms("Form").SetFocus
  DoCmd.Requery
 <現...続きを読む


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

人気Q&Aランキング