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

Excelで有効数字

2010年1月23日


6.「=」を取り除け!

そこで再びヘルプを見る。「インデックス/一覧」→「文字列操作に関するキーワード一覧」をじ〜っと眺めてみると
「Left」と「Mid」という使えそうなメソッドが見つかる。それぞれを見ると、

Left
バリアント型 (内部処理形式 String の Variant) の値を返します。文字列の左端から指定した文字数分の文字列を返します。
Mid
バリアント型 (内部処理形式 String の Variant) の値を返します。文字列から指定した文字数分の文字列を返します。

であるらしい。簡単に言うと、Leftは文字列の左から何文字か、Midは文字列の真ん中を何文字か抜き取るらしい。
これだけ見るとどちらでも良さそうで判断がつかないので、もう少し先まで見てみる。

Left
Left(string, length)
length:必ず指定します。バリアント型 (内部処理形式 Long の Variant) を指定します。
取り出す文字列の文字数を表す数式を指定します。0 を指定した場合は、長さ 0 の文字列 ("") を返します。
string 全体の文字数以上の値を指定した場合は、string 全体を返します。
Mid
Mid(string, start[, length])
length:省略可能です。バリアント型 (内部処理形式 Long) の値を指定します。取り出す文字数を指定します。
名前付き引数 length を省略した場合、または文字列内に length より短い文字数しかない場合には、
start から後のすべての文字が返されます。

なのだそうだ。取り出す長さを省略できるかどうかという違いがある。
実際にはセルに入っている文字の長さを調べる事はできるのだが、面倒なのでやらない方針で。
となると、Midを使う事にする。

数式の場合は最初の文字が「=」であって、それ以降は最後まで抜き出せばいいので、

Mid(「セルの数式」, 2)

と書けばいいわけだ。となると、この「セルの数式」を意味するところの変数を宣言してあげなくてはいけない。
前のページで見たように、どうやらFormulaで持ってこれるようなので「myCellFormula」とする。
でもって、型はStringで良さそうなので、Stringで。

これでどうにか数式の機能も実装できそうかな、と思いきや、まだできない。
すべてのセルについて、最初の文字を取り除けばいいというわけではないからだ。
数字が入っていた場合、最初の文字が無くなると全く違う数字になってしまうからだ。

そろそろプログラムを組むのが嫌になってきた?まぁそう言わずに。
こういう処理を何気なくやっている人間の頭の方が凄いんですよ。

最初の文字を調べて、「=」だったらそれを取り除くという処理を加えればいい。
つまり

Left(「セルの数式」, 1)

が「=」だったら最初の文字を取り除く、そういう処理になるわけだ。
ちょっとでもプログラムを書いた経験のある人なら言わずと知れた、ある単語でヘルプを検索するだろう。
で、早速検索してみると、

If...Then...Else ステートメント
式の値に基づいて、条件付きの実行を行うフロー制御ステートメントです。

もう、いろいろと長いのでバッサリ省略。見れば分かるさ。
これで、最初の文字を抜き出して、それが「=」だったらという処理が書けそうだ。

<補足>
ここの処理は、FormulaをIsNumericで判定する方法でも書ける。そっちの方がスマートかも。

随分と長くなってしまったが、これまでの事を考えて、プログラムを改造してみる。
変数の宣言を忘れずに。Variant型は変数の宣言の時に型については書かなくてもいい。

Sub significantFigure2()

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


Set myRange = Application.Selection


For Each c In myRange.Cells '個々のセルを抽出
	myCellFormula = c.Formula
   
	'セルの先頭文字を取得して式か数かを判定。
	'式なら=を除去
	startFrom = Left(myCellFormula, 1)
	If startFrom = "=" Then
		myCellFormula = Mid(myCellFormula, 2)
	End If
        
	'ここで丸めを実行
	c.Formula = "=ROUND(" & myCellFormula & ",1-int(LOG10(" & myCellFormula & ")))"
Next

End Sub

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

ここで、if文の中身の部分については、行頭にタブが2つ挿入してある。
これがタブを挿入するもう1つの役割。

For〜Nextの中身はタブ1つ、その中のif文の中はタブ2つと、ループや判定などがある場合、
どこからどこまでがループ内なのかが分かりにくくなる。
ifよりもEnd Ifが1つ多くなったり、Forに対応するNextが無くなったり。

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


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

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