お世話になっております。
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関数で計算するような方法はないでしょうか。
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が見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) エクセルでround関数を使わないで四捨五入する方法 10 2022/08/12 15:43
- Visual Basic(VBA) パーソナルXLSBのfuctionを呼び出すと「Functionが定義されていません」のエラーになる 2 2022/08/22 22:51
- Excel(エクセル) Excel 特定セルの数値を参照したセルの0表示が空白にならないのはどうしてか? 3 2022/04/28 22:23
- Excel(エクセル) VBAで組み合わせ算出やCOUNTIFSの処理を高速化したいです。 4 2022/04/07 02:38
- Visual Basic(VBA) Excel のユーザー定義関数でソルバーが動作しない 1 2022/09/05 19:51
- Excel(エクセル) RANK.EQとCOUNTIFSの組み合わせで同ポイントの場合、違う条件を加えて順位を付けたい。 1 2022/08/30 19:49
- その他(Microsoft Office) Excelで時間計算(負) 8 2023/02/26 05:47
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- Visual Basic(VBA) VBA 改行コードの取り方 1 2022/03/22 14:14
- Excel(エクセル) エクセルでIF関数中にIFERROR関数を使いたいのですが???? 5 2022/04/08 13:24
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
今投稿して解決したのですが 更...
-
COBOLの計算方法
-
5%割引の際の、小数点以下の扱...
-
数字の下二桁を削除したい
-
負の数の四捨五入の方法
-
端数処理における「小数以下」...
-
駐車場賃料の日割り計算について
-
数字の double 型 を int型...
-
ツェラーの公式について
-
ADOで算術型のRound関数を使いたい
-
雇用保険料の計算式について(E...
-
VBA
-
小数点切り上げって関数ですか?
-
なぜ消費税10%は×1.1なのですか...
-
電卓で指数計算できますか?
-
法人税・消費税修正申告納付の仕訳
-
高速料金を請求する場合の消費...
-
法人会年会費の消費税
-
時給制の業務委託時、請求書の...
-
480円の税込は何円ですか? 急...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
5%割引の際の、小数点以下の扱...
-
今投稿して解決したのですが 更...
-
端数処理における「小数以下」...
-
COBOLの計算方法
-
Access 1000以下を切り捨てる関数
-
Excel有効数字の丸め方「0捨1入」
-
右ビットシフト
-
負の数の四捨五入の方法
-
駐車場賃料の日割り計算について
-
エクセルでの小数点以下切り捨...
-
数字の double 型 を int型...
-
50銭以下切り捨て51銭以上切...
-
勤務の稼働時間の計算がわかり...
-
数字の下二桁を削除したい
-
ACCESSの切り上げ
-
売上の構成率の計算で、たとえ...
-
エクセル 小数点第2位を条件付...
-
切り捨てて百の位までのがい数...
-
小数点 第n位 を切り上げ,切り捨て
-
エクセルの関数について。 残業...
おすすめ情報