[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『英数字のみ全角→半角に変更する方法は?』(Kuro)
いつもお世話になっています。 漢字・カタカナ・数字・アルファベットからなる文字列内に、数字・アルファベットに全角・半角が混在しています。 このうち数字・アルファベットのみをすべて半角にしたいのですが方法あるのでしょうか? (カタカナはすべて全角のため、そのままとしたい) ASCでは、カタカナが半角になるのですよね?何か方法ありますか? (カタカナが文字列のどこに入っているかに規則性はありません。) よろしくお願いします。
以下のスレッドは逆にカタカナだけ変更するものですが、条件を変えるだけで使えると思います。 [[20050224103222]]『カタカナ文字だけを全角に変換する方法ありますか?』(JOIN) こんな感じになるかと思います。 Public Function MyStr(Target As Range) As String MYLEN = Len(Target.Value) For i = 1 To MYLEN MyText = Mid(Target.Value, i, 1) MyCode = AscB(MyText) Select Case MyCode Case 16 To 25, 48 To 57, 65 To 90, 97 To 122 MyVal = MyVal & StrConv(MyText, vbNarrow) Case Else MyVal = MyVal & MyText End Select Next i MyStr = MyVal End Function
(川野鮎太郎)
鮎さん、横から失礼しますm(_ _)m
質問者の方は、 >このうち数字・アルファベットのみをすべて半角にしたいのですが方法あるのでしょうか? とのことなので、Selectの範囲が違う気が、、、
Case 16 To 25, 33 To 58, 65 To 90 ではないでしょうか?
(キリキ)(〃⌒o⌒)b まるでイチャモン屋○○○さん見たい〜
範囲が違うって言うか、半角を更に半角にする必要ないってことですね(^_^A;
(川野鮎太郎)
こちらのご近所PGさんの方法でも出来そうです。 (wizik) [[20050106113613]] 『小文字を大文字にしたい』(help)
For i = 1 To MYLEN MyText = Mid(Target.Value, i, 1) MyCode = AscB(MyText) Select Case MyCode Case 16 To 25, 48 To 57, 65 To 90, 97 To 122 MyVal = MyVal & StrConv(MyText, vbNarrow) Case Else MyVal = MyVal & MyText End Select Next i MyStr = MyVal End Function
すると、カタカナは全角のままで数字は半角になりましたが、アルファベット(A、B、C、・・・・)は全角のままです。何が原因??
(Kuro)
σ(^o^;)のレスも見て〜(笑
Select Case MyCode Case 16 To 25, 48 To 57, 65 To 90, 97 To 122 '←ここ MyVal = MyVal & StrConv(MyText, vbNarrow) Case Else MyVal = MyVal & MyText End Select
上記の部分を下記に変更してみてください〜♪ Case 16 To 25, 33 To 58, 65 To 90 (キリキ)(〃⌒o⌒)b
参考までに、数式で処理するものを掲載させていただきます。 (LOOKUP)
A1にデータがあるものとしますと、B1に=BJ1。ここに変換後の文字列が戻ります。 以下作業列です。
C1に=SUBSTITUTE(A1,CHAR(9007+COLUMN(A1)),CHAR(9007+COLUMN(A1)-8960))として、 K1までフィルドラッグ。 J1に=SUBSTITUTE(K1,CHAR(9024+COLUMN(A1)),CHAR(9024+COLUMN(A1)-8960))として、 AK1までフィルドラッグ。 AL1に=SUBSTITUTE(AK1,CHAR(9056+COLUMN(A1)),CHAR(9056+COLUMN(A1)-8960))として、 BJ1までフィルドラッグ。 B1:BJ1を下にフィルドラッグです。
大変申し訳ありませんが、記載に誤りがあります。 こちらと差し替えとさせてください。 C1に=SUBSTITUTE(A1,CHAR(9007+COLUMN(A1)),CHAR(9007+COLUMN(A1)-8960))。 D1に=SUBSTITUTE(C1,CHAR(9007+COLUMN(B1)),CHAR(9007+COLUMN(B1)-8960))、 D1をL1までフィルドラッグ。 M1に=SUBSTITUTE(L1,CHAR(9024+COLUMN(A1)),CHAR(9024+COLUMN(A1)-8960))、 M1をAL1までフィルドラッグ。 AM1に=SUBSTITUTE(AL1,CHAR(9056+COLUMN(A1)),CHAR(9056+COLUMN(A1)-8960))、 AM1をBL1までフィルドラッグ。 B1に=BL1です。 (LOOKUP)
kuroさん、おまたせっ!
>ただ、まだ全角の"−"と"/"が残っています。 追加は、上記2点でいいのかな?
Case 16 To 25, 48 To 57, 65 To 90, 97 To 122 ここを Case 13, 15 To 25, 48 To 57, 65 To 90, 97 To 122 に、変更してください。
(キリキ)(〃⌒o⌒)b
キリキさん、早速の返事ありがとう。ひとつ質問、いいですか? 現在、ずっと↑でのキリキさんからの下記内容でやっています。 >上記の部分を下記に変更してみてください〜♪ >Case 16 To 25, 33 To 58, 65 To 90 これと、すぐ上の回答と少し違うのですけど、最終的に、 > ここを >Case 13, 15 To 25, 48 To 57, 65 To 90, 97 To 122 >に、変更してください。 でいいんですよね?(上げ足取ってるわけじゃなく、本当にわからないんで・・・・・) 説明がまずいかもしれませんが、現在の設定は、 >Case 16 To 25, 48 To 57, 65 To 90, 97 To 122 ではなく、 >Case 16 To 25, 33 To 58, 65 To 90 ですけど・・・・・。 度々すみませんが、宜しくお願いします。 (Kuro)
あっちゃ〜(><) またやっちまった・・・orz ごめんなさい!!
仰る通り!! Case 16 To 25, 33 To 58, 65 To 90 を、 Case 13, 15 To 25, 33 To 58, 65 To 90 です。
本当に、スイマセン(滝汗 (キリキ)(;⌒o⌒)b
いや〜 解決して良かった〜♪ お詫びといっては、何ですが。。。 もし、今後も増やしたいものが有った場合用として、、、
Public Function MyAsc(Target As Range) As String MyAsc = AscB(Target) End Function
使用方法は、 =myasc(A1) などとしてください。 出てきた番号が、対応数値ですので Case 13, 15 To 25, 33 To 58, 65 To 90 に、足してください〜☆
(キリキ)(〃⌒o⌒)b
横から失礼します。 私はマクロど素人ですが、エクセルの置換機能を使って、全角0を半角0に置換、 全角1を半角1に…と、0〜9、A〜Z、a〜zの62文字を対象にマクロで置換 するというのは作りづらいのでしょうか? 0〜9、A〜Z、a〜zは、CODEでは、9008〜9017、9025〜9050、9057〜9082。 0〜 9、 A〜 Z、 a〜 zは、CODEでは、 48〜 57、 65〜 90、 97〜 122なので、 それぞれ8960を引けば良いように思います。 なお、検索対象が存在しないときのエラー処理が必要ですが。 (ちゅうねん)
今回のマクロ(ユーザー定義関数)についてですが、 ちゅうねんさんのお尋ねになっている、 >62文字を対象にマクロで置換するというのは作りづらいのでしょうか?
↑これは難しいことではありません。62回繰り替えせば良いだけですから。 ただ、数文字だけの場合でも62回必ずループさせることになるわけで、
1セルに何文字ぐらい入っているかでやり方は変わるかもしれませんが、 マクロで行う場合、置き換えや検索(Find)は結構処理が重たい方みたい(セルに読み書きするからかな・・・?)なので、
1文字ずつSelect Caseで全角かどうかを調べて、全角だったらvbNarrowで半角に変換って仕組みになっています。
これだとセルに書き込まず、メモリー内(?)で処理できるから軽いってことになるのでしょうか。
こんなので判りますか(;^_^A アセアセ
(川野鮎太郎)
なるほど。 丁寧な説明ありがとうございました。(ちゅうねん)
おもろそうなんで私も寄せておくんなはれ。(笑 文字コードを使わない方法です。 '----------------------- Function kuro(data As Range) Dim i As Integer For i = 1 To Len(data) If Mid(data, i, 1) Like "[A-z]" Or StrConv(Mid(data, i, 1), vbNarrow) Like "[0-9]" Then kuro = kuro & StrConv(Mid(data, i, 1), vbNarrow) Else kuro = kuro & Mid(data, i, 1) End If Next i End Function
え〜と、お訊ねの件ですけど、例えばシート1のA1に元データがあるとして 抽出したいシートの任意のセルに上のばやい=kuro(sheet1!a1)と入力すれば よろしんやおまへんか。 無論、鮎さん、キリキさんのコードも同じですよってに、念のため。 (弥太郎)
弥太郎さん、フォローおおきに〜(笑 ただ〜 まだ全角の"−"と"/"が残っていますから〜〜〜 残念!! と、冗談は置いといて、弥太郎さんのコードを使用する場合での 上記 "−"と"/" を半角にする場合は、どうしたらよろしいのでしょうか? 横から、質問スイマセンm(_ _)m
kuroさんへ、 >今回のVBAはModule2に入れればいいのだと思いますが、その作成法は? こう言う事でしょうか? 1.Alt + F11 で、Microsoft Visual Basic を立ち上げる 2.挿入 → 標準モジュール 3.出てきた Module にコピペ(今回の場合Module2かな?) 元データと抽出したいSheetが同じだったら、今までどおりのやり方 仮にSheetが違う場合でしたら、弥太郎さんが仰っているように =○○(Sheet1!A1) 見たいな感じで出来ますよ〜
>小生、VBAは全くの初心者です。 σ(^o^;)も、初心者ですから〜 切腹!!!
(キリキ)(〃⌒o⌒)b
>Module2にVBA入力し 同じシートで行なっていますか? "#NAME?" が出ているということは、マクロが動いていないということだと思います。 もう一度、Modale2を確認していただけます? 上のコードとあっているかどうかを確認してください。 (キリキ)(〃⌒o⌒)b
おっ、イチャモン屋の新手があらわれましたなぁ。(笑 こういうマクロは律儀に全角文字を1文字1文字検索してっちゅう方法やなしに 半角にしたい全角文字を(このばやい英数、記号)は半角で書かれていようがいまいが すべて半角にしてしまうんでええんとちゃいまっか? 作業時間にさして違いはありますまいに・・・。 とまあ、これはせこさが売りモンの弥太郎流マクロですけどな。(笑 (弥太郎) '-------------------------------- Function kuro(data As Range) Dim i As Integer Dim rep_data For i = 1 To Len(data) rep_data = StrConv(Mid(data, i, 1), vbNarrow) If rep_data Like "[A-z]" Or rep_data Like "[0-9]" Or rep_data Like "[?=_@*></-]" Then kuro = kuro & rep_data Else kuro = kuro & Mid(data, i, 1) End If Next i End Function
弥太郎さん、ありがとうございます。 なるほど〜 Like演算子に組込んで、 "[?=_@*></-]"で、条件を増やせばいいんですね〜 またまた、勉強になりました〜♪ ありがとうございます。 (キリキ)(〃⌒o⌒)b
キリキさん、現在以下の様になっています。
<Module1>
Public Function MyStr(Target As Range) As String
MYLEN = Len(Target.Value)
For i = 1 To MYLEN MyText = Mid(Target.Value, i, 1) MyCode = AscB(MyText) Select Case MyCode Case 13, 15 To 25, 33 To 58, 65 To 90 MyVal = MyVal & StrConv(MyText, vbNarrow) Case Else MyVal = MyVal & MyText End Select Next i MyStr = MyVal End Function
<Module2>
Public Function MyAsc(Target As Range) As String MyAsc = AscB(Target) End Function
<Sheet1>
A1;文字列入力用に空欄、B1;"=MyStr(A1)"
<Sheet2>
A1;文字列入力用に空欄、B1;"=MyAsk(A1)"
この状態で、Sheet1は機能しますが、Sheet2はB1に数式を入れただけで"#NAME?"と表示された状態です。尚、VBAはコピペですから間違ってないはずです。どこが悪いのでしょうか?宜しくお願いいたします。(Kuro)
Kuroはん >抽出したいシートの任意のセルに上のばやい=kuro(sheet1!a1)と入力すれば よろしんやおまへんか。 無論、鮎さん、キリキさんのコードも同じですよってに、念のため。 と、お教えしましたやろ?(笑 Sheet1に元データがあってSheet2に変換データを求めたい時はそれが欲しいセルに =mystr(sheet1!a1)とかけばよろしいんでっせ。 もちろん、同じSheet2に元データがあるばやいは=mystr(a1)といった塩梅に書きます。 それと、キリキせんせえが作ったMyAskの関数はこの際必要おまへん。 抽出してもなんのこっちゃ分かりまへんやろ。 まぁ、気長にやってみてくらはい(弥太郎)
MyAsk ではなく、 MyAsc です。 (wizik)
弥太郎さん、wizikさん、フォローどうもスイマセン。。。
>MyAskの関数はこの際必要おまへん。←(MyAsc) kuroさん、確かに弥太郎さんが仰る通り、あんまり必要ないと思います。 全角から半角にする対象が増えたときに、調べるのにあったら便利かな〜 と、思った次第ですが、これ以上増えないようでしたら必要ないと思います。
追伸:弥太郎せんせぇへ >キリキせんせえ は、やめてくだせ〜m(_ _)m (キリキ)(;⌒o⌒)b
まぁ、二人揃うてひとの揚げ足とりおってからにもう腹んたつ・・・(笑
>キリキせんせえ は、やめてくだせ〜m(_ _)m
はい、承知いたしました、キリキせんせえ。ありっ?
(弥太郎)
MyStr関数で今後も殆ど問題ないと思いましたが、文字に対する数値(なんと呼ぶのでしょう?)を知るためにもやってみました。この文字数値一覧は、この関数でやらないとすればどこで調べればいいのですか?
弥太郎さんの方式(但し、"kuro"は"hankaku"に変更しましたけど・・・・・)でもやりました。
出来ました。
皆さん、有難うございました。また別スレでお会いしましょう。と、言っても、教えて頂くばかりですけど・・・・・。今後も宜しくお願いします。(Kuro)
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.