[[20061017214303]] 『半角全角の混ざった英数字を全部半角英数字に変換』(ranmal) ページの最後に飛ぶ

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

 

『半角全角の混ざった英数字を全部半角英数字に変換』(ranmal)

 [半角全角の混ざった英数字を全部、半角英数字に変換する方法]

 システムソフトへエクスポートするために、Excelデータを一定の形式に
 変換する必要があります。

 かな、カタカナは全角、英数字は半角。
 かな、カタカナのセルは漢字・かな・カタカナが混ざっており
 英数字のセルは英数字のみです。

 かな、カタカナは、目視で半角か全角かの区別はつくので
 面倒ですが、なんとか入力し直しすることが出来ますが、英数字は
 目視では、迷うことが多く大変です。

 別の部署から、色々な書式で体裁を整えた社外用の表を編集→クリア→書式で
 一気に書式をクリアしてから、各セルにある文字を判別して変換します。

 忙しいときは半角か全角かを判別するだけで大変なので、
 なんとか一気に(1列ずつだけでも) 変換できる方法があればという
 願いから、質問させていただきました。

 [Excel2002、2003][WindowsXP]


 検索してみました。いかがでしょう?
 
[[20060521222112]]『半角カタカナを全角カタカナに、全角英数を半角英数に』(たか)
 
 (キリキ)(〃⌒o⌒)b


 >かな、カタカナのセルは漢字・かな・カタカナが混ざっており
 >英数字のセルは英数字のみです。
 これは、同じ列に規則性無く「かな、カタカナのセル」と「英数字のセル」
 が入り交じってる・・・・のですかね?

 とりあえず、「列が違う」又は「規則性がある」のなら
 半角文字を全角文字に変換→JIS
 全角文字を半角文字に変換→ASC
 なんて関数が有ったりしますが。

 (HANA)

 そうか、規則性が無くても「かな、カタカナ」と「英数字」は混ざって存在しないのだから
 CODE関数の数字を目処にIF関数で場合分けをすれば良いのかな?

 既に半角全角入り交じっている様なので、作業列を使って
 場合分け用に一度全てJIS関数で半角に直して、CODE関数でCODE番号を調べ
 結果によって、JIS関数かASC関数を使うか決定し
 元のセルの値を変換する必要がありそうですね。
 (半角カタカナの後に全角数字のコードがあるみたいなので。)

 えっと・・・どうでしょうか。
 (HANA)

 こんなものはどうでしょうか。(ROUGE)
'----
Sub test()
    Dim c As Range, rng As Range, i As Long, txt As String
    On Error Resume Next
    Set rng = Application.InputBox("どの範囲について実行しますか?", Type:=8)
    If rng Is Nothing Then Exit Sub
    On Error GoTo 0
    With CreateObject("VBScript.RegExp")
        .Pattern = "([A-z]|[0-9])"
        For Each c In rng
            txt = Empty
            For i = 1 To Len(c.Text)
                If .test(Mid(c.Text, i, 1)) Then
                    txt = txt & StrConv(Mid(c.Text, i, 1), vbNarrow)
                Else
                    txt = txt & Mid(c.Text, i, 1)
                End If
            Next
            c.Value = txt
        Next
    End With
