自作関数でIF文はできないのか?

このQ&Aのポイント
  • 質問者は、AccessのクエリでIIf関数を使用しているが、同じ処理をVBAの関数で記述しようとしている。
  • 質問者は標準モジュールにIF文という関数を作成し、クエリで呼び出したが、関数式が文字列として表示されるだけで、結果が表示されない。
  • 質問者はVBAでSQL文の一部を記述することは可能かどうかを尋ねている。
回答を見る
  • ベストアンサー

自作関数でIF文はできないのか?

SELECT テーブル1.ID, IIf([テーブル1]![ID]=1,"1です","1ではない") AS 1かどうか FROM テーブル1; というクエリ1を作成しました。 「IIf([テーブル1]![ID]=1,"1です","1ではない")」の部分を vbaのFunctionプロシージャーで記述したいのですがうまくできないです。 標準モジュールに Public Function IF文() IF文 = "IIf([テーブル1]![ID]=1,""1です"",""1ではない"")" End Function を作成し、 クエリ1のSQL文を SELECT テーブル1.ID, IF文() AS 1かどうか FROM テーブル1; としたら 「1かどうか」フィールドには関数式の結果ではなく、 関数式が文字列として表示されました。 (添付参照) 訳あって、 SQL文の一部をvbaで記載したいのですが上記のようなことは不可能でしょうか? ご教授よろしくお願い致します。

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

  • ベストアンサー
  • nag0720
  • ベストアンサー率58% (1093/1860)
回答No.1

>関数式が文字列として表示されました。 関数式を返すFunctionにしているからです。 関数式ではなく、評価結果を返すようにしてください。 Public Function IF文(ID As Variant) As String IF文 = IIf(ID = 1, "1です", "1ではない") End Function 使い方は、 SELECT テーブル1.ID, IF文(テーブル1.ID) AS 1かどうか FROM テーブル1;

quygquygqu
質問者

お礼

なるほど!うまくできました。 有難うございます。

