カスタム関数の変数をリセットする方法

このQ&Aのポイント
  • カスタム関数を使用して順位を振る際、変数JUNをリセットしないため、処理の度に数字が増え続けてしまいます。変数をリセットする方法について解説します。
  • カスタム関数で使用している変数JUNをリセットしたいと考えています。変数をリセットするための方法についてお伝えください。
  • カスタム関数で利用している変数JUNをリセットする方法を教えてください。変数をリセットしないと、処理を行うたびに数字が増え続けてしまいます。
回答を見る
  • ベストアンサー

カスタム関数の変数をリセットしたい

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

  • niiza
  • お礼率43% (211/486)

質問者が選んだベストアンサー

  • ベストアンサー
  • tksoft
  • ベストアンサー率36% (99/273)
回答No.4

分かりました!! すみません、とんでもない勘違いをしていたようです。 まず、変数をリセットするタイミングですが、クエリーを開く直前がよろしいかと思います。 <<方法其の壱>>(推奨する方法) クエリーをどのように開いているのかで多少やり方は変わりますが、データベースウインドウでクエリー名を直接ダブルクリックしていると仮定すれば、以下の方法が最も簡単だと思います。 (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 恐らく、これでお望みの結果が得られると思います。もし違っていたら・・・もう一度補足してみて下さい。また、ひょっとするとクエリーを開くのはフォームからボタンを押して開いているかもしれません、この場合も基本的な考え方(変数初期化のタイミングはクエリーを開く直前)は同じですので頑張ってください。

niiza
質問者

お礼

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

その他の回答 (3)

  • tksoft
  • ベストアンサー率36% (99/273)
回答No.3

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

niiza
質問者

補足

tksoftさん、ご返事有り難うございました。 遅くなりまして、すいません。 クエリーで以下のように使っています。 SELECT G_RENBAN([回数]) AS 式1, 受講回数カウントダウン3.順位, 受講回数カウントダウン3.回数, 受講回数カウントダウン3.社員番号, 受講回数カウントダウン3.氏名漢字 FROM 受講回数カウントダウン3; 宜しくお願いします。

  • tksoft
  • ベストアンサー率36% (99/273)
回答No.2

すみません、どうやら私が問題をよく分かっていなかったようです。 今回は、関数G_RENBANを使用して何かの順位をつけていて、途中まではうまく順位が着いているが、何処かの時点で順位をリセットしたい・・・という風に解釈しました。 もし、このような場合であれば、変数をリセットするプロシージャを作成し、変数をリセットしたいタイミングで呼び出せばよいかと思います。 Sub ResetParam() JUN = 1 End Sub また、大きな勘違いをしているようであればご指摘ください。

niiza
質問者

補足

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

  • tksoft
  • ベストアンサー率36% (99/273)
回答No.1

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

niiza
質問者

補足

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

関連するQ&A

  • 全ての変数を一気にリセットする方法はありますか?

    全ての変数を一気にリセットする方法はありますか? Sub test() Dim i As Integer Dim int1 As Integer Dim int2 As Integer int1 = 1 int2 = 2 For i = 1 To 100 'プロシージャー int1 = 0 'リセット int2 = 0 'リセット Next End Sub みたいなコードがあり、 ループが終わる度に変数をリセットしたい場合 int1 = 0 'リセット int2 = 0 'リセット のように一つ一つ変数に値を入れてリセットするしかないですか? 例のコードは二つしか変数が有りますが 実際100個くらいの変数が有る場合も、 一個一個リセットするしかないのでしょうか? 理想としては、VBAを中断したら全ての変数がリセットされますが それと同じようなコードが有れば、楽だなと思います。

  • 関数の引数に複数のユーザ定義型変数を使いたい

    一つの関数の一つのパラメータが異なるユーザ定義型を受けられるようにしたいのですが、どのようにすればいいのでしょうか? Public Type TypeA strCodeA As String intNumA As Integer End Type Public Type TypeB strCodeB As String intNumB As Integer End Type Public Function funcTest(arg1 As Variant) As Integer (略) End Function と記述して関数を Dim datA As TypeA iResult = funcTest(datA) と呼び出そうとすると、次のようなエラーメッセージが表示されて進みません。 コンパイルエラー: パブリックオブジェクトモジュールで定義されたユーザー定義型に限り、変数に割り当てることができ、実行時バインディングの関数に渡すことができます。

  • VBの関数の戻り値

    初歩的なことですみません 受け渡し変数が1つの場合はわかりました 受け渡し変数が複数の場合どうするか、知りたいのです グローバル変数にすればできるのでしょうが 関数々々の入/出力関係がはっきりすると思いまして 例でもうしますと Function MyKansuu() as Integer ' ' MyKansuu = Kekka1 End Function これで Kekka1,Kekka2と複数ある場合です Integerのみなら、配列を使うことも考えられますが StringとIntegerがあったりすると、どうでしょう やはりこの場合、グローバル変数でしょうか

  • VBでコンパイル エラー 変数が必要です

    すみません、教えてください イミージエイトウインドウから myttを実行すると 「変数が必要です」のエラーがでます 教えてください Public Type myType Pos As Integer xx As Integer yy As Integer find As Integer '-1あり 0なし End Type Function mytt() Dim myzz As myType myzz.Pos = 45 mySerch (myzz) '←ここでエラー End Function Function mySerch(ww As myType) As myType ww.find = -1 End Function

  • VisualBasic2010 関数の呼び出し

    VisualBasic2010を利用してシステム開発を行っているのですが、 特定の条件に従いFUNCTIONを呼び出したいと考えております。 呼び出すFUNCTIONが多数存在するため、FUNCTION名を変数で 保持しておき、呼出し時にその変数を利用して呼び出せないかと 思案しております。  ★呼出し側 Dim wk as integer   wk = TEST_A()   wk = TEST_B()  ※上記の「TEST_A()」「TEST_B()」を変数を利用して   wk = HENSU()のように呼び出せないかと考えております。 Private Function TEST_A() As Integer Return 0 End Function Private Function TEST_B() As Integer Return 1 End Function 分る方がいらっしゃいましたらご教授頂けますと幸いです。

  • EXCELユーザー関数でISERRORを使うには?

    皆様、いつもお世話になっています。 0で除算すると、エラーになるのですが、それを回避するユーザー関数を作ろうと思っています。 下記のように作ったのですが、#VALUE!と、表示され、上手くエラーを回避出来ていません。 どのように、改良したら良いか教えて下さい。 Function DD(A As Integer, B As Integer) Dim RT As Range RT = A / B If Application.WorksheetFunction.IsError(RT) Then DD = "" Else DD = RT End If End Function

  • ExcelVBA Static変数の初期化

    Static変数はファイルを一旦終了しないと0にリセットできないのでしょうか? 出来ないとすればStatic変数に代わりそういうことができる方法はありますか?(セルに番号を代入するのは無しで) Sub 番号てすと() Static g As Integer MsgBox "今のG= " & g g = g + 1 MsgBox "次のG= " & g End Sub

  • 複数シートにわたる連番を自動作成するfunctio

    複数シートにわたる連番を自動作成するfunction関数をoffice 365のEXCELで作りました。 variant型で定義しており、連番途中に右側のセルが空白だった場合、対象セルを空白にし、上のセルが空白だった場合は、数字が出てくるセルまで上に行き+1します。 左端のシート以外の最上のセルは左のシートの最大の数字+1に設定しています。 Function renban1() As Variant Dim temp As Integer, a_row As Long, a_col As Long Dim range1 As Range, ind As Integer Const a_spc = " " ind = ActiveSheet.Index a_row = ActiveCell.Row a_col = ActiveCell.Column renban1 = a_spc Set range1 = Range(Cells(a_row, a_col + 1), Cells(a_row, a_col + 7)) If a_col = 2 And a_row = 5 Then renban1 = 1 Exit Function End If If a_row = 12 And a_col = 2 Then If ind = 1 Then renban1 = 2 Exit Function Else If WorksheetFunction.CountA(range1) = 0 Then '右が空白 renban1 = a_spc Exit Function Else For temp = 80 To 12 Step -2 If ActiveSheet.Previous.Cells(temp, a_col).Value <> a_spc Then '上が空白以外≒数値 renban1 = ActiveSheet.Previous.Cells(temp, a_col).Value + 1 Exit Function End If Next temp End If End If End If If a_row > 10 And a_row < 82 Then '番号のセル範囲 If WorksheetFunction.CountA(range1) = 0 Then '右が空白 renban1 = a_spc Exit Function Else For temp = a_row - 2 To 12 Step -2 If Cells(temp, a_col).Value <> a_spc Then '上が空白以外≒数値 renban1 = Cells(temp, a_col).Value + 1 Exit Function End If Next temp End If End If End Function これで、動作自体は正しいのですが、いちいちセルをクリックしてENTERを押さないと正しく更新されません。(トリガーが無いので当然と言えなくもないのですが) 1シートに35行ほどあり、同様のシートが11枚あるので、出来れば自動で更新させたいのですが、calculateやapplication.volatileを試してもうまくいきませんでした。 VBAにお詳しい方、どうやれば良いか教えて下さい。よろしくお願い致します。

  • Access クエリで変数を参照するとき

    モジュールのPublic変数をクエリから参照するとき、 Public Function getdata() As Integer getdata = 1 End Function と記述しておけき、 クエリの抽出条件をgetdata()にしておくと クエリの抽出条件に 「1」 と書いたのと同じになりますが、 クエリの抽出条件の欄に「1 Or 2 Or 3」とした時と同じ状況を作りだしたい時、 モジュールの方には Public Function getdata() As Integer  getdata = 1 Or 2 Or 3 End Function 「・・・・Integer」ではマズイわけで、なんと記述したらよいか教えて下さい。

  • OpenOffice Basicで引数を2つ利用する関数が作れません

    OpenOffice Basicで引数を2つ利用する関数が作れません Open Office Calc 3.1.1を使っています。 できれば複数(3つ以上)引数を取る関数を作りたいのですが、 2つ引数を取ろうとすると演算結果が#NAME?になってしまいます。 切り分けにシンプルな関数を作ってみました。 以下で=test2(3,5)とすると結果が#NAME?になります。 Function test2(arg1 As Integer, arg2 As Integer) as Integer test2 = 3 + arg2 End Function #なお、関数内の演算内容はtest2 = arg1 + arg2でも変わらず#NAME?です 切り分けで以下を作ると=test3(3)で6が返されます Function test3(arg1 As Integer) as Integer test3 = 3 + arg1 End Function 関数名のタイプミスの可能性を排除するために、 test2関数を名前を換えずに引数の数を1つに変更してみると 計算できるのでタイプミスではないと思います。 やはり引数を複数とる取り方に問題があるように見えます。 お手数ですが何かアドバイスいただけないでしょうか?

専門家に質問してみよう