yoshiharuk1188
@yoshiharuk1188

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

excel 1桁の数を全角 2桁以上を半角にしたい。 No VBA

excelでデータを加工する際の方法について質問させていただきます。
内容は文書内の数字を1桁の数字は全角のまま。2桁以上の数字は半角へ変換する方法です。
職場の縛りでVBAや別のアプリは不可なので関数で考えています。(Wordはアリらしいですがデータ取得がCSVファイルで複数取得するもののため、出来たらexcelで行う方法を考えています)

一例として:
1:東京都港区六本木1丁目 22番地 333階 とデータを取得する(数値は全て全角で取得される)

2:式=asc(東京都港区六本木1丁目 22番地 333階)で数値を全て半角にする(2桁ならば半角のままにするため)

3:式=SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(東京都港区六本木1丁目 22番地 333階,"1","1" ),"2","2"),"3","3")・・・【4~9も入れましたが省略します】
*この関数で1丁目の1は全角のまま 22番地は半角の「22」 333階は半角の「333」に変換する事が出来ないかと思いました。

4:別のセルに「東京都港区六本木1丁目 22番地 333階」と出力する

駄目だった点:
・SUBSTITUTE関数では数字をそのまま変換することはできるようですが、1桁か2桁以上かの区別がつかないようです。

・何か別の関数で制御する方法があれば教えてください。
・または全く別の方法があれば教えてください。

よろしくお願いします。

0

3Answer

一旦できたので結果報告。
文字列を1文字毎に1セルへ分解して、1行へ展開(ミッド関数で地道に一個ずつ抜き出すことにしました。住所のため抜き出す数は100字にしました。

B1に住所(東京都港区六本木1丁目 22番地 333階)入れましたので関数の引用はそれに基づいて書きます。

=mid(B1,1,1)から[b2]
=mid(B1,100,1) [b101]まで
(字数が抜き出したい住所超えている場合は空欄になりました。結合時助かる)

下の段にセル毎に数字かどうかを判定する関数を作成(分解した文字を=ISNUMBER(VALUE(b2))[c2]とやると1か0になる。それを全部の行やる。

更に下の段に自身が数字で、かつ、前後のセルが数字でないなら単独の数字と判定しそのまま出力、前後に数字があれば半角で出力
(=IF(c2 = 0,C2,IF(OR(B2 =1 , D2 =1),ASC(C2),C2)))

1行分のセルを結合して文字列に戻す(textjoinできた)

こんな感じでした。セルの番号などもしかしらずれているかもしれないので調整して下さい。
自分の必要なのは200くらいの住所なので
200×100(分解)×3行の約6万業に関数入れることになりそう。

動くか不安な感じですが、別用途で使う方ご参考に・・・。
職場の規制が厳しいと大変。

1Like

ごめんなさい。
手元にExcelがなくて検証できないので、アイデアだけになります。

配列数式を使う方法

  • 文字列を1文字毎の配列に分解
  • 要素毎に
    • 数字かどうかを判定
    • 自身が数字で、かつ、前後の要素が数字でないなら単独の数字と判定
    • 判定に基づいて要素の文字種を変換
  • 配列要素を結合して文字列に戻す

要素の結合の点で実現が怪しいです。(TEXTJOINが配列を結合してくれるか不明)

シートを使う方法

  • 文字列を1文字毎に1セルへ分解して、1行へ展開
  • セル毎に
    • 数字かどうかを判定
    • 自身が数字で、かつ、前後のセルが数字でないなら単独の数字と判定
    • 判定に基づいて自身の文字種を変換
  • 1行分のセルを結合して文字列に戻す

1列分の文字列を変換するために、同じ行数の1シートを使用します。


Googleスプレッドシートなら正規表現が使えるのに…

0Like

tetr4lab.さん回答ありがとうございます。すみません。未だ試行錯誤中です。途中経過投稿します。
ご提案いただいたシートを使う方法やってみました。

文字列を1文字毎に1セルへ分解して、1行へ展開(できた)
セル毎に数字かどうかを判定(分解した文字をisnumberで判定したらできた)

自身が数字で、かつ、前後のセルが数字でないなら単独の数字と判定(考え中)
判定に基づいて自身の文字種を変換(考え中)

1行分のセルを結合して文字列に戻す(textjoinできた)

判定方法の部分が中々難しいのでまた調べてみます。ありがとうございます。

0Like

Your answer might help someone💌