End Sub

 キリキさん、HANAさん、毎度お世話になっております。(ありがとうございます)

 みなさんに迷惑かけないよう過去ログを検索してから質問するように
 しているのですが、今回の質問のような都合の良い便利な方法は無いだろうと
 勝手に思い込み、検索せず質問してしまいました。m(__)m
 あと、いつも「超 図解 Excel関数ハンドブック」なる本を購入したので
 確認→分からず→「Excelの学校」質問→納得→「ハンドブック」で再度確認してみる
 →納得してから見るので書いてあることが理解できる・・というような感じです。
 「ハンドブック」は、分かりずらいです。^_^;

 前置きが長くなりましたが、キリキさんに教えていただいた過去ログは大変
 参考になりました。マクロもありで、難しいですが、試させていただこうと思います。

 今回やらなくてはいけない作業というのが
 1つの製品名、型番、製造番号が、1行に罫線あり、「セルを結合して中央揃え」等
 書式が設定され入力されており、300行位あります。
 とりあえず、全部をコピペし、書式のクリアをして
 製品名、型番、製造番号をそれぞれの列に再度コピペ(切り取り→貼り付け)
 しています。
 製品名の列は全角、型番、製造番号は半角英数でなければならないとSEから
 指示されています。

 製品名は漢字とカタカナで入力されていますが、漢字と半角カタカナで
 入力されているものや、漢字と全角カタカナで入力されているものと
 様々です。型番も全角半角入り混じっているもの、ちゃんと半角だけのものが
 あります。

 キリキさんに教えていただいた過去ログの方法や、HANAさんの方法を
 実際のデータで、挑戦してみます。(今日・明日休みなので、休み明けに)

 書いている間にROUGEさんも回答してくれていました。
 プレビューしたら、掲載されていたので驚きました。
 ROUGEさんの方法も、試させていただこうと思います。
 色々な方法が勉強でき仕事に生かせて本当にありがたいです。

 みなさん、ありがとうございます。

 (ranmal) 


 休み明けまで、待てなくて同じようなデータを作ってみて
 みなさんに教えていただいた方法を試してみました。

 マクロを使わない方法では、列でデータが一定しているので
 HANAさんのJISとASCで問題なくできました。
 こんな便利な関数があったのですね。
 列挿入して変換した列を別のセルにコピーして「値のみ貼り付け」する
 使い方で良いのですよね。

 マクロを使った方法では、キリキさんに教えていただいた過去ログの
 ROUGEさんの「トト」と 今回、ROUGEさんに教えていただいた「test」両方とも
 バッチリ出来ました。特に「test」は範囲指定を聞いてくれるので、とても
 便利ですごいです。「test」のマクロを応用して、半角かな・カナを全角にする
 マクロを作れば、範囲指定してかなも英数字も変換できることになるので、
 頑張って考えてみようかなと思っています。(不安ですが・・・)
 う〜ん、難しくて出来なかったら、英数字はROUGEさんの「test」、かな・カナは
 HANAさんに教えていただいたJISと使い分けしようと思います。

 キリキさんの「シート全体をかな・カナは全角、英数は半角」のマクロは
 是非、取り入れたいと思ったのですが、他の列で、別の形式でそろえたもの
 (日付や文字列に変換した数字等)があるので、今回はあきらめました。
 ただ、とても便利なマクロなので、使えるようになりたくて
 シート全体として、試しにコピペして試してみたのですが、
 コンパイルエラーが出て出来ませんでした。
 私のコピーミス(使い方ミス)だと思います。

 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				

 上記を貼り付け、名前が無いのでsubで名前を適当につけて実行してみたのですが
 反応が無かったので、

 Public Function MyStr(Target As Range) As String MYLEN = Len(Target.Value)
 を上に貼り付けてみたらコンパイルエラーになってしまいました。(__)
 見当違いのことをやっているのだということは分かっています。
 VBAはセルの色を赤から白に変更程度の変更(応用)ぐらいしか
 出来ないので、お恥ずかしいです。
 もう一度良く見てどこが違うのか考えてみます。

  (ranmal)

 こちらのコードは、「ユーザー定義関数」と言うものですねb
 VBAで、オリジナル関数を作っちゃうのです。
 
 で、コードはこういう感じだと思います。
 (変数の宣言も組み込みました)
 標準モジュールへ
