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

AC2000/WIN2000です。
以下のようなカスタム関数を使って、クエリーで順位を振っているんですが、
変数JUNをリセットしていないので、処理を行う毎に数字が増えていってしまいます。カスタム関数の変数をリセットするにはどうすれば良いんですか?


Global MAEBUKA, REN, JUN'(順位) As Integer
Option Compare Database

Function G_RENBAN(BUKA As Integer) As Integer

If MAEBUKA = BUKA Then
G_RENBAN = JUN
Else
G_RENBAN = JUN + 1
JUN = JUN + 1
End If

MAEBUKA = BUKA
End Function

A 回答 (4件)

JUN変数はGlobalで使用するように宣言されているためG_RENBAN関数が終了してもその値を保持します。

もし、G_RENBAN関数以外で使用する予定が無いのであればG_RENBAN関数内で宣言すればG_RENBAN関数の呼び出しのたびに初期化されます。またこの変数を他の場所で使用するのであれば、G_RENBAN関数内でJUN変数を使用する前に
JUN = 初期化したい値
とすればG_RENBAN関数を呼出す毎に初期化されます。

この回答への補足

tksoftさん、ご返事有り難うございました。
ただ、以下のようにやってみましたが、今度は順位の数字が増えて行かなくなってしまったのですが・・・。

Global MAEBUKA, REN, JUN As Integer
Option Compare Database

Function G_RENBAN(BUKA As Integer) As Integer

JUN = 1

If MAEBUKA = BUKA Then
G_RENBAN = JUN
Else
G_RENBAN = JUN + 1
JUN = JUN + 1
End If

MAEBUKA = BUKA
End Function

補足日時:2003/01/30 16:52
    • good
    • 0

すみません、どうやら私が問題をよく分かっていなかったようです。



今回は、関数G_RENBANを使用して何かの順位をつけていて、途中まではうまく順位が着いているが、何処かの時点で順位をリセットしたい・・・という風に解釈しました。

もし、このような場合であれば、変数をリセットするプロシージャを作成し、変数をリセットしたいタイミングで呼び出せばよいかと思います。

Sub ResetParam()
JUN = 1
End Sub

また、大きな勘違いをしているようであればご指摘ください。

この回答への補足

私の理解力不足のために何度もすいません。
どのタイミングで初期値に戻せばいいのかが分からないのですが。。。

補足日時:2003/01/30 17:26
    • good
    • 0

もし宜しければ、G_RENBAN関数の具体的な使用例を教えていただけませんでしょうか。

この回答への補足

tksoftさん、ご返事有り難うございました。
遅くなりまして、すいません。

クエリーで以下のように使っています。

SELECT G_RENBAN([回数]) AS 式1, 受講回数カウントダウン3.順位, 受講回数カウントダウン3.回数, 受講回数カウントダウン3.社員番号, 受講回数カウントダウン3.氏名漢字
FROM 受講回数カウントダウン3;

宜しくお願いします。

補足日時:2003/01/31 08:45
    • good
    • 0

分かりました!!


すみません、とんでもない勘違いをしていたようです。

まず、変数をリセットするタイミングですが、クエリーを開く直前がよろしいかと思います。

<<方法其の壱>>(推奨する方法)
クエリーをどのように開いているのかで多少やり方は変わりますが、データベースウインドウでクエリー名を直接ダブルクリックしていると仮定すれば、以下の方法が最も簡単だと思います。

(1)まず変数をリセットする関数(以下参照)をモジュールに作成して下さい。G_RENBAN関数と同じシートでいいです。

Function ResetParam()
MAEBUKA = 1
REN = 1
JUN = 1
End Function

(2)「マクロ」を新規作成
(3)1行目のアクションに「プロシージャの実行」を指定し、プロシージャ名に「=ResetParam()」とします。
(4)2行目のアクションに「クエリーを開く」を指定し、開きたいクエリーの名前を指定しておきます。
(5)作成したら、適当な名前をつけて保存

これで、クエリーを開く代わりに、このマクロを実行すれば常にご希望の結果が得られると思います。

注意
・G_RENBAN関数は質問で書いたものを使用してください。
・ResetParamは変数を全て1で初期化していますが、適当に好きな値で初期化してください

<<方法其の弐>>
・・・とここまで書いてなんですが、#1でも書きましたがJUN変数他はGlobalで使用するようになっているため、クエリーの実行直前に初期化する方法を書きました(安全のため)。もし、G_RENBAN関数がクエリーの実行時にしか使用しないのであればこのGlobal変数をLocal変数にするともっと簡単です(以下参照)。この場合はマクロなんてめんどくさいものを使用せず、単にG_RENBAN関数の修正だけで大丈夫です。


Global MAEBUKA, REN, JUN'(順位) As Integer  ←ここを削除
Option Compare Database

Function G_RENBAN(BUKA As Integer) As Integer
Dim MAEBUKA As Integer, REN As Integer, JUN As Integer ←追加
If MAEBUKA = BUKA Then
G_RENBAN = JUN
Else
G_RENBAN = JUN + 1
JUN = JUN + 1
End If

MAEBUKA = BUKA
End Function

恐らく、これでお望みの結果が得られると思います。もし違っていたら・・・もう一度補足してみて下さい。また、ひょっとするとクエリーを開くのはフォームからボタンを押して開いているかもしれません、この場合も基本的な考え方(変数初期化のタイミングはクエリーを開く直前)は同じですので頑張ってください。
    • good
    • 0
この回答へのお礼

ご返事有り難うございました。
お陰様で出来ました。
本当に有り難うございました。

お礼日時:2003/02/03 13:00

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