- ベストアンサー
Excel 2003のvba で質問
excel2003 vba で質問です。 数字が 1だと 0.9 0.1だと 0.09 0.5だと 0.49 0.08だと 0.079 のように、一桁低い数字の1を引くようにしたい場合、どのように計算すればよいでしょうか
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
A列に入力した時のみ実行ということで。 Private Sub Worksheet_Change(ByVal Target As Range) Dim t As Range, trgt As Range Set trgt = Intersect(Target, Range("A:A")) If trgt Is Nothing Then Exit Sub Application.EnableEvents = False 'イベント停止 For Each t In trgt With t If .Value = "" Then GoTo nxt1 If IsNumeric(.Value) Then .Value = .Value - 10 ^ (Right(Format(.Value, "0E+0"), 2) - 1) End If End With nxt1: Next t Application.EnableEvents = True 'イベント停止解除 Set trgt = Nothing End Sub 細かいところはご自分でどうにかして下さい。
その他の回答 (2)
- WindFaller
- ベストアンサー率57% (465/803)
こんにちは。 問題としては、良い質問だと思います。 私は、VBAから遠ざかってしまいましたが、VBの力を試されているような気がします。 この質問は、要するに、浮動小数点誤差について考えることでは? VBでは、補正が利かないので、もろに直面してしまいます。 >一桁低い数字の1を引くようにしたい場合、どのように計算すればよいでしょうか 基本的なことですが、そのまま、プログラミングで、小数(浮動小数点数型)から小数を引くことも足すことも、そのままでは出来ませんね。セルの場合は、セル上では、ある程度の補正は利いていますが、VBに渡された時点で変わってくるはずです。なお、ワークシートの関数の質問なら、似たようなものは見たことがあるような気がします。もしかしたら、いろんな数値を入れたら、思っているものとは違った結果になっているかもしれません。 '// Sub Test1() Dim ret ret = DeductOne(0.08) End Sub Function DeductOne(num As Double) As Double Dim num1 As Double, num2 As Double Dim sg As Integer Dim a As String, b As String, c As Long Dim x As Currency, y As Long sg = Sgn(num) '符号取り出し num1 = Abs(num) a = CStr(num1) '固定小数点法 If num1 - Int(num1) > 0 Then b = Mid(a, InStr(a, ".")) '固定小数点で小数部の取り出し c = CLng(Mid(a, 1, InStr(a, "."))) '整数部の取り出し num2 = CDbl(b) Else num2 = num1 End If x = Int((Log(num2) / Log(10#))) '指数を取得する y = num2 / 10 ^ (x - 1) - 1 '整数変換による演算 DeductOne = sg * (c + y * 10 ^ (x - 1)) End Function '//
お礼
回答ありがとうございます。 正攻法という感じを受けました。 VBAから遠ざかっていた方がこれほど高度な 記述をなさるということで、 すごいレベルの高さを感じて、脱帽します。
- watabe007
- ベストアンサー率62% (476/760)
アクティブセルに値が有るとして With ActiveCell n = Len(.Value / 10) - InStrRev(.Value / 10, ".") MsgBox .Value - (1 / (10 ^ n)) End With
お礼
回答ありがとうございました。 もっとも理想的なものだと思います。 勉強にもなり、すごく感謝しております。
お礼
回答ありがとうございます。 とても面白いですね。 こんな方法もあるんだって感服いたしました。 まだ理解できていませんけど、じっくりと勉強 させていただきます。