インストールレスプログラミング( ´ー`)

VBA , JavaScript , HTAなど 365アプリはインストール必要ですが、仕事に無いケースはほぼないから(・_・;)

VBA 有効数字の表示

化学反応式の量的関係のところで,根本的なところからやりなおしています。

ActionSettingのために四角形敷き詰めるなら,そもそも表いらないんじゃ??

というところから(;´▽`A``

そう思わないといけなくなった理由は,表だとセルの大きさに合わせて文字の大きさを自動調整するような真似ができないからです。

なので,授業で使うレベルまでもっていったんですが,やりなおしているところです。

それと併せて,有効数字の問題。

受験で使うレベルで教えていないので,基本的にはわかりやすさを主眼に放っておけるとこは放っておこうという,曖昧なスタンスでやっていますが,

アボガドロ定数 6.0×10^23が絡む個数についてはいずれにせよ無視できません。

とりあえず間に合わせるためにネットで見つけたコードを利用してやっていたんですが,それじゃあ公開に適さないので,自分で考えてみました。

ぽいのができたので,載せます。

Function 有効数字表示(As Single,As Long, 指数表示 As Boolean) As String
    Dim Val_ As String, Format_ As String
    If= 1 Then Format_ = "0" Else Format_ = "0." & String(- 1, "0") & "e-0"
    Val_ = Format(, Format_)
    If 指数表示 = True Then
        有効数字表示 = Replace(Val_, "e", "×10^")
    Else
        有効数字表示 = CSng(Left(Val_, InStr(Val_, "e") - 1) & "e" & Mid(Val_, InStr(Val_, "e") + 1))
    End If
End Function

どうでしょう,数学的処理を避けたFormat関数によろしく!なコードです。

個数などは指数表示が適していますが,そうでない部分は指数表示が理解できない子には敷居が高いし,

受験にいらないレベルで話すなら,指数表示を理解するかどうかというのは枝葉だと思います。

なので,そのあたりに対応するように,3つ目の引数をつけた感じです。

この関数に数値を入れてみると,

?有効数字表示(0.2551,3,false)
0.255
?有効数字表示(0.2551,3,true)
2.55×10^-1

?有効数字表示(6e23,3,false)
6E+23
?有効数字表示(6e23,3,true)
6.00×10^23

?有効数字表示(0.2551,2,false)
0.26
?有効数字表示(0.2551,2,true)
2.6×10^-1

?有効数字表示(0.2,2,false)
0.2
?有効数字表示(0.2,2,true)
2.0×10^-1

だいたい私の要件は満たしていますが,大事なものがまだ。

指数表示じゃない時の末尾の0,どうやって付け足そうかなぁ ( ´ー`)フゥー...

追記 読みやすさより,試行錯誤を残すスタイルでそのまま付け足します。とりあえず末尾の0を考えてみました。
コードが長くなって嫌いですが仕方なし。。

Function 有効数字表示(As Single,As Long, 指数表示 As Boolean) As String
    Dim Val_ As String, Format_ As String
    If= 1 Then Format_ = "0" Else Format_ = "0." & String(- 1, "0") & "e-0"
    Val_ = Format(, Format_)
    
    If 指数表示 = True Then
        有効数字表示 = Replace(Val_, "e", "×10^")
    Else
        有効数字表示 = CSng(Left(Val_, InStr(Val_, "e") - 1) & "e" & Mid(Val_, InStr(Val_, "e") + 1))
        
        If InStr(有効数字表示, "E") = 0 Then
            Dim 数値スタート As Long, i As Long, 数値桁 As Long
            For i = 1 To Len(有効数字表示)
                If Mid(有効数字表示, i, 1) <> "0" And Mid(有効数字表示, i, 1) <> "." Then
                    数値スタート = i
                    Exit For
                End If
                
            Next
            
            数値桁 = Len(有効数字表示) - 数値スタート + 1
            
                If Len(有効数字表示) = 1 Then 有効数字表示 = 有効数字表示 & "."
                有効数字表示 = 有効数字表示 & String(- 数値桁, "0")
        End If
    End If
End Function

※最後あたりを少し書き直しました(10/28)
もっとすっきり書けないかなぁ(;´▽`A``

とりあえず結果。

?有効数字表示(6e23,3,false)    
6E+23       ←指数表示=falseの場合は想定外な数値なのでスルー

?有効数字表示(0.2,3,false)
0.200

?有効数字表示(0.224,2,false)
0.22
?有効数字表示(0.224,3,false)
0.224
?有効数字表示(0.224,4,false)
0.2240

?有効数字表示(0.0224,2,false)
0.022
?有効数字表示(0.0224,3,false)
0.0224

それっぽい。指数表示でしか無理な場合はfalseの場合はどうでもいいので,その時に対しては無視しています。。

自分で使う分にはこれでいいかな。