• 締切済み

ADOで算術型のRound関数を使いたい

お世話になっております。 ACCESSではRound関数を使うと銀行型で計算してしまうので、算術型で計算するため以下のような定義関数をACCESS上で作成しました。 Public Function Round(X As Currency, s As Integer) As Currency Dim t As Integer t = 10 ^ Abs(s) If s > 0 Then Round = Int(X * t + 0.5) / t Else Round = Int(X / t + 0.5) * t End If End Function この関数を使えばACCESS上でクエリを見た時にはちゃんと算術型の計算結果が表示されるのですが、ADOを使ってExcelで読み込んだ時にはなぜか銀行型の計算結果が表示されていしまいます。 "Round"という関数名が良くなかったのかと思い、"Round2"という関数に変更したところ、ACCESS上は問題なかったのですが、ADOで読み込んだ時に"未定義の関数があります"とエラーが出てしまいました。 ADOで読み込んでも算術型のRound関数で計算するような方法はないでしょうか。

みんなの回答

noname#140971
noname#140971
回答No.1

Q、ADOで算術型のRound関数を使いたい。 A、次のようにして使えないでしょうか? [イミディエイト] ? DBLookup("SELECT Round(111.45, 1) FROM tab2") 111.4 ? DBLookup("SELECT Round(111.55, 1) FROM tab2") 111.6 ? DBLookup("SELECT Round(111.45 + 0.01, 1) FROM tab2") 111.5 ? DBLookup("SELECT Round(111.55 + 0.01, 1) FROM tab2") 111.6 ? DBLookup("SELECT fld_1 FROM tab2") 111.45 ? DBLookup("SELECT Round(fld_1 + 0.01 * sgn(fld_1), 1) FROM tab2") 111.5 補足: 四捨五入関数は未完じゃないでしょうか? 上でも sgn関数を使っていますが、これを忘れるとトンデモない結果を得ると思いますよ。 質問者の関数と以下に示すRounds関数との実行結果の違いを確認されて下さい。 ? Rounds(-5555.555, 0, 2) -5555.56 ? MyRound(5555.555, 2) 5555.56 ? MyRound(-5555.555, 2) -5555.55 なお、以下は、ADOでAccessのデータを参照するDBLookup関数と四捨五入、切り捨て、切り上げを行う関数です。 これらの関数で持って十分にテストを重ねられたがいいかもです。 ともかく、 Round(fld_1 + 0.01 * sgn(fld_1), 1) なんてやり方は今考えたばかりだからです。 ? Rounds(DBLookup("SELECT fld_1 FROM tab2"), 0, 2) 111.45 ? Rounds(DBLookup("SELECT fld_1 FROM tab2"), 0, 1) 111.5 こういう結果と一致すれば、 Round(fld_1 + 0.01 * sgn(fld_1), 1)もバグっていません。 しかし、この検証は上述の一回だけのテスト。 そこは、質問者で行って下さい。 ' ' ADO 接続文字列 ' Public Const pubCNNSTRING = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Temp\DB4.mdb" ' ' Rounds関数用 ' Public Const 四捨五入 = 0 Public Const 切り捨て = 1 Public Const 切り上げ = 2 Public Function DBLookup(ByVal strQuerySQL As String) As Variant On Error GoTo Err_DBLookup   Dim DataValue   Dim rst As ADODB.Recordset   Set rst = New ADODB.Recordset   With rst     .Open strQuerySQL, _        pubCNNSTRING, _        adOpenStatic, _        adLockReadOnly     If Not .BOF Then       .MoveFirst       DataValue = .Fields(0)     End If   End With Exit_DBLookup: On Error Resume Next    rst.Close    Set rst = Nothing    DBLookup = DataValue    Exit Function Err_DBLookup:    MsgBox "SELECT 文の実行時にエラーが発生しました。(DBLookup)" & Chr$(13) & Chr$(13) & _       "・Err.Description=" & Err.Description & Chr$(13) & _       "・SQL Text=" & strQuerySQL, _       vbExclamation, " 関数エラーメッセージ"    Resume Exit_DBLookup End Function Public Function Rounds(ByVal M As Currency, _             ByVal A As Integer, _             Optional D As Integer = 0) As Variant     Rounds = Sgn(M) * Fix(Abs(M) * 10 ^ D + Abs((A = 0) * 0.5@ + (A = 2) * (Int(M * 10 ^ D) <> (M * 10 ^ D)))) / 10 ^ D End Function Public Function MyRound(X As Currency, s As Integer) As Currency   Dim t As Integer   t = 10 ^ Abs(s)   If s > 0 Then     MyRound = Int(X * t + 0.5) / t   Else     MyRound = Int(X / t + 0.5) * t   End If End Function

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • AccessのSQLで算術型丸め処理をしたい

    いつも楽しく勉強させていただいております。 環境はWin7でAccess2013です。 Accessを使って請求書のシステムを作っています。 顧客からExcelで検算してみたが計算が違うのではというクレームが来ました。 調べてみるとAccessのSQLのRound関数とExcelのワークシート関数のRound関数では結果が異なることが分かりました。 前者はRound(2.5,0)が2になり、後者は3になります。 銀行型丸め処理と算術型丸め処理というらしいです。 (実はついさっき得たばかりの知識です)。 AccessのSQLで算術型丸め処理をするにはどうしたらいいでしょうか。

  • ACCESS2000

    Option Compare Database Public Function RoundDown(X As Double, s As Integer) As Double Dim t As Integer t = 10 ^ Abs(s) If s > 0 Then RoundDown = Int(X * t) / t Else RoundDown = Int(X / t) * t End If End Function というモジュールをつかって値の切り捨てをおこなっていましたが、マイナスの値がうまく動きません。 どなたか教えていただけないでしょうか。

  • access2003と2007のRound関数について

    以前見た質問でround関数で四捨五入をするときは、 access97は銀行型の四捨五入をする access2000はround関数にバグがある という回答を見ました。 http://oshiete1.goo.ne.jp/qa3593239.html ちなみにaccess2003と2007はどうなんでしょうか? やはり四捨五入はint関数を使うほうが無難なのでしょうか? ご存知の方いらっしゃいましたらご教授下さい。 よろしくお願いします。

  • 算術型変換について

    c言語で算術型変換がどのように行われているかの質問です。 例えばintが16bitでlongが32bitの環境であるとします。 そして以下のようなプログラムがあるとします。 unsigned long x = 100; signed int y = 1; unsigned int z = 5; long test = x + (y - z); 1、 このときまずy-zについて算術型変換が起きてyとzがunsigned intとなり、 y-z=65532となる。 そしてx/(y-z)について算術型変換が起き、xと(y-z)がunsigned longとり、 x+(y-z)=65632となるのでしょうか? 2、 もしくはx+(y-z)のすべてに算術型変換を起こしてから計算を行うのでしょうか? y-zの結果の型をunsigned longとして計算し、y-z=4294967292になるのでしょうか? 文章がうまくまとめられていないのですが、どちらになるのでしょうか?

  • 関数型インターフェースの配列の作り方

    関数型インターフェースを勉強し始めた者です。 関数型インターフェースの配列はどのように作ればよいのでしょうか? 関数配列のようなものを作ろうとして以下のプログラムを作りました。 環境:Windows 7 64bit IDE:Eclipse 4.5.2 JDK:1.8 package interfaceSample; import java.util.function.Function; public class FuncSample3 { public static void main(String[] args) { //@SuppressWarnings("unchecked") Function<Integer, Integer>[] funcList = new Function[3]; funcList[0] = FuncSample3::mul; funcList[1] = FuncSample3::add; funcList[2] = FuncSample3::sub; for (Function<Integer, Integer> function : funcList) { funcApply(function, 10); } } public static int mul(int x) { return x * 2; } public static int add(int x) { return x + 2; } public static int sub(int x) { return x - 2; } public static void funcApply(Function<Integer, Integer> func, int t) { System.out.println("この関数の値は"+func.apply(t)); } } このプログラムを打ち込んだところ、期待通りの出力をしてくれたのですが、以下の警告が出てきました。 型の安全性: 型 Function[] の式は、未検査の型変換を使用して Function<Integer,Integer>[] に準拠するようにする必要があります このメッセージでググって見たのですが、インターフェースについてこのメッセージが出たケースに当たりませんでした。 @SuppressWarnings("unchecked")を付ければ警告は消えるのですが、あんまり気分が良くないです。 よろしくお願いいたします。 ※OKWAVEより補足:「Webシステム開発」についての質問です。

    • ベストアンサー
    • Java
  • ACCESS Viewでユーザー定義関数を使いたい

    ACCESS2000+MSDEで開発をしていますが、Viewの中でユーザ定義関数を使用したいのですが、できません。 1> create function dbo.count1(@linkNo int) 2> returns int 3> as 4> 5> begin 6> declare @cnt int 7> 8> select @cnt = count(*) from dbo.TBL_OA where [link] = @linkNO 9> 10> return @cnt 11> end 12> go 1> select dbo.count1(100) 2> go ----------- 1 (1 件処理されました) ここまでは上手く行くのですが、 ACCESS側でViewの列へ count1(100)と記述すると 「ADOエラー:'count1'は関数名として認識されません。」 とエラーになってしまいます。 方法は問いませんが、Viewの中でユーザー定義関数が使用できる方法、ご存知の方いらっしゃいましたら、よろしくお願いします。

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

    一つの関数の一つのパラメータが異なるユーザ定義型を受けられるようにしたいのですが、どのようにすればいいのでしょうか? 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) と呼び出そうとすると、次のようなエラーメッセージが表示されて進みません。 コンパイルエラー: パブリックオブジェクトモジュールで定義されたユーザー定義型に限り、変数に割り当てることができ、実行時バインディングの関数に渡すことができます。

  • 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つに変更してみると 計算できるのでタイプミスではないと思います。 やはり引数を複数とる取り方に問題があるように見えます。 お手数ですが何かアドバイスいただけないでしょうか?

  • EXCEL VBA ユーザー定義関数について。

    EXCEL VBA ユーザー定義関数について。 例) FUNCTION Test(a as integer, b as integer,c as integer) as integer とした場合、に添付図のような   =Test(数値1, 数値2, 数値3) のような説明は表示できないのでしょうか? ご存知の方よろしくお願いします。

  • int関数の切り上げ

    int関数の切捨てがうまくいません。 類似の質問を検索して、試行錯誤しましたが、煮詰まってしまいました。 具体的には以下の内容です。 Dim wrkA As Currency Dim wrkB As Currency wrkA = 4935000 wrkB = Int(wrkA * 0.6) wrkBに欲しい値は2961000、実際は2960999となってしまいます。 よろしくお願いいたします。

このQ&Aのポイント
  • 夫のモラハラによる娘への怒りに疲れた私は、再構築のチャンスを掴んでいます。
  • 夫のモラハラにより自信を失い、自殺未遂を繰り返してきた私ですが、娘の怒りをきっかけに再生の道を探る決意をしました。
  • 夫の価値観の偏りと依存度の高さに気付いた私は、専門職の仕事や娘との良好な関係を築くことに努め、再構築していく予定です。
回答を見る

専門家に質問してみよう