2010年1月23日
そこで再びヘルプを見る。「インデックス/一覧」→「文字列操作に関するキーワード一覧」をじ〜っと眺めてみると
「Left」と「Mid」という使えそうなメソッドが見つかる。それぞれを見ると、
|
|
であるらしい。簡単に言うと、Leftは文字列の左から何文字か、Midは文字列の真ん中を何文字か抜き取るらしい。
これだけ見るとどちらでも良さそうで判断がつかないので、もう少し先まで見てみる。
|
|
なのだそうだ。取り出す長さを省略できるかどうかという違いがある。
実際にはセルに入っている文字の長さを調べる事はできるのだが、面倒なのでやらない方針で。
となると、Midを使う事にする。
数式の場合は最初の文字が「=」であって、それ以降は最後まで抜き出せばいいので、
Mid(「セルの数式」, 2)
と書けばいいわけだ。となると、この「セルの数式」を意味するところの変数を宣言してあげなくてはいけない。
前のページで見たように、どうやらFormulaで持ってこれるようなので「myCellFormula」とする。
でもって、型はStringで良さそうなので、Stringで。
これでどうにか数式の機能も実装できそうかな、と思いきや、まだできない。
すべてのセルについて、最初の文字を取り除けばいいというわけではないからだ。
数字が入っていた場合、最初の文字が無くなると全く違う数字になってしまうからだ。
そろそろプログラムを組むのが嫌になってきた?まぁそう言わずに。
こういう処理を何気なくやっている人間の頭の方が凄いんですよ。
最初の文字を調べて、「=」だったらそれを取り除くという処理を加えればいい。
つまり
Left(「セルの数式」, 1)
が「=」だったら最初の文字を取り除く、そういう処理になるわけだ。
ちょっとでもプログラムを書いた経験のある人なら言わずと知れた、ある単語でヘルプを検索するだろう。
で、早速検索してみると、
|
もう、いろいろと長いのでバッサリ省略。見れば分かるさ。
これで、最初の文字を抜き出して、それが「=」だったらという処理が書けそうだ。
<補足>
ここの処理は、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 |
主な変更点は以下の通り。
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]