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

Excelで有効数字

2010年1月23日


9.もっとユーザーフレンドリーに

これで、2桁→3桁、3桁→2桁に変換するときは、それぞれ、

significantCancel→significantFigure3
significantCancel→significantFigure2

と実行すればいい。

・・・・

地味に面倒くさいぞ!

これを面倒くさいと感じるかどうかは、個々人による部分が大きいかもしれないが、
もし、2桁→3桁や3桁→2桁に直接変換できれば、それはそれで便利そうな気がする。

便利そうな気がしたら仕様に加えるしかない。
なぜそうなるのかは聞いてはいけない。便利そうだから、それ以上の理由なんてない。

さぁやる事が決まったら、あとはヘルプとのにらめっこ。
significantFigure2やsignificantFigure3を実行した時に、 significantCancelというサブルーチンを実行すれば全てが解決する。

ヘルプを眺めて見つけたのが、

Call
Call] name [argumentlist]
Sub プロシージャ、Function プロシージャ、ダイナミック リンク ライブラリ (DLL) プロシージャに
制御を渡すフロー制御ステートメントです。

むむむ。今はプロシージャと言うのか?まぁいいや、サブルーチンでもどっちでも。
とりあえず、これで呼び出せそうだ。

で、ここでちょっと気にしたいのが、宣言した変数がどこまで有効なのか、という事。
グローバルなのかローカルなのか、と書いた方が分かる人がいるかもしれない。

つまり、significantCancelとsignificantFigure2では同じ名前の変数を使っているのだ。
それぞれのところで代入しなおしているから問題は起こさないだろうが、ちょっと気になる。
変な値が変数に残っていてエラーが出ても困るし。

そこでヘルプでDimを見てみると

Dim
Dim ステートメントを使ってモジュール レベルで宣言された変数は、
宣言したモジュール内のすべてのプロシージャから参照できます。
プロシージャ レベルで宣言した変数は、宣言したプロシージャ内でのみ参照できます。

とある。今はプロシージャの中で宣言しているので、プロシージャが変われば別の変数として扱われるという事。
つまり、全く問題ないという事だ。
という事で、これをそれぞれのサブルーチンの中に放り込んで最初に呼び出せばいい。
ちょっと長くなるが、全文を掲載する。

Sub significantFigure2()

Call significantCancel 'roundの重複を避ける為に一度呼び出す。

'有効数字を2桁に

'変数の定義
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



Sub significantFigure3()

Call significantCancel 'roundの重複を避ける為に一度呼び出す。

'有効数字を2桁に

'変数の定義
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 & ",2-int(LOG10(" & myCellFormula & ")))"
	End If
End If

Next

End Sub



Sub significantCancel()
'有効数字をキャンセル

'変数の定義
Dim myRange As Range
Dim myCellFormula As String
Dim commaPosition '式中のコンマの位置。variant型


Set myRange = Application.Selection


For Each c In myRange.Cells 'セルを抽出
	myCellFormula = c.Formula

	If Mid(myCellFormula, 1, 7) = "=ROUND(" Then '=ROUND(以外のセルをエスケープ

		commaPosition = InStr(myCellFormula, ",") 'コンマの位置を取得

		'=ROUND(を除いた8文字目からコンマ前までを取得
		If IsNumeric(Mid(myCellFormula, 8, commaPosition - 8)) Then
			c.Value = Mid(myCellFormula, 8, commaPosition - 8) '数字であればそのまま代入
		Else
			c.Formula = "=" & Mid(myCellFormula, 8, commaPosition - 8) '式であれば最初に=をつけて代入

		End If
            
	End If
Next

End Sub

これでひとまず完成!
鼻息も荒く、数日使っていたのだが、ふとある事実に気付いてしまったのだ。
「もっと苦しめ」という悪魔の囁きが聞こえてきた・・・。


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

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