Top小ネタ色々Excelで有効数字

Excelで有効数字

2010年1月23日


7.ユーザーフレンドリーに

前のページまでで、とりあえず有効数字2桁にするプログラムが完成した。
これで3桁版も作ればそれでいい。

しかし、ここからが作る人の優しさが出るところ。セル範囲をガバッと選択してプログラムを走らせた時に
空白のセルがあると「アプリケーション定義またはオブジェクト定義のエラーです。」
というエラーメッセージが出て止まる。

また、文字が入力されたセルがあると、Excel上で

=ROUND(「文字」,1-INT(LOG10(「文字」)))

となるので、Excel上でのエラーが出る。

「そんなの、範囲を選択するときに気をつければいいじゃないか!」
という言い分もあるだろうが、このエラーを事前に回避してあげた方がユーザーに優しい。

という事で、今更ながらに、仕様に1つ追加される事になった。

さぁ、どうやって実装しようか・・・。
悩み名がらヘルプを見ていると、それっぽいメソッドが見つかってくる。

Len
Len(string | varname)
指定した文字列の文字数または指定した変数に必要なバイト数を表す長整数型 (Long) の値を返します。

IsNumeric
IsNumeric(expression)
式が数値として評価できるかどうかを調べ、結果をブール型 (Boolean) で返します。

Boolean型というのはTRUE(真)かFALSE(偽)かの2つの値をとるもの。変数の型としても指定できます。

これらを眺めて、セルのFormulaで何らかの文字が入っている場合(Len > 0)、
なおかつ、セルのValueがIsNumericTRUEになる場合は
実際に数字を丸める操作を行えば良さそうだ、という事になる。

LenについてはFormulaでもValueでも良さそうだが、何となくFormulaを選んでみた。

使うのはもちろんIf。Ifを複雑に入れ子にしていく事になる。

Sub significantFigure2()

'変数の定義
Dim myRange As Range
Dim myCellFormula As String '式として変換する為の変数
Dim myCellValue 'variantで数字と文字列の判定
Dim startFrom 'variantで1文字目を取得


Set myRange = Application.Selection


For Each c In myRange.Cells '個々のセルを抽出
myCellFormula = c.Formula
myCellValue = c.Value

If Len(myCellFormula) > 0 Then '空白セルをエスケープ
	If IsNumeric(myCellValue) Then '文字列セルをエスケープ
    
	'セルの先頭文字を取得して式か数かを判定。
	'式なら=を除去
	startFrom = Left(myCellFormula, 1)
	If startFrom = "=" Then
		myCellFormula = Mid(myCellFormula, 2)
	End If
        
	'ここで丸めを実行
	c.Formula = "=ROUND(" & myCellFormula & ",1-int(LOG10(" & myCellFormula & ")))"
    
	End If
End If

Next

End Sub

主な変更点は以下の通り。

ifが増えてきたので、Forでのタブは消去してみた。ひたすら行頭が下がっていても見にくいし。
そのあたりは臨機応変に。

そういうエラーを防ぐために、いくつの構文が入れ子になっているか、書いている本人が
間違わないようにするために、タブを入れる事がある。
ま、個々人の趣味の世界ではあるのだが。


[1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14]

<<Prev. | 小ネタTOP | NEXT>>