ACCESS2000で値の切り捨てをする方法がマイナスの値に対してうまく動かない

このQ&Aのポイント
  • ACCESS2000のモジュールを使って値の切り捨てをしていますが、マイナスの値に対してうまく動作しません。
  • RoundDown関数を使用して値の切り捨てを行っていますが、マイナスの値に対して正しく切り捨てされません。
  • マイナスの値を正しく切り捨てるためには、条件分岐を追加する必要があります。
回答を見る
  • ベストアンサー

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 というモジュールをつかって値の切り捨てをおこなっていましたが、マイナスの値がうまく動きません。 どなたか教えていただけないでしょうか。

noname#2277
noname#2277

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

  • ベストアンサー
  • miya_777
  • ベストアンサー率31% (44/140)
回答No.3

ええとですね。 int関数は、負の時は桁上げします。 なのでint関数の替りにFix関数を使って見て下さい。 MyNumber = Int(99.8)  ' 99 を返します。 MyNumber = Fix(99.2)  ' 99 を返します。 MyNumber = Int(-99.8)  ' -100 を返します。 MyNumber = Fix(-99.8)  ' -99 を返します。

その他の回答 (3)

  • nishi6
  • ベストアンサー率67% (869/1280)
回答No.4

下記のようにすると正負ゼロとも同じ処理になりますが・・・ Int、Fixどちらでも同じ値でしょう。 質問のモジュールは Abs(s)>=5 でエラー? 'sが正は小数桁方向で作成 Public Function RoundDown2(X As Double, s As Integer) As Double   RoundDown2 = Sgn(X) * Int(Abs(X) * 10 ^ s) / 10 ^ s End Function

noname#1296
noname#1296
回答No.2

負の数の場合、Int関数でなくFix関数を使えばお望みの結果が出るのでは?

  • yanmaa
  • ベストアンサー率45% (207/457)
回答No.1

maokunさん マイナスの値が上手く働かないとはなにを指してますか? X = 1.12 s = 1 A = 1.1 X = 1.12 s = -1 A = 0 X = -1.12 s = 1 A = -1.2 X = -1.12 s = -1 A = -10 となると思いますがどこの答えに納得がいかないのかな?

関連するQ&A

  • 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関数で計算するような方法はないでしょうか。

  • ユーザー定義関数の構文がわからない

    以下のコードがあるのですが、コメントがなくて意味がよくわかりません。k = p(1),n = Application.Count(p),t = Sgn(position)というあたりがいきなり見たことのない構文で戸惑ってます。 インターネットでも調べようがありませんでした。 どなたか下のコードにコメントを入れてくれませんでしょうか?ちなみに株式売買のシミュレーション用の関数です。 Function Positioning(position As Single, x As Single, y As Single, p As Range) Dim k As Single, t As Single, r As Single Dim n As Integer, i As Integer If position = 0 Then Positioning = "": Exit Function k = p(1) n = Application.Count(p) t = Sgn(position) If t > 0 Then l = Abs(x): m = -Abs(y) Else l = Abs(y): m = -Abs(x) End If For i = 2 To n r = (p(i) / k - 1) * t If r >= l Or r <= m Then t = 0: Exit For Next If t = 0 Then Positioning = r Else Positioning = "ポジションは解消されていません" End If End Function

  • ExcelのVBAソースコード(一部)の翻訳

    ソースコードの一部ですが、開発者が他界し訊けずにおります。 今後自分でもVBAを勉強しますが、お教えいただけますでしょうか。 なお冒頭は Function process_new(m0 As Integer, m As Integer, d As Variant, ans As Double) As Integer Dim a(501), b(501), s(501), r(501) As Double Dim w(501), g(11), xx As Double Dim s1 As Double Dim k(501) As Integer Dim i, j, flg As Integer でスタートしています。 =(以下、質問内容)==== s1 = s(k(0)) * 1.618 flg = 0 For i = m0 To m - 3 If Not i = k(0) Then If s1 > s(i) Then flg = flg + 1 End If End If Next i =(以上)====

  • 【Excel:VBA】千円未満切捨ての方法

    1000未満切捨てのVBA関数はどの関数を使いどのように引数を指定すればよいのかわかりません。 ------------------------------- Sub 切捨て() Dim x As Integer x = 123456 〔切捨て関数〕 MsgBox x End Sub -------------------------------- この状態で、メッセージボックスに「123000」の値が表示されるようにできないでしょうか? 小数点以下を切り捨てるには x = Int(x) だとわかったのですが、この関数に千未満切捨てなどを指定する引数はあるのでしょうか?

  • デバックがでない

    Option Compare Database Public Function Doreka(kazu As Integer) As Integer Doreka = kazu * 3.305785 End Function をイミディエイトのところで 実行すると 継続 終了 のみしか出てきません どうやったら、デバックを出すことができますか?

  • タイムカードにおいて、切り上げや、切り捨てをVBAで作成したいのですが

    タイムカードにおいて、切り上げや、切り捨てをVBAで作成したいのですが、 切り上げは、FixとRoundupをどちらが最適かわかりません。 同様に、切り捨ては、IntとRounddownのどちらが最適ですか? 使い分けを教えて頂きたいと思います。 例(切り捨て) Const zam As Integer = 6   '切り捨てを6分単位にする zag = 退勤時間 - 終業時間 (Int(zag / zam) * zam) / 60 よろしくお願いします。

  • どこにいれればいいですか

    下記のプログラムがあります Option Compare Database Public Function Doreka(kazu As Integer) As Integer Doreka = kazu * 3.305785 End Function で Debug.Print と Msgbox kazu(Msgbox(kazu)) はどこに入れればいいですか

  • 最速化するにはどうしたらいいでしょうか?

    #include <stdio.h> #include <math.h> #include <time.h> double abssucc(double x){ return x / (1 - pow(2,-53)); } double abspred(double x){ return x * (1 - pow(2,-53)); } double succ (double x){ if(abs(x) < pow(2,-1022)) return x + pow(2,-1074); if (x >= 0) return abssucc(x); else return abspred(x); } double pred(double x){ if(abs(x) < pow(2,-1022)) return x - pow(2,-1074); if (x >= 0) return abspred(x); else return abssucc(x); } int main(){ clock_t start, end; double r= 0; int i=0; start = clock(); for(i;i<1000000;i++){ r= succ(1); printf("%.50f\n",r); }end = clock(); printf("ループ100万回の時間: %f秒\n", (double)(end - start) / CLOCKS_PER_SEC); } このプログラムをpow関数使わないでもっと速く動かしたいのですが、やり方がわかりません。 教えて下さい!お願いします。

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

    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

  • ACCESS2000でコンパイルエラーが表示されてしまいます

    ACCESS初心者です。宜しくお願いします。 前任者が作成したACCESS2.0で使用していたものを、ACCESS2000でコンパイルすると、 コンパイルエラー ユーザ定義型は定義されていません。と表示されてしまいます。 Sub ページ設定P() Dim DB As Database, T As Table, X As Integer, I As Integer, 図面番号 As Integer Set DB = CurrentDb() Set T = DB.OpenTable("図面リスト印刷TEMP") ' テーブルを開きます。 X = DCount("印刷", "図面リスト印刷TEMP", "[印刷]=No") If X > 27 Then X = X - 27 + 43 X = X Mod 42 X = X For I = 1 To X T.MoveLast T.Delete Next I Else X = X - 27 + 43 X = X For I = 1 To X T.MoveLast T.Delete Next I End If End Sub どのようにすれば動くのでしょうか? 以上、宜しくお願い致します。

専門家に質問してみよう