- ベストアンサー
エクセルでの桁数の違う小数の表示方法?
エクセルでの小数点以下の桁数が異なる数字で四捨五入して連続する0以外の数字が2桁までに表示する方法を教えてほしいのですが・・・ 説明の仕方がわかりずらいので例をあげると、 1.25なら1.3 0.2274なら0.23 0.000304なら0.0003 となるようにしたいのですが、それぞれ桁数が違うので一度にできません。A4サイズで100以上あるので最初に設定するか、範囲指定をすべての数字にして一度で変換するする方法がよいのですが・・・ よろしくおねがいします。
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
#1 Cupperです ANo.2で maron--5さんが自分の回答に対する補足的な回答している方法では駄目でしょうか # まさか関数でできるとは思っていませんでした # maron--5さん流石です 解説してみます TEXT(A1,"0.0E+0") これでA1セルの数値を有効桁2桁の指数形式の文字列に変換します 「0.0」 というのが有効桁数です これを 「0.00」とすると有効桁が3桁になります この時点では指数形式の文字列で表示されます TEXT(A1,"0.0E+0")*1 数値と判断できる文字は数値に直すことなく計算することができる Excelの機能を利用して 四則演算(この場合掛け算)を行うことで文字列を数値化します 1を掛けているので数値的に変わることなく文字列が数値に変わっています この段階でセル幅に収まる桁数であれば指数形式から少数形式の表示になります 指数形式になるときは B列の幅を広げてください =IF(A1="","",TEXT(A1,"0.0E+0")*1) B列のセルに対するA列のセルが空白であった場合、TEXT関数はエラーを返しますので その対策として、A列のセルが空白であった場合 TEXT関数を使用せず空白を表示するよう IF関数を設定しています この数式をB1セルに入力してB1セルを必要な数だけ下にコピーします B1セルの上にある列を示す 「B」 をクリックしてB列を全体を選択してから Ctrlキーと Dキーを同時に押してもOK B列の最後の行までB1セルが一瞬でコピーできます ※B1セルからB3セルを選択して Ctrl+Dキーを同時に押すとB1からB3まで連続してコピーされます 応用してください こんなんですけどどうでしょう - チョットだけ苦言 - やはりマクロを作る(作ってもらう)時間で100や200のセルを個別に修正できたと思います
その他の回答 (7)
? MyRound(1.08) 1.1 これも誤りで 1.08 が正解ならば、条件を満たさない場合は処理しなきゃいい。 つまり、P() 以外に計算除外判定関数を作ればいいです。 [イミディエイト] ? MyRound(0.28) 0.28 ? MyRound(0.0933) 0.093 ? MyRound(0.0311) 0.031 ? MyRound(0.0103) 0.01 ? MyRound(1.25) 1.3 ? MyRound(0.2274) 0.23 ? MyRound(0.000304) 0.0003 ? MyRound(1000.156) 1000.16 ? MyRound(1000.1) 1000.1 あらためて全てテストした結果です。 Public Function NoRound(ByVal S As String) As Boolean Dim I As Integer Dim J As Integer Dim L As Integer Dim T As String T = Replace(S, ".", "") L = Len(T) For I = 1 To L J = J - (Mid(T, I, 1) <> "0") - (J > 0 And (Mid(T, I, 1) = "0")) Next I NoRound = CBool(J < 3) End Function しかし、まだ、何か違ったケースがありそうな・・・。 しかし、仮にOKだとしても MyRound() が複雑化しましたね。 Public Function MyRound(ByVal M As String) As Currency If P(M) <> 0 And Not NoRound(M) Then MyRound = Rounds(CCur(M), 0, P(M)) Else MyRound = M End If End Function こういう関数です。
お礼
回答ありがとうございます。 いろいろと書いていただいて申し訳ないのですが 素人なもので理解できません。 もうすこし勉強します。
[イミディエイト] ? MyRound(0.28) 0.3 ? MyRound(0.0933) 0.093 ? MyRound(0.0311) 0.031 ? MyRound(0.0103) 0.01 先の関数 P() ではこのような結果になります。 ? MyRound(1.25) 1.3 ? MyRound(0.28) 0.3 --> 0.28 小数点以下の桁数が異なる数字で四捨五入して連続する0以外の数字が2桁までに表示する方法を教えてほしいのですが・・・ <小数点とか関係なく0以外の数字の並びは2桁>ということかな? ならば、P() をそのように修正すればいいです。
お礼
回答ありがとうございます。 いろいろと書いていただいて申し訳ないのですが 素人なもので理解できません。 もうすこし勉強します。
エクセルは操作したこともない門外漢ですので外しているかもです。 [イミディエイト] ? MyRound(1) 1 ? MyRound(1.25) 1.3 ? MyRound(0.2274) 0.23 ? MyRound(0.000304) 0.0003 と、今、4つだけテストしてみましたが、こういう結果を得たいのでしょうか? Rounds(値、0=四捨五入:1=切り捨て:2=切り上げ、丸めた後の小数部の桁数) ? Rounds(0.2274, 0, 3) 0.227 ? Rounds(0.2274, 0, 2) 0.23 ? Rounds(0.2274, 0, 1) 0.2 ? Rounds(0.2274, 0, 0) 0 と、いうことは以下の Rounds 関数で適当な<丸めた後の小数部の桁数>を指示すること。 ? P(1) 0 ? P(1.25) 1 ? P(0.2274) 2 ? P(0.000304) 5 仮に、このような関数 P() を用意すれば何とかなりそうです。 Public Function Rounds(ByVal M As Currency, _ ByVal A As Integer, _ Optional D As Integer = 0) As Currency Rounds = Sgn(M) * Fix(Abs(M) * 10 ^ D + Abs((A = 0) * 0.5@ + (A = 2) * (Int(M * 10 ^ D) <> (M * 10 ^ D)))) / 10 ^ D End Function Public Function P(ByVal S As String) As Integer Dim I As Integer Dim J As Integer Dim K As Integer Dim L As Integer S = CutStr(S, ".", 2) L = Len(S) K = 0 If Len(S) Then For I = 1 To L If Mid(S, I, 1) <> 0 Then J = J + 1 If J = 2 Then K = I Exit For End If End If Next I P = IIf(K = 0, L - 1, K + (K = L)) Else P = 0 End If End Function Public Function CutStr(ByVal Text As String, _ ByVal Separator As String, _ ByVal N As Integer) As String Dim strDatas() As String strDatas = Split("" & Separator & Text, Separator, , 0) CutStr = strDatas(N * Abs((N <= UBound(strDatas)))) End Function さて、ここまで書けば、関数 MyRound() は書けるんじゃないでしょうか? そこまで書けば丸投げ禁止事項に違反する可能性も・・・。 ヒントは、関数 P() が Currency ではなく String で受け渡していることです。 ※さて、たかだか4つのテストで成功したからって安心できないのがエクセル。 ※VBやAccess では問題なく動くと断言できますが、そうはいかないのがエクセル。 ※そこら辺りは自己責任で・・・。
お礼
回答ありがとうございます。 いろいろと書いていただいて申し訳ないのですが 素人なもので理解できません。 もうすこし勉強します。
=ROUND(A1,-LOG(A1)+2-1*(LOG(A1)>2))
お礼
回答有難うございます。 なんとか解決できました。
- molly1978
- ベストアンサー率33% (393/1186)
表示として設定することはできないと思いますが、 有効数字2桁にすることはできます。 元のセルをA1とすると、 =ROUND(A1/10^INT(LOG10(A1)),1)*10^INT(LOG10(A1))
お礼
回答有難うございます。 なんとか解決できました。
- maron--5
- ベストアンサー率36% (321/877)
A B 1 1.25 1.3 2 0.2274 0.23 3 0.000304 0.0003 B1=IF(A1="","",TEXT(A1,"0.0E+0")*1) ★下にコピー
お礼
回答有難うございます。 なんとか解決できました。
補足
回答ありがとうございます。 素人なので皆さんの回答では応用が効かないのでもう少し具体 敵に説明します。 A 1 0.28 0.28 2 0.0933 これを 0.093 となるように 3 0.0311 0.031 4 0.0103 0.01 有効数字が四捨五入されて二桁でA1の数字をA4まで上から順に3で割る様にしたいのですが・・・ わかりずらい説明ですいません
- Cupper
- ベストアンサー率32% (2123/6444)
残念ですがすべてのセルに対して設定ひとつでできることではありません ひとつずつ行うかマクロを作りましょう ※マクロを作る時間と労力でひとつずつ処理ことができますよ 同じ項目として扱うデータであれば、数学的に捉らえるならば有効桁を決めて指数形式で表示することをお奨めします
お礼
回答有難うございます。 なんとか解決できました。
補足
回答ありがとうございます。 素人なので皆さんの回答では応用が効かないのでもう少し具体 敵に説明します。 A 1 0.28 0.28 2 0.0933 これを 0.093 となるように 3 0.0311 0.031 4 0.0103 0.01 有効数字が四捨五入されて二桁でA1の数字をA4まで上から順に3で割る様にしたいのですが・・・ わかりずらい説明ですいません。
お礼
回答有難うございます。 なんとか解決できました。