「式に未定義関数'○○'があります」というメッセージが出てしまい、クエリを実行できません。


Accessのオブジェクト「レポート」で作成されたドキュメントを、印刷してみたのですが。
印刷した資料のどの値が、どのデータベースから引っ張ってきた情報か、わからなかったので。

VBAのコードの方を閲覧し、SQLらしきものがズラズラと書かれている箇所を見つけたので、それを抜き出して、Accessのクエリデザイン機能でSQLだけ実行して、その値を見ようとしました。
元のVBAは、下記URLの内容になります。
https://gist.github.com/AuroraNorthernQuarter/af84ae5bce50ebc36d246a905b8851ce

そして、クエリデザイン→作成にてSQLビューの画面を開いて貼り付け、実行しようとしたSQLは、以下になります。

---------------------------
select sum(売上高) from リアルタイム情報
where 集計日 = format(datei, "yyyymmdd")
and 決済区分 = treatdivision
and 水族館ID = funds1
and 都道府県ID = funds2
and 集計区分 = luckyitem(nT)
group by 集計日,決済区分,水族館ID,都道府県ID,集計区分
---------------------------

回答の条件
  • 1人20回まで
  • 登録:
  • 終了:2020/07/31 13:41:42
id:moon-fondu

そして「実行」を、押してみますと。

「式に未定義関数'luckyitem'があります。」というメッセージが、出てきてしまいまして。

SQLが取得している値を確認することができないのです…。

googleで原因を探ってみました。
いくつかのサイトで紹介されていた方法、例えば https://3bitcom.jp/page/seminar_blog/0003.htm 等のサイトで紹介されたいたのですが。

VBEを起動して[ツール]メニューから[参照設定]を確認し、[参照設定] ダイアログボックスに[参照不可:○○○・・・] という項目があれば、そのチェックボックスを外す、というものです。

しかし…参照設定をクリックして一覧を見ても、どこにも「参照不可…」という文言が入った選択肢がないため。

この方法ではエラーを解除することが、できない状況です。

どうすればこのエラーを回避し、SQLを実行して資料に記載された数値の取得元のテーブルを辿ることができるようになるのか…他に何か手がありましたら、お力添えいただけますと幸いです。

よろしくお願い致します。

ベストアンサー

id:ken3memo No.1

回答回数291ベストアンサー獲得回数100

ポイント1300pt

SQLに渡しているのって
変数名ではなく、
変数の中身なのでは?

---------------------------
select sum(売上高) from リアルタイム情報
where 集計日 = format(datei, "yyyymmdd")
and 決済区分 = treatdivision
and 水族館ID = funds1
and 都道府県ID = funds2
and 集計区分 = luckyitem(nT)
group by 集計日,決済区分,水族館ID,都道府県ID,集計区分
---------------------------

>and 集計区分 = luckyitem(nT)
ではなく
and 集計区分 = XXXXXXX

luckyitem(nT)中身の値をSQLに渡しているのでは?

f:id:ken3memo:20200731015403j:image
f:id:ken3memo:20200731015412j:image

↑SQL文の作成時に、変数名ではなく、値を作っている思います。

なので、クエリーのSQLビルダーで
and 集計区分 = luckyitem(nT)
とすると、エラーになるだけでは?

id:moon-fondu

ken3memoさんの言う通りでした!
値でした…luckyitem(nT)の値は、コードのようなもので、その値に対応した項目名が一覧になっているテーブルがありました。

luckyitem(nT)が「3」でしたら、「3」に該当する項目名でソートされて、その項目名に関連する情報のみを表示するSQLのようです。

ありがとうございましたm(__)m

2020/07/31 13:41:01

その他の回答0件)

id:ken3memo No.1

回答回数291ベストアンサー獲得回数100ここでベストアンサー

ポイント1300pt

SQLに渡しているのって
変数名ではなく、
変数の中身なのでは?

---------------------------
select sum(売上高) from リアルタイム情報
where 集計日 = format(datei, "yyyymmdd")
and 決済区分 = treatdivision
and 水族館ID = funds1
and 都道府県ID = funds2
and 集計区分 = luckyitem(nT)
group by 集計日,決済区分,水族館ID,都道府県ID,集計区分
---------------------------

>and 集計区分 = luckyitem(nT)
ではなく
and 集計区分 = XXXXXXX

luckyitem(nT)中身の値をSQLに渡しているのでは?

f:id:ken3memo:20200731015403j:image
f:id:ken3memo:20200731015412j:image

↑SQL文の作成時に、変数名ではなく、値を作っている思います。

なので、クエリーのSQLビルダーで
and 集計区分 = luckyitem(nT)
とすると、エラーになるだけでは?

id:moon-fondu

ken3memoさんの言う通りでした!
値でした…luckyitem(nT)の値は、コードのようなもので、その値に対応した項目名が一覧になっているテーブルがありました。

luckyitem(nT)が「3」でしたら、「3」に該当する項目名でソートされて、その項目名に関連する情報のみを表示するSQLのようです。

ありがとうございましたm(__)m

2020/07/31 13:41:01
  • id:ken3memo
    ソースの
    14: Private luckyitem() as Integer
    ↑の中身が書かれていないので、何とも言えませんが、

    レポートからだと
    Private luckyitem()
    プライベート関数のラッキーアイテムが幸運で参照できるけど、
    不運にも外側のクエリーからだと
    Private luckyitemが見えないので
    (プライベートな関数なので外側から参照できない、
     幸運・不運は関係なく、、、←書いてて面白くなかったので、このへんで)


    >「式に未定義関数'luckyitem'があります。」
    は、クエリーからレポート内の回数が見えていないだけなのでは?

    VBA Private関数 Public関数 違い
    などで、検索してみると良いのでは?

    解決策としては、
    ※luckyitem()の中身を見ていないので単純にできるかわかりませんが、

    Private luckyitem()をコピーして
    標準モジュールに(どこから(クエリーから)でもアクセスしたいので)
    Public Function luckyitem()


    End Function
    を作成してみては?

    あれ、、
    ここまで、書いてて、気が付く不運な私・・・
    14: Private luckyitem() as Integer

    ↑値を返す関数だと思っていたけど、
    Function
    が無くてもいいのか?※省略可能だったっけ?

    http://officetanaka.net/excel/vba/statement/Function.htm

    プログラムの動作に運・不運は関係ないか・・・
    回答に自信が無いので、コメント欄で失礼します。

    良い回答が付くことを願いつつ、失礼します。
  • id:ken3memo
    SQLの
    and 集計区分 = luckyitem(nT)
    ここで、
    luckyitem(nT)
    luckyitemにnTを渡していますが、
    nTって下記のSQLの中にありますか?

    ---------------------------
    select sum(売上高) from リアルタイム情報
    where 集計日 = format(datei, "yyyymmdd")
    and 決済区分 = treatdivision
    and 水族館ID = funds1
    and 都道府県ID = funds2
    and 集計区分 = luckyitem(nT)
    group by 集計日,決済区分,水族館ID,都道府県ID,集計区分
    ---------------------------

    ↑ntの値をうまく処理しないと、動かないかなぁ。。。
    ※リアルタイム情報のフィールドにnTがあるのか?無いのか・・・
  • id:ken3memo
    luckyitemは、配列でしたね・・・・

    luckyitem(0) = animal_e
    luckyitem(1) = animal_f
    luckyitem(2) = animal_g
    luckyitem(3) = animal_h
    luckyitem(4) = animal_i

    関数は、忘れて
    Private luckyitem

    Public luckyitem()で、外部からでも
    luckyitem(0) = animal_e
    luckyitem(1) = animal_f
    luckyitem(2) = animal_g
    luckyitem(3) = animal_h
    luckyitem(4) = animal_i
    などを処理して
    クエリーからSQLでよばないと、ダメだったのかな。

    コメント欄で混乱させて、すみませんでした。

    不運な回答者に初回、当たってしまったと思って、
    コメントは忘れてください。

    質問者様に良き回答者様に巡り合う幸運が訪れることを願いつつ、失礼します。


  • id:moon-fondu
    ken3memoさんありがとうございます!
    混乱なんてとんでもないです。色々ヒントをいただき、ありがとうございます。

    関数名もネタにしていただきまして(^^;

    しかしすみません、私の質問の仕方が不十分でした。

    「Private luckyitem() as Integer」はそうですね。もう1度確認しましたら、やはり「function」等の記述は見受けられませんでした。

    luckyitem関数の中身につきましては、luckyitemも、luckyitem(nT)も、何を処理しているのか…nTの値は「リアルタイム情報」テーブルには見受けられなかったです。しかしnTとは違いますが「集計区分」列は「リアルタイム情報」テーブルにありましたので、「tSql = tSql & " and 集計区分 = " & luckyitem(nT)」という式からしますと。
    ntは「集計区分」列の値になるために利用されている?のかもしれません。

    luckyitemについて記述が不十分でしたが、if文で条件分岐させて、SQLの一部にされている箇所は、同じモジュール内にありました。

    ----------------------
    For nT = LBound(luckyitem) To UBound(luckyitem)
    i_tSql = i_tSql & luckyitem(nT) & ","

    If luckyitem(nT) = animal_g Then
    tSql = ""
    tSql = "select 研究名称 from 研究用テーブル"
    tSql = tSql & "where 研究区分コード = " & luckyitem(nT)
    ElseIf luckyitem(nT) = animal_i then
    tSql = ""
    tSql = "select 施設名略称 from 施設名テーブル"
    tSql = tSql & " where 施設コードA = " & animal_i2
    tSql = tSql & " and 施設コードB = 1"
    Else
    tSql = ""
    tSql = "select 施設名略称 from 施設名テーブル"
    tSql = tSql & " where 施設コードA = " & animal_d
    tSql = tSql & " and 施設コードB = " & luckyitem(nT)
    End If
    Set aquarium.EOF Then
    If aquarium.EOF Then
    call showmsg()
    exit function
    End If
    i_tSql = i_tSql & "'" & Trim(aquarium.Fields(0).Value) & "',"
    Set aquarium = Nothing
    ----------------------

    また、お気づきになられた点がありましたら、ぜひ回答欄にお願いします。

    あとすみません。「クエリーからSQLでよぶ」というのは、Access上のどのような操作のことでしょうか?
    もし気が向きましたら、お手隙の時によろしくお願い致しますm(__)m

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません