• ベストアンサー

Excel 2003のvba で質問

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

  • puyopa
  • お礼率87% (459/525)

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

  • ベストアンサー
  • 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

  • 文字列操作(ExcelのVBAですが)

    特定のExcelセル内にある文字列について、 例えば、 138.40.8.7 と入っている場合、 138.40.08.7 に、 35.9.1.6 と入っている場合、 35.09.01.6 にするVBA関数を作りたいのです。(セル関数でもかまわないですが) つまり、小数点で区切られている2番目と3番目の数字が 一桁の場合、頭に0を付けて、必ず二桁になるようにしたいわけです。 どなたか、ご教授くださいませ。 よろしくお願い致します。

  • Excel を使った合計、平均など

    1桁おきの計算、2桁おきの計算など VBA あるいは そのほかを使った計算方法はあるようですが Excel のみでできる方法はあるのでしょうか あるようでしたら是非教えてください 1 2 3 4 5 とある場合 通常では 15 となりますが 1行おきだと     9となります 2 行おきだと     5となります よろしくお願いいたします。 .

  • エクセルVBAのマクロに関して

    タテAに6桁で並んでいる数字の下2桁だけ削除したいのですが、 VBA初心者なのでうまくマクロが組めませんorz わかる方いらっしゃいましたら教えて下さい。 よろしくお願いします。

  • VBA 有効数字3桁表示コードの質問。

    Office 2010 Excel のマクロコードで特定セルの計算結果だけを有効数字3桁で表示する方法を教えて下さい。よろしくお願いします。

  • エクセルの関数についての質問ですが、

    エクセルの関数についての質問ですが、 例えば、一つのセルの中に 2桁の数字が6個あるとします。 「01 02 03 04 05 06」 このセルの中の数字と もう一つのセルの中の数字 「02 04 06 08 09 10」 この2つのセルの中の数字が何個一致しているか、個数を求めたい場合 何か良い関数がありますでしょうか? 関数でもVBAでもどちらでも良いのですが 良い案があれば教えて頂ければ幸いです。 よろしくお願いします。

  • エクセルについて質問があります。

    エクセルについて質問があります。 000100616013201 000100616013202 000100616013203 という数字があります。 この下2ケタ目の0を取り 「00010061601321」 「00010061601322」 「00010061601323」のようにしたいと考えています。 エクセルの表にある全ての数字の下2ケタ目は「0」の状態です。 なので、一括で簡単に消す方法を教えていただけないでしょうか。 少しだけなら計算式なども理解できます。 急いでいるので、宜しくお願い致します。

  • エクセルのVBAに関しての質問です。

    エクセルのVBAに関しての質問です。 あるセルに入力された数字の行から行までを非表示にしたいのです。 例えば、A1に15、B1に30という数字が入っていれば、行15から30を非表示する、という感じです。 よろしくお願いします。

  • エクセルのVBAに関する質問です。

    エクセルのVBAに関する質問です。 仮にA列にA1からA14まで(12341231212345)と入っていて、さらにB列にB1からB14まで(38906493087639)と入っていたとします。A列の(2)の隣にあるB列の数字はそれぞれ(8407)になりますよね。 この2のとなりのB列の数字を、A列の最初から(1234)(123)(12)(12345)と1を区切りとして、C列に、2に対応していた先ほどの数字を入力したいのです。 つまりC列には(88884440077777)と入るようにしたいのですが、VBAド素人の私には解説書を読んでもいい知恵が浮かびません。 どなたか、ご説明か、できればVBAのコピーを取らせていただけないでしょうか? よろしくお願いいたします。

  • エクセルVBAで計算機を作成について

    エクセルVBAのユーザーフォームで計算機を作成しております。 以下の点で参考書で調べたのですが壁にぶつかっております。 1、クリアボタンを作成して押下する事によって表示さ れている数字を「0」にしたいのですが出来ません。 2、テキストBOXに表示される数字を12桁まで表示にし たいのですがMAXLENGTHを12にしても制限をかける事  が出来ません。 3、テキストBOXに数字や計算結果を表示してるのです  が、手動入力を出来ない様にしたいのですが出来 ません。 非常にせっぱ詰まっていて言葉足らずかもしれませんがどなたか教えてください。

  • エクセルVBA ワークシート関数の使用について

    エクセル2003VBA ワークシート関数の使用についての質問です よろしくお願いします。 4桁の数字を、千の位・百の位・十の位・一の位に分解する関数ですが 例えば A1に4桁の数字があり、B1に千の位を表示する場合ですが ワークシート関数の場合 B1=MOD(INT($A$1/1000),10) となりますが VBAにてそのまま使用し Range("B1").value=Application.WorksheetFunction.MOD(INT(Range("A1")/1000),10)とするとエラーになります。 エラーになる原因は、いろいろ調べたら分かったのですが この様に、一発でB1に計算結果を入れたいのですが、どうしたらよろしいでしょうか 現在は、 Range("C1").Formula = "=MOD(INT(A1/1000),10)" Range("B1").value=Range("C1").value 一旦、C1に置き換えてから行っています。 よろしくお願いします

専門家に質問してみよう