'------------------------
Public Function MyStr(Target As Range) As String
Dim MYLEN As Integer, i As Integer, MyCode As Integer
Dim MyText As String, MyVal
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
 
 使用方法は、
 =MyStr(A1)
 の様に、数式として使用します。
 
 (キリキ)(〃⌒o⌒)b

 あっ、せんせぇと衝突〜(笑
 スペシアル関数はどうでっか?
 但し列単位で拾う関数ですけど=ranmal(a1:a500)と引数に範囲を書き込みます。
 標準モジュールに
 '-------------------------------
 Public chng_data
 Public adrs As Range
 Function ranmal(adrs As Range)
    Dim mchdata As Object, i As Integer
    With CreateObject("vbscript.regexp")
        If adrs.Rows.Count > 1 Then
            Application.EnableEvents = True
            Set adrs = adrs
            ReDim chng_data(1 To adrs.Rows.Count, 1 To 1)
            For i = 1 To adrs.Rows.Count
                chng_data(i, 1) = "=ranmal(" & adrs(i, 1).Address(0, 0) & ")"
            Next i
            ranmal = "": Exit Function
        Else
            data = StrConv(adrs.Value, vbWide)
            .Pattern = "[A-z0-9−]"
            .Global = True
            If .test(data) Then
                Set mchdata = .Execute(data)
                For i = 0 To mchdata.Count - 1
                    data = Replace(data, mchdata(i), StrConv(mchdata(i), vbNarrow))
                Next i
            End If

        End If
    End With
    ranmal = data
 End Function
 'そのシートモジュールに
 '-------------------------------
 Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Count > 1 Then Exit Sub
    If Left(Target.Formula, 8) <> "=ranmal(" Then Exit Sub
    If Not Target.Formula Like "*:*" Then Exit Sub
        Application.EnableEvents = False
        Target.Resize(UBound(chng_data, 1)) = chng_data
        Application.EnableEvents = True
 End Sub
 また、データそのもんを変換したいばやいは
 標準モジュールにコピペのうえ範囲を指定して変換一発を実行
 '-----------------------
 Sub 変換一発()
    Dim mchdata As Object, i As Integer, c
        With CreateObject("vbscript.regexp")
            For Each c In Selection
                data = StrConv(c.Value, vbWide)
                .Pattern = "[A-z0-9−]"
                .Global = True
                If .test(data) Then
                    Set mchdata = .Execute(data)
                    For i = 0 To mchdata.Count - 1
                        data = Replace(data, mchdata(i), StrConv(mchdata(i), vbNarrow))
                    Next i
                End If
                c.Value = data
            Next c

        End With

 End Sub
 ただまぁ記号に何を使われとるんかわかりまへんのんでもし英数字−以外の記号が
 使われとると.patternに追加せなあきまへんけどナ。
      (弥太郎)


 ししょ〜!
 なんだかお久しぶりです^^
 
 最近は学校にもあちらでも、あまりお見かけしませんでしたが・・・
 将棋でふか?
 それとも、ROUGE先輩のように正規表現症候群にでもなられましたか?w
 
 σ(^o^;)も、なりたい病気かもw
 (キリキ)(〃⌒o⌒)b

 「ユーザー定義関数]というものですか。すごい技なんですね。
 マクロってなんでも出来てしまうものなんですね。
 これほどのものですと、理解し自分のものにするのは
 程遠く、コピーさせていただき、使用させていただくしかないみたいです。
 使い方も教えてもらい、変換できるようになりました。

 今回、データそのものを変換できると、手間がぐっと省けるので
 弥太郎さんのマクロを使わせていただこうと思います。

 キリキさん、弥太郎さん、ありがとうございました。
 (ranmal)

 >弥太郎さん、ありがとうございました
 いえいえ、どういたちまちて〜。

 >なんだかお久しぶりです^^
 あ、いやぁ、ご無沙汰しとります〜。
 最近でっか?仕事が忙しいんもありますし、山歩きに専念しとりますもんでなかなか
 登校でけまへんのんですワ、えぇ。

 え〜っと、ところであんさん、どちらさんでしたっけ??
 ぜうだんデスヨ、せんせぇ、ほんなに怒りなはんな。(笑
      (弥太郎)

コメント返信:

[ 一覧(最新更新順) ]


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