• ベストアンサー

Excel 2003のvba で質問

excel2003 vba で質問です。 数字が 1だと 0.9 0.1だと 0.09 0.5だと 0.49 0.08だと 0.079 のように、一桁低い数字の1を引くようにしたい場合、どのように計算すればよいでしょうか

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

  • ベストアンサー
  • Chiquilin
  • ベストアンサー率30% (94/306)
回答No.2

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 細かいところはご自分でどうにかして下さい。

puyopa
質問者

お礼

回答ありがとうございます。 とても面白いですね。 こんな方法もあるんだって感服いたしました。 まだ理解できていませんけど、じっくりと勉強 させていただきます。

その他の回答 (2)

回答No.3

こんにちは。 問題としては、良い質問だと思います。 私は、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 '//

puyopa
質問者

お礼

回答ありがとうございます。 正攻法という感じを受けました。 VBAから遠ざかっていた方がこれほど高度な 記述をなさるということで、 すごいレベルの高さを感じて、脱帽します。

  • watabe007
  • ベストアンサー率62% (476/760)
回答No.1

アクティブセルに値が有るとして With ActiveCell   n = Len(.Value / 10) - InStrRev(.Value / 10, ".")   MsgBox .Value - (1 / (10 ^ n)) End With

puyopa
質問者

お礼

回答ありがとうございました。 もっとも理想的なものだと思います。 勉強にもなり、すごく感謝しております。

関連するQ&A