[[20050504120228]] 『英数字のみ全角→半角に変更する方法は?』(Kuro) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『英数字のみ全角→半角に変更する方法は?』(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) 


以下でやってみました。(VBAは全くの素人です。)
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

すると、カタカナは全角のままで数字は半角になりましたが、アルファベット(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を下にフィルドラッグです。

キリキさん>すみません。後でやってみます。
LOOKUPさん>J1に入力すると、K1までドラッグした際にK1に入力されたものが消えますがいいのでしょうか?又、毎回ドラッグはやめたいので、A1に入力すれば変換後の文字がB1に表示されるシート(テンプレート)を作りたいのですが・・・・・。
(今すぐ確認できる状況にないので、確認前にここに書いてしまいましたけど・・・・)
(Kuro)

 大変申し訳ありませんが、記載に誤りがあります。
 こちらと差し替えとさせてください。                  
 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)

返事が遅くなりすみません。
>LOOKUPさん
出来ました。しかし、変換したいデータが4万行あるため、数式をコピーしている途中で「メモリーが足りません」と表示され、一括処理が不可能なためキリキさんの手法で実施しました。でも、数式で出来るのがわかり勉強になりました。有難うございました。
>キリキさん
出来ました。有難うございました。ただ、まだ全角の"−"と"/"が残っています。特に"−"は、住所番地記載部分(例;2−3−5)にあるため大量に有ります。どうすれば良いか教えてください。宜しくお願いします。
(Kuro)

 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

やってみました!出来ました!感激です!
キリキさん、有難うございました。
(Kuro)

 いや〜 解決して良かった〜♪
 お詫びといっては、何ですが。。。
 もし、今後も増やしたいものが有った場合用として、、、

 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 アセアセ

 (川野鮎太郎)

 なるほど。
 丁寧な説明ありがとうございました。(ちゅうねん)

キリキさん、有難うございます。
さっそくの質問で申し訳ないのですが、小生、VBAは全くの初心者です。
見よう見まねでここまでは出来たのですが、以下が分かりません。
今、シート1のA1,A2で当初の英数字半角変換をやるようなっています。また、VB.EditorのModule1に最初の半角変換VBAが書かれています。
で、今回教えて頂いた対応数値確認シートをシート2のA1,A2で出来るようにしたいのですが、その場合、上記の対応数値確認VBAはどこに入れればいいのですか?
ModuleはBook全体で共用なのですか?今回のVBAはModule2に入れればいいのだと思いますが、その作成法は?すみません初心者で。初心者に分かるように教えていただければ幸いです。おんぶに抱っこでごめんなさい。宜しくお願いします。(Kuro)

 おもろそうなんで私も寄せておくんなはれ。(笑
 文字コードを使わない方法です。
 '-----------------------
 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

キリキさん、親切な返事有難うございます。さっそくやってみました。
新規シートで、A1;変換文字列入力セル,B1;変換対象数値確認とし、Module2にVBA入力し、セルB1に "=MyAsc(A1)" と入力したところセルB1に "#NAME?" と表示されるのですが何が悪いのでしょう?(Kuro)

 >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

 はい、承知いたしました、キリキせんせえ。ありっ?

       (弥太郎)

あれっ!!MyAskに! 
MyAsk→MyAscに変更して出来ました! 

MyStr関数で今後も殆ど問題ないと思いましたが、文字に対する数値(なんと呼ぶのでしょう?)を知るためにもやってみました。この文字数値一覧は、この関数でやらないとすればどこで調べればいいのですか?

弥太郎さんの方式(但し、"kuro"は"hankaku"に変更しましたけど・・・・・)でもやりました。
出来ました。 

皆さん、有難うございました。また別スレでお会いしましょう。と、言っても、教えて頂くばかりですけど・・・・・。今後も宜しくお願いします。(Kuro)

     

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.