
大量のデータを処理しなくてはならないのですが、ときどき送られてくるエクセルでデータに使われるEを含んだ記号文字列が数値になり、しかも下記のような表示に化けてしまってます。()内は数値です。
201E2⇒2.01E+04(20100)
803E7⇒8.03E+0.9(8030000000)
903E9⇒9.03E+11(903000000000)
最初から文字列で入れてくれればこんなことにはならないと思うのですが、お客様あってのことなのであまり強くは言えません。やむをえず一つずつ調べてこちらで修正をしています。
これを関数あるいはVBAで一括変換する方法はないでしょうか?
No.8ベストアンサー
- 回答日時:
>=LEFT(A1,3)&"E"&LEN(""&A1)-3
>式の意味はわかりますが、なんでこれで変換できるのかわかりません。教えていただけますか?
指数表示になっていても、(内部的には?)質問文のカッコの中の数字になっているので、
20100
8030000000
の様になっていると考えられます。
もともとのフォーマットから数値として有効なのは最初の3桁だけなので、
LEFT(A1,3)で文字列と見立てて最初の3文字を取り出せます。
あとは、付けられた0の数を数えれば良いのですが、
201E2→20100の様に、数値の部分以外は0ですから、
全体の文字数から3文字を引けば、付けられた0の数が分かります。
No.13
- 回答日時:
ANo.#12 の「お礼」に対して。
やはり何処かでTextデータをExcelに変換させていたようですね。 相手先の入力は恐らく、201E2 のようになっているのでしょう。
今後もこのデータを受け取り、こうした変換を続けるようであれば、相手先に事情を説明して、CSV形式で貰える様にされた方が、お互いに合致するデータを保有することで、健全な解決法だと思います。
ちょっと、立ち入りすぎましたか? 失礼。
そうですね、今後のことを考えると、小細工をするより「健全な解決法」を目指したほうが良いのだとは思います。
努力してみます。
ご親切にありがとうございました。
No.12
- 回答日時:
このコンテンツは色々と教えてもらうことがありました。
ANo.#1:
A1=2.01E+04
B1=INT(LOG(A1))-2
C1=TEXT(A1/(10^B1),"0")&"E"&B1
演算子「&」は文字列データでなくても連結できてしまう。(セルB1は数値データである。)
(セルA1は数値20100でも、文字列201E2、2.01E4のいづれであっても、B1、C1は正しく計算される。)
ANo.#2:
=LEFT(A1,3)&"E"&LEN(""&A1)-3
文字列関数 LEFT、LEN の引数に、文字列データでないデータを指定できる。
ANo.#3:
=LEFT(TEXT(A1,"0"),3)&"E"&LEN(TEXT(A1,"0"))-3
ANo.#2の例から、TEXT関数で変換する必要は無い。
ANo.#4:
>それって、Textファイルとか、CSVとかではありませんか?
わたしもそう思う。エクスプロラーでCSVファイルをダブルクリックしたり、Excelのメニューバー[ファイル]-[開く]
とかツールバー「開く」ボタンでCSVファイルをExcelに読み込ませると元が201E2となっていても
2.01E+04と表示されてしまう。
Excelのメニューバー[データ]-[外部データの取り込み]-[テキストファイルのインポート]で該当する列を
文字列に指定すればこの問題は生じない。
Sub 指数変換()について
c.Value = Format(x / (10 ^ (Int(x) - 2)), "0") & "E" & Int(x) - 2
は ↑
c.Value = Format(c.Value / (10 ^ (Int(x) - 2)), "0") & "E" & Int(x) - 2
の間違いでしょう。
ANo.#5:
Function 指数形式を文字列変換() を Sub 指数形式を文字列変換()、End Function を End Sub と直すと
動いた。でも、2.01E+04 が文字列データだと勘違いしている、201E2 にも変換されない。 回答になっていない。
ANo.#6:
=LEFT(A1,FIND("E",A1)-1)*POWER(10,RIGHT(A1,LEN(A1)-FIND("E",A1)))
これも2.01E+04 が文字列データだと勘違いしている。文字列2.01E+04が20100となるだけ。 論外。
ANo.#7:無視
ANo.#8:略
ANo.#9:
buf = Application.Substitute(Format$(c.Value, "000E+0"), "+", "")
表示形式を"000E+0"と直すことがオーソドックスで良いと思う。
ANo.#10:略
総括:
ANo.#4の「お礼」にあるmerlionXX さんのSub 指数変換()とANo.#9のコードを結合したものが一番使い易いと感じます。
くわしく解説していただき、ありがとうございました。
> c.Value = Format(c.Value / (10 ^ (Int(x) - 2)), "0") & "E" & Int(x) - 2
の間違いでしょう。
はい、ご指摘の通りでした。
それから元データはCSVやtxtじゃありません。
ホストコンピュータ(?)から取り出したデータをエクセルとして送付されてくるものです。
No.10
- 回答日時:
>If Not IsError(rtn) Thenは "rtn" がエラーじゃない場合って意味ですよね?
>"rtn"って何ですか?
最初に、私のコードには、変数の宣言が抜けていますね。(^^;
Dim rtn As Variant
それで、英語の"return" の省略形で、「戻り値」のつもりです。
If で、「+」が入っているかチェックしているのだから、エラーがあるはずはないのですが、念のために入れました。これは、1つのパターンですからね。
変数に入れられるものは、Substitute の戻り値とエラーの二種類のタイプが入ります。だから、Variant型になります。
なお、みなさん、関数で処理されているのに、元の場所に、上書きしてよいのかなって、後で気がとがめたのですが、悪ければ、Offsetや、他のシートに写してくださいね。
ほんとに何度もありがとうございます。
変数の宣言のことじゃなくて、rtnにはどこで代入されているのか疑問なんです。
Substitute の戻り値ならbufじゃないんですか?
よくわかってないのにすみません。
No.9
- 回答日時:
merlionXXさん、こんなのどうですか?
Logを使うよりも、元が文字列だったら、Excelが自動キャストした過程を考えて、戻したほうが、手っ取り早いような気がしますね。もしも、本当に指数表示だったら、責任は持てないけれどね。(^^;
Sub Exponent2Text()
Dim Rng As Range
Dim c As Range
Set Rng = Selection 'マウスで選択
Dim buf As String
For Each c In Rng
With c
If InStr(.NumberFormatLocal, "E+0") > 0 Then
buf = Application.Substitute(Format$(c.Value, "000E+0"), "+", "")
If Not IsError(rtn) Then
.NumberFormatLocal = "@"
.Value = buf
End If
End If
End With
Next c
End Sub
ほんとうにいつもありがとうございます。
なあるほど、こうやればいいんですね。
最後に一つだけ教えてください。
If Not IsError(rtn) Thenは "rtn" がエラーじゃない場合って意味ですよね?
"rtn"って何ですか?
何度もすみません。
No.5
- 回答日時:
VBAで作ってみました。
(分りやすく作ったつもりです)
適当にアレンジすれば、使えると思います。
Function 指数形式を文字列変換()
Dim strSs As String
Dim StrMoji As String
Dim inCom As Integer
Dim inPlus As Integer
'まず、数値を指数形式で文字列に格納します。
strSs = Format(ActiveSheet.Cells(1, 1).Value, "0.00E+00")
'コンマの位置を調べます
inCom = InStr(1, strSs, ".", vbTextCompare)
'プラスの位置を調べます
inPlus = InStr(1, strSs, "+", vbTextCompare)
'コンマとプラスを除いて、文字列を取り出す。
StrMoji = Left(strSs, inCom - 1) & _
Mid(strSs, inCom + 1, inPlus - inCom - 1) & _
Mid(strSs, inPlus + 1, Len(strSs) - inPlus)
'セル書式を文字列に。
ActiveSheet.Cells(1, 1).NumberFormatLocal = "@"
'もとの位置に戻す
ActiveSheet.Cells(1, 1).Value = StrMoji
End Function
ありがとうございます。
Sub Functionの使い方がよくわかりません。
そのため試すことができませんでした。
すみません。
No.4
- 回答日時:
merlionXXさん、こんにちは。
>最初から文字列で入れてくれればこんなことにはならないと思うのですが、この質問は良く見ますね。
ちょっと確認ですが、もしかしたら、それって、Textファイルとか、CSVとかではありませんか?それとも、相手の方が、Excelの標準方式で直して送ってきているとか?
ただ、関数で解決できるようだったら、私はパスしますが、VBAでも考えてみたいと思います。
Wendy02さん、いつもお世話になりありがとうございます。
ええ、作業の途中段階なのでVBAで処理したいです。
No1さんに教えていただいた関数をもとに以下のようなVBAを書きました。ただ、学生時代から数学が苦手で、LOGなんて何がなんだかさっぱりわからず、あってるかどうか自信がありません。見ていただけたら幸いです。
Sub 指数変換()
Dim c As Range
For Each c In Range("D:D")
If c.NumberFormatLocal = "0.00E+00" And IsNumeric(c) Then
x = Application.WorksheetFunction.Log(c.Value, 10)
c.NumberFormatLocal = "@"
c.Value = Format(x / (10 ^ (Int(x) - 2)), "0") & "E" & Int(x) - 2
End If
Next
End Sub
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Excel(エクセル) マクロだと数式が表示される 2 2022/09/10 14:48
- Excel(エクセル) Excelで、別シートの表のステータスに伴った動的な自動転記をしたいです。 2 2023/06/14 15:56
- Excel(エクセル) Indirect関数について、Formulatextで抽出した数式を参照したい。 1 2022/12/15 11:16
- Excel(エクセル) フォルダ内のエクセルファイルを開かずにデータ採取する関数式 2 2022/12/22 22:15
- Excel(エクセル) アウトラインの小計のやり方 1 2023/03/20 11:51
- Visual Basic(VBA) VBAで、特定の文字より後を削除して残った数値を文字列に変換と特定の文字より前も削除したい 3 2022/04/15 19:21
- Excel(エクセル) 表示形式、文字列セル(列)に数式を入力するには マクロ 1 2022/09/18 10:53
- Excel(エクセル) ある数値に対して、値を返す数式についてです 2 2022/09/13 22:06
- Excel(エクセル) Excelの関数についておしえてください。 3 2023/04/20 18:36
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルでアルファベットか数...
-
EXCELで=より左の文字を一括で...
-
VBAでの Replace関数で、ワイル...
-
16表記の文字列を数字に直した...
-
エクセルで文字列の最大値を抽...
-
エクセルでSQLでいうところの「...
-
【Excel VBA】複数ある特定の文...
-
VBA2005 16進を2桁で表示したい。
-
vbsからバッチファイル実行時の...
-
Access2000 (VBA) ' & "など...
-
Excelで3E8を3.00E+8にしない方...
-
VBの「As String * 128」とは?
-
ORCLEでの小数の表示方法の変更...
-
VB6.0のString関数に代わるVB20...
-
エクセル 数値データを桁をそ...
-
C++のdefine文の使い方の質問で...
-
テキストエディタ 検索、置き換...
-
LEFT関数で文字数を指定しない...
-
bashスクリプトでの文字列から...
-
変数に入れた文字列(定数)で書...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルでアルファベットか数...
-
EXCELで=より左の文字を一括で...
-
文字列からタブコードを取り除...
-
VBAでの Replace関数で、ワイル...
-
エクセルで文字列をtxtファイル...
-
【Excel VBA】複数ある特定の文...
-
エクセル 数値データを桁をそ...
-
Excelで3E8を3.00E+8にしない方...
-
VBA2005 16進を2桁で表示したい。
-
エクセルで文字列の最大値を抽...
-
同一セル内に関数と文字列を同...
-
Left関数とRight関数を合わせた...
-
Excelで指数表現しないようにす...
-
MS SQLServer のSQLで文字列の...
-
VBの「As String * 128」とは?
-
エクセルでセル内の文字列の最...
-
ORCLEでの小数の表示方法の変更...
-
bashスクリプトでの文字列から...
-
LEFT関数で文字数を指定しない...
-
アクセスで特定の数字以外(複...
おすすめ情報