2010年1月23日
前のページまでで、とりあえず有効数字2桁にするプログラムが完成した。
これで3桁版も作ればそれでいい。
しかし、ここからが作る人の優しさが出るところ。セル範囲をガバッと選択してプログラムを走らせた時に
空白のセルがあると「アプリケーション定義またはオブジェクト定義のエラーです。」
というエラーメッセージが出て止まる。
また、文字が入力されたセルがあると、Excel上で
=ROUND(「文字」,1-INT(LOG10(「文字」)))
となるので、Excel上でのエラーが出る。
「そんなの、範囲を選択するときに気をつければいいじゃないか!」
という言い分もあるだろうが、このエラーを事前に回避してあげた方がユーザーに優しい。
という事で、今更ながらに、仕様に1つ追加される事になった。
さぁ、どうやって実装しようか・・・。
悩み名がらヘルプを見ていると、それっぽいメソッドが見つかってくる。
|
|
Boolean型というのはTRUE(真)かFALSE(偽)かの2つの値をとるもの。変数の型としても指定できます。
これらを眺めて、セルのFormulaで何らかの文字が入っている場合(Len > 0)、
なおかつ、セルのValueがIsNumericでTRUEになる場合は
実際に数字を丸める操作を行えば良さそうだ、という事になる。
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]