関連するQ&A

  • T-SQLとACCESSクエリのSELECT分内のif文の利用について

    お世話になります。 ACCESSクエリからSQLServer2005のストアドに移行を検討中です。 ACCESSクエリではINSERT INTO時のSELECT内にIIF文による条件分岐が使えたのですが、T-SQLでは、INSERT INTO時のSELECT内にIF文やswitch文は使えないのでしょうか?その場合、どのようにすれば宜しいでしょうか? 例> ACCESSクエリでは以下のようにかけると思うのですが・・・ INSERT INTO Table1 (Pコード,単価) SELECT Table2.Pコード,IIf(Table2.Check定価=1,Table2.定価A*Table3.値引率,Table2.定価B*Table3.値引率) FROM Table2 RIGHT JOIN Table3 ON Table2.Pコード = Table3.Pコード; 宜しくお願いします。

  • SELECT文でLEFT関数を使うと未定義関数ですと言われる

    VBソース上では SELECT LEFT(~~~,4) AS 項目 FROM テーブル と SELECT文で書いてもエラーにならずオープンできるみたいなのですが そのSQL文をACCESS2000上で動かすと 未定義関数LEFTがあると言われます どなたか分かる方至急お願いします!!!

  • IF関数ではなくIIF関数を使うのでしょうか?

    なぜアクセスのクエリでIF関数を使う時は エクセルのようにIF関数ではなくIIF関数を使うのでしょうか? アクセスのクエリで条件分岐をしたいときはIIFを使っています。

  • if()文が上手くいかない。パート2

    $sql= 'SELECT a.id,a.name,a.ji,a.pass,b.id,b.name,b.day,b.st,b.sh,b.tday,b.tt,b.th,b.go FROM t AS a, ti AS b WHERE a.id=b.id group by a.id ORDER BY b.day DESC'; $res = mysql_query($sql); $sql2 = 'SELECT * FROM ti'; $res2 = mysql_query($sql2); while($row = mysql_fetch_array($res)){ $st = $row['st']; } while($row2 = mysql_fetch_array($res2)){ if(!$st==""){ echo $row2['name'].'<br>出勤<br>'; }else{ echo $row2['name']; } } 改善点御教授下さい。お願いします。 参考:http://okwave.jp/qa/q7424432.html

    • 締切済み
    • PHP
  • IIF文が使えない?

    Access97にODBC接続して以下のSQL文を投げます。 MySql="select iif(code=1,"普通","特殊") as codename from テーブル" 通常ちゃんと「普通」か「特殊」の値が返ってくるのですが、WindowsXPのある環境下ではNULLが返ってくるのです。 どうもIIF文が効いていないようなのです。 おそらくODBCドライバのバージョンなのだと思うのですが、そんなことってあるんでしょうか? 実機がそばにないので確認できないのですが、「このバージョンのODBCドライバなら確かにそうなる」ということをご存知の方、教えていただけますか?

  • Accessの内部結合

    こんにちは。 Accessでcateテーブルとgoodsテーブルがあります。 select * from goods inner join cate on goods.cateid = cate.id; クエリデザインで、テーブルとテーブルを結合して上記のようなSQLができました。 これは動作することを確認しました。 SQLビューで下記のようなSQLを書きました。 select * from goods inner join cate on left(goods.cateid,5) = cate.id; しかしながら、動きませんでした。 VBAを使わずに、Accessの標準のクエリデザインから上記のようなSQLを実行させることは可能でしょうか? クエリデザインでselect left(cateid,5) as cateid from goodsというTESTクエリをつくり、TESTクエリとcateテーブルとジョインさせれば解決しそうなことはわかるのですが・・・ 宜しくお願いします。

  • CakePHPとMySqlを使用しています。INSERTしたあと、id

    CakePHPとMySqlを使用しています。INSERTしたあと、idを取得する方法について教えて頂きたいです。 データをINSERTとSELECTをする関数を作成し、 メインの関数でINSERTとSELECTをする関数を呼び出すと、idがNULLとなってしまいます。 しかし、1つの関数でINSERTとSELECTを行うとidを取得する事ができました。 この方法は問題ないのでしょうか? この方法だとなぜidが取得できるんでしょうか? また、これ以外の方法でidを取得できる方法があればお教え頂きたいです。 宜しくお願いします。 【hogeテーブル】 id(PRIMARY。オートインクリメントさせています) name ●idがNULLになる方法 function main() { $this->insertHoge(); $id = $this->getHoge(); ←結果がNULLになる } function insertHoge() { $sql = "INSERT INTO hoge ('name') VALUES('ABC')"; $result = $this->query($sql); return $result; } function getHoge() { $sql = "SELECT id FROM hoge WHERE name='ABC'"; $result = $this->query($sql); return $result; } ●idが取得できる方法 function main() { $id = $this->insertHoge(); ←idがかえってくる } function insertHoge() { $sql = "INSERT INTO hoge ('name') VALUES('ABC')"; $result = $this->query($_sql); $sql = "SELECT id FROM hoge WHERE name='ABC'"; $result = $this->query($_sql); return $result; }

    • 締切済み
    • PHP
  • アクセスのクエリでSplit関数は使えないのですか

    レコードにaaa/bbb/cccと入っていて、 クエリで SELECT Split([テーブル1]![フィールド1],"/") AS test FROM テーブル1; とすると、 式に未定義関数 <関数名> があります。(Error 3085) になります。 VBAでやるとしたら Sub test() Dim str As String str = "aaa/bbb/ccc" Debug.Print Split(str, "/")(1) End Sub のような事がしたいのですが クエリでは無理なのでしょうか?

  • SQL文の最後に「;」はいらないのでしょうか?

    VBAのADOについて質問です。 SQL文の最後には「;」を付けなくちゃいけないものだと思っているのですが ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ Private Sub test_Click() Dim CN As ADODB.Connection Dim RS As ADODB.Recordset Set CN = CurrentProject.Connection Set RS = New ADODB.Recordset SQL = "SELECT * FROM Tテーブル" ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ でも問題なくコードが動きました。 SQL文の最後に「;」はいらないのでしょうか? ちなみに SQL = "SELECT * FROM Tテーブル;" でもエラーになりませんでした。

  • クエリ表示と、ADOで抽出したレコードセットが違う

    Accessで作ったクエリで表示されるデータと、VBAでSQLを組んでそのクエリから抽出したデータが異なるので困っています。 ちょっと言葉では説明しにくいので表で説明します。 元となるテーブル(t_test)がたとえば以下のようになっているとします。 t_test 顧客id  商品id 1      A-1 2      A-2 3      B-1 4      A-1 これを元に、以下のようなクエリ(q_test)を作ります。 q_test 顧客id  商品id  式1: IIf([商品id] Like "A*",1,0) 1      A-1    1 2      A-2    1 3      B-1    0 4      A-1    1 VBAで以下のようなSQLを実行すると、なぜか式1の値が全て0となります。 sql = "SELECT * FROM q_test" 1      A-1    0 2      A-2    0 3      B-1    0 4      A-1    0 式1でLIKEを使っていることが原因なのか、 IIf([商品id] = "A-1",1,0) とかだと、クエリとSQLの結果に違いはありません。 IIfだけでなくSwitchを使った場合も同様(LIKEだとおかしい、=だと平気)でした。 ちなみに、Accessのバージョンは2003、VBAで使っているレコードセットはADODBです。 (今確認したところ、DAOでは問題なくできました。) 冒頭で、困っていると書きましたが、これを回避する方法はいくつか思いついていますので、 別の方法を教えていただきたいわけではなく、単純になぜこのようなことが起きるのかが知りたいです。 是非よろしくお願いします。

専門家に質問してみよう