【ExcelVBA】英数記号の半角変換

このQ&Aのポイント
  • Excel2013を使用しています。カタカナは全角、英数記号は半角で表示を統一したく、ネットで検索したサンプルコードを範囲や条件等を変更して下記コードを作成しました。
  • 下記コードを実行すると、記号のうち、括弧、中点については半角表示になりますが、#については全角表示のままです。Mid(rData, i, 1) Like "#" の Like を = に変更して、Mid(rData, i, 1) = "#" とすると、#についても半角表示になりました。
  • “全ての場合に対応できていない”に該当するものなのかもしれませんが、Like では希望する結果を得られない理由は何なのか気になり、質問させていただきました。よろしくお願いします。
回答を見る
  • ベストアンサー

【ExcelVBA】英数記号の半角変換

こんにちは。 Excel2013を使用しています。 カタカナは全角、英数記号は半角で表示を統一したく、ネットで検索したサンプルコードを範囲や条件等を変更して下記コードを作成しました。 (サンプルコードが記載されていたページに簡易な例で全ての場合に対応できていないとの但し書きがありました。) 下記コードを実行すると、記号のうち、括弧、中点については半角表示になりますが、#については全角表示のままです。 Mid(rData, i, 1) Like "#" の Like を = に変更して、Mid(rData, i, 1) = "#" とすると、#についても半角表示になりました。 “全ての場合に対応できていない”に該当するものなのかもしれませんが、Like では希望する結果を得られない理由は何なのか気になり、質問させていただきました。 よろしくお願いします。 -------------------------------------------------- Sub test() Dim c As Range Dim i As Integer Dim rData As Variant, ansData As Variant For Each c In Range(Cells(3, "D"), Cells(Cells(Rows.Count, "D").End(xlUp).Row, "D")) ansData = "" For i = 1 To Len(c.Value) rData = StrConv(c.Value, vbWide) If Mid(rData, i, 1) Like "[A-z]" Or Mid(rData, i, 1) Like "[0-9]" _ Or Mid(rData, i, 1) Like "(" Or Mid(rData, i, 1) Like ")" _ Or Mid(rData, i, 1) Like "・" Or Mid(rData, i, 1) Like "#" Then ansData = ansData & StrConv(Mid(rData, i, 1), vbNarrow) Else ansData = ansData & Mid(rData, i, 1) End If Next i c.Value = ansData Next c End Sub

質問者が選んだベストアンサー

  • ベストアンサー
  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.4

こんにちは。お邪魔します。 テーマはLike演算子の扱い方、という理解でお応えします。 #以下Excel2010で確認した内容を基にします。 ヘルプを読んだのでしたら話は早いですが、 キャラセットとして"[角括弧]"の内側にマッチングパターンを書けば、 特別な意味を持つ記号=メタ文字【*?!#[-】も エスケープした普通の文字として扱えます。  If Mid(rData, i, 1) Like "[A-z]" Or Mid(rData, i, 1) Like "[0-9]" _  Or Mid(rData, i, 1) Like "(" Or Mid(rData, i, 1) Like ")" _  Or Mid(rData, i, 1) Like "・" Or Mid(rData, i, 1) Like "#" Then と書く代わりに、  If Mid(rData, i, 1) Like "[・#()0-9A-z]" Then のように済ませるのが、Like演算子本来のマッチングの仕方で、必要十分なパターンです。 Or演算子で複数のマッチング結果を繋いでいるのは、 ビギナー向けの解説のイントロとしてはある意味正しいようにも思えますが 逆にLike演算子に熟れている人から見ると、何か訳があるのかな?と、 穿った目で見られそうな感、というか却って解り難く扱い難い気もします。 パターンがあまりにも長いとか、系統で分けて書くという時には、 Or演算子で繋ぐのもアリ、です。 一般的なパターンの書き方として、 ヘルプにもあるように文字コードの順番さえ頭に入っていれば、 "[角括弧]" の内側に  連続した部分には区間を表す"-"ハイフンを挟むようにして、 ひたすら文字コード順に列挙していけばいいだけです。 加えて、 StrConv()関数の引数ConversionにvbNarrowを指定した場合は、 半角に変換できない文字はそのままの全角文字を返すという点や、 使われない文字コードは通常考慮する必要がない点を、 合わせて理解しておけば、簡素な(省略した)パターンを書くことが出来ます。 取り敢えず、半角・全角互換の文字種を文字コード順に並べてみます。 Excelシートに貼り付け[データ][区切り文字]を使ってスペース区切りで展開すれば、 そのまま一覧表になります。 全角 コード ‘ U+2018 ’ U+2019 ” U+201D   U+3000 x 、 U+3001 x 。 U+3002 x 「 U+300C x 」 U+300D x ァ U+30A1 x ア U+30A2 x ィ U+30A3 x イ U+30A4 x ゥ U+30A5 x ウ U+30A6 x ェ U+30A7 x エ U+30A8 x ォ U+30A9 x オ U+30AA x カ U+30AB x ガ U+30AC x キ U+30AD x ギ U+30AE x ク U+30AF x グ U+30B0 x ケ U+30B1 x ゲ U+30B2 x コ U+30B3 x ゴ U+30B4 x サ U+30B5 x ザ U+30B6 x シ U+30B7 x ジ U+30B8 x ス U+30B9 x ズ U+30BA x セ U+30BB x ゼ U+30BC x ソ U+30BD x ゾ U+30BE x タ U+30BF x ダ U+30C0 x チ U+30C1 x ヂ U+30C2 x ッ U+30C3 x ツ U+30C4 x ヅ U+30C5 x テ U+30C6 x デ U+30C7 x ト U+30C8 x ド U+30C9 x ナ U+30CA x ニ U+30CB x ヌ U+30CC x ネ U+30CD x ノ U+30CE x ハ U+30CF x バ U+30D0 x パ U+30D1 x ヒ U+30D2 x ビ U+30D3 x ピ U+30D4 x フ U+30D5 x ブ U+30D6 x プ U+30D7 x ヘ U+30D8 x ベ U+30D9 x ペ U+30DA x ホ U+30DB x ボ U+30DC x ポ U+30DD x マ U+30DE x ミ U+30DF x ム U+30E0 x メ U+30E1 x モ U+30E2 x ャ U+30E3 x ヤ U+30E4 x ュ U+30E5 x ユ U+30E6 x ョ U+30E7 x ヨ U+30E8 x ラ U+30E9 x リ U+30EA x ル U+30EB x レ U+30EC x ロ U+30ED x ワ U+30EF x ヲ U+30F2 x ン U+30F3 x ・ U+30FB ! U+FF01 # U+FF03 $ U+FF04 % U+FF05 & U+FF06 ( U+FF08 ) U+FF09 * U+FF0A + U+FF0B , U+FF0C - U+FF0D . U+FF0E / U+FF0F x 0 U+FF10 1 U+FF11 2 U+FF12 3 U+FF13 4 U+FF14 5 U+FF15 6 U+FF16 7 U+FF17 8 U+FF18 9 U+FF19 : U+FF1A ; U+FF1B < U+FF1C = U+FF1D > U+FF1E ? U+FF1F @ U+FF20 A U+FF21 B U+FF22 C U+FF23 D U+FF24 E U+FF25 F U+FF26 G U+FF27 H U+FF28 I U+FF29 J U+FF2A K U+FF2B L U+FF2C M U+FF2D N U+FF2E O U+FF2F P U+FF30 Q U+FF31 R U+FF32 S U+FF33 T U+FF34 U U+FF35 V U+FF36 W U+FF37 X U+FF38 Y U+FF39 Z U+FF3A [ U+FF3B ] U+FF3D ^ U+FF3E _ U+FF3F a U+FF41 b U+FF42 c U+FF43 d U+FF44 e U+FF45 f U+FF46 g U+FF47 h U+FF48 i U+FF49 j U+FF4A k U+FF4B l U+FF4C m U+FF4D n U+FF4E o U+FF4F p U+FF50 q U+FF51 r U+FF52 s U+FF53 t U+FF54 u U+FF55 v U+FF56 w U+FF57 x U+FF58 y U+FF59 z U+FF5A { U+FF5B | U+FF5C x } U+FF5D ~ U+FF5E x ¥ U+FFE5 (上から4番目は全角空白) (\から\ \から¥ のように全→半、半→全と変換を繰り返すと違う文字になるもの、  StrConv()関数で変換できないもの、は省く) (教えて!gooのIDでの投稿に際し、すべての文字種が正しく表示できるかは未確認) (もし怪しいものがあれば、コードを参照してIMEパッド(Unicode)等で確認してください) こちらで試しに仮定したものですが、 抽出対象から外す(半角に置換しない)文字種 (全角空白、句読点、かぎ括弧【 、。「」】全角カタカナ【ァ-ン】他【/|~】) について、上の表での3列めに "x"を付けてみました。 この設定でのパターンは  str Like "[‘-" & ChrW(&H201D) & "・-.0-{}¥]" のように書くことも出来ます。 本来は "[‘-”・-.0-{}¥]" ですが、 VBEに全角の”をタイプすることが出来ない為、 ChrW()関数を使って代用しています。 例示としては「ただ列挙するだけなんです」と強調する意図です。 また、上の表を見ながら、 "[A-z]" というパターンを見直すと、実はこれ、全角アルファベットとイコールでないことに気付くと思います。 余分な文字[]^_を拾っちゃいますから、 "[A-Za-z]" という風に、無駄なく正確に全角アルファベットを指定してみようかな?とか、 コツさえ掴めば、色々な工夫が出来るようになると思います。 "簡易な例"という説明文の意味する、簡易と簡易でないものの違いは 以上の説明で理解できるのではないでしょうか? 尚、 ご提示のコードは英数字と幾つかの記号を 半角に置換するコードです。 カタカナは既に全角で書かれている、のか、 これから書き足す、のか、判りませんが、もしも、 これから半角カナの全角化に取り組むのでしたら、 ■半角カナは一文字ずつ全角に置換することは出来ない■と覚えておいて下さい。 濁点・半濁点のカナは全角では一文字ですが、半角では二文字です。 そういった見通しや汎用性を考慮して、 現状の一文字ずつ置換する、というやり方から発展して、 置換対象の塊りを捉えて、塊りごと置換するような課題に挑戦することをお奨めしておきます。 例えば、 "AbcアイウXyzワヲン" であれば、 "Abc" を "Abc" "Xyz" を "Xyz" 纏めて置換する、ということです。 最後に、 Like演算子でのマッチングは世間で思われているより有用ですので、 是非この機会に熟れておいて貰えればと思います。 その先に余裕が出来たり不満が出て来たりしたら、 正規表現(VBAではVBScript.RegExpのこと)についても調べて 理解できたものを書いてみるといいと思います。 長、失礼しました。以上です。

rx-z5815
質問者

お礼

回答ありがとうございます。 今回の質問の意図するところを全て書いていただいたような回答で大変わかりやすかったです。 Or演算子を使わない書き方も教えていただき、勉強になります。 コードがスッキリまとまっていると、あとで見直したり変更したりする場合もわかりやすくていいです。 英数字といくつかの記号を半角にする前に rData = StrConv(c.Value, vbWide) で 一旦全てを全角にしているので、質問文に記載したコードはとりあえず完成させることができました。 ご丁寧な回答ありがとうございました。

その他の回答 (3)

  • kkkkkm
  • ベストアンサー率65% (1579/2414)
回答No.3

No2です。 半角にしたい記号が増えた場合の事を考えると、一度すべて半角にして、その後カタカナだけ全角に戻した方がよいのではないかと思います。 こちらのページのコードは参考にならないでしょうか http://hichon.cocolog-nifty.com/blog/2011/09/excelvba-a251.html

rx-z5815
質問者

お礼

再度の回答ありがとうございます。 教えていただいたURLに記載されたコードは私も質問投稿前に目にしました。 質問文に記載している方法とは逆の方法ですが、いろんな方法があるということで、時間が空いたときにでもこの方法でのコードを勉強がてら書いてみようと思っています。 ありがとうございました。

  • kkkkkm
  • ベストアンサー率65% (1579/2414)
回答No.2

「*」、「?」、「#」そのものをLikeしたいときには[]で囲んでください。#でしたら Mid(rData, i, 1) Like "[#]" Then のようにしてください。

rx-z5815
質問者

お礼

回答ありがとうございます。 先の回答者様から Like のヘルプに記載があるとのことで、ヘルプを読み、Like を使う場合の方法として[ ]で囲んで試してみたところ、うまくいきました。 ありがとうございました。

  • kybo
  • ベストアンサー率53% (349/647)
回答No.1

Likeのヘルプを読めば記載あります。 「#」は、任意の 1 文字の数字 (0-9)を意味します。 つまり、 Mid(rData, i, 1) Like "#" は0~9の何れかの時、Trueになります。 ※Excelの関数では*が任意の文字、?が任意の1文字の2種類しかありませんが、VBAでは、#も存在するわけです。

rx-z5815
質問者

お礼

早速、回答いただきましてありがとうございます。 Like のヘルプ、読みました。 Like はExcelの関数で文字列をアスタリスクで囲んだときと同じという程度にしか考えていなかったので、勉強になりました。 ありがとうございました。

関連するQ&A

  • エクセルvba カタカナは全角、それ以外は半角に

    セルにはカタカナ、数字、漢字、文字がすべて混在しています。 カタカナは全角に、カタカナ以外(数字や記号)は半角に統一しようかと思っています。 一度すべてを半角にし、カタカナだけ全角に戻そうかと考えました。 Sub test() Dim e As Range Dim f As Integer Dim rData As Variant, ansData As Variant Range("A1:A10").Select For Each e In Selection ansData = "" For f = 1 To Len(e.Value) rData = StrConv(e.Value, vbNarrow) If Mid(rData, f, 1) Like "[ア-ン]" Then ansData = ansData & StrConv(Mid(rData, f, 1), vbWide) Else ansData = ansData & Mid(rData, f, 1) End If Next f e.Value = ansData Next e End Sub しかしこれでは、 「ッ」「ァ」など小さい文字や、「ー(長音)」が半角から全角に戻りません。 また、「ズ」など濁音が「ス゛」と2文字になってしまいます。 これらの正しく変換されないものをすべて列挙し、Replaceなどを使って修正するしかないのでしょうか? 実は最初に、すべてを「全角→半角」にするようマクロ作成したのですが、半角にする文字をReplaceですべて列挙しるのは大変だと思い、「半角→全角」にしたらうまくいくかと思ったのですが、それでもうまくいきませんでした・・・ よろしくお願いします。

  • ExcelVBA 全角と半角文字

    恐れ入ります。 ExcelVBAの質問ですが、 ********************************************************** Function AscEx2(strOrg As String) As String Dim strRet As String Dim intLoop As Integer Dim strChar As String strRet = "" For intLoop = 1 To Len(strOrg) strChar = Mid(strOrg, intLoop, 1) If (strChar >= "A" And strChar <= "Z") _ Or (strChar >= "a" And strChar <= "z") Then strRet = strRet & StrConv(strChar, vbNarrow) Else strRet = strRet & strChar End If Next intLoop AscEx2 = strRet End Function ********************************************************** 上記のコードで、カタカナを全角、アルファベットを半角にできたのですが、 下記のこの部分の意味がいまひとつ理解できません。 「strRet = "" strRet = strRet & StrConv(strChar, vbNarrow)」 どういった解釈になるのか、お分かりになられる方は、 ご教示を宜しくお願い致します。

  • 文字変換マクロについて

    数値を文字列に変換するマクロで、行数や列数が増えても対応できるようにしたいです。 (並びは…数値 スペース 文字列)どなたか教えてください。 よろしくお願いします。 Sub 文字() Dim i As Long For i = 1 To Range("A1").End(xlDown).Row Cells(i, "C") = Cells(i, "A") With Cells(i, "C") .NumberFormatLocal = "@" .Value = StrConv(Cells(i, "C").Value, vbNarrow) .Value = Format(Cells(i, "C").Value, "'00") End With Next i End Sub

  • ExcelVBAについて

    以上~以下検索についてです。 現在、1文字以上一致で検索し、listboxに検索結果を表示させることができます コードは下記 Private Sub CommandButton1_Click() Dim lastRow As Long Dim myData, myData2(), myno Dim i As Long, j As Long, cn As Long With Workbooks("Master.xlsm").Worksheets("Sheet1") myData = .Range(.Cells(3, 2), .Cells(Rows.Count, 5).End(xlUp)).Value lastRow = .Cells(Rows.Count, 2).End(xlUp).Row End With ReDim myData2(1 To lastRow, 1 To 4) For i = LBound(myData) To UBound(myData) If myData(i, 2) Like "*" & TextBox2.Value & "*" And _ myData(i, 3) Like "*" & TextBox3.Value & "*" And _ myData(i, 4) Like "*" & TextBox4.Value & "*" _ Then cn = cn + 1 myData2(cn, 1) = myData(i, 1) myData2(cn, 2) = myData(i, 2) myData2(cn, 3) = myData(i, 3) myData2(cn, 4) = myData(i, 4) End If Next i If cn = 0 Then MsgBox "検索結果は見つかりませんでした・・・" Else End If With ListBox1 .ColumnCount = 4 .ColumnWidths = "20;40;20;60" End With End Sub そして今回教えていただきたいのが userfoamで 例えば,金額が1000~100000の間のものを検索し、 それに該当するものすべてをリストボックスに表示させることです。 このコードに以上~以下検索を追加するにはどうすればいいでしょうか? 新しい方法、これよりいい方法があればお教えください。 よろしくお願いいたします。

  • Excel VBA セル選択

    Sub 全角() Dim i As Long, buf As String For i = 1 To Len(ActiveCell.Value) If Mid(ActiveCell.Value, i, 1) Like "[ア-ン]" Then buf = buf & StrConv(Mid(ActiveCell.Value, i, 1), vbWide) Else buf = buf & Mid(ActiveCell.Value, i, 1) End If Next i ActiveCell.Value = buf End Sub このコードだと一つのセルしか変換できません。 選択した範囲全部を変換できるようにしたいです。

  • 指定した列の文字を半角→全角に変換するには

    エクセルにて以前の同様の質問の回答で特定のセルの文字を半角⇒全角へ変換する方法(マクロ)として以下のような回答を見かけましたが、これを複数の列ごとに行うにはどのようにしたらよろしいでしょうか?住所データを対象としていて行数はその都度変わります。 半角→全角 Sub Macro2()   Dim temp As String   temp = Cells(1, 2)   temp = StrConv(temp, vbWide)   Cells(1, 2).Value = temp End Sub どうか、よろしくお願い致します。

  • VBScript 全角英数記号→半角英数記号に

    ASP(VBScript)での開発をしています。 全角英数記号を、半角英数記号に変換したくて、以下のメソッドを 作りました。 Function FunFullToHalf(ByVal StrTarget) Dim ObjBASP21 Dim StrHalf Set ObjBASP21 = Server.CreateObject("basp21") StrHalf = ObjBASP21.StrConv(StrTarget,8) FunFullToHalf = StrTarget End Function しかし、これだと、全角カタカナまで半角になってしまい、困っています。 回避策を教えていただけないでしょうか。

  • EXCEL VBAの配列でわかりません。

    こんなコードがあるのですが、最後の他のシート(作業中シート)に書き込もうとするとエラーになってしまいます。”Sheets("作業中").”を抜くと同じシートに結果は返ってくるのですが…。コードの内容は、ある範囲のある列から空白ではないセルを探し出してその行のデータを配列で汲み取り、他のシートに一括で洗い出すというものです。 Sub 作業中() Dim myRow As Long Dim Data As Variant Dim WC() As Variant Dim WCE() As Variant myRow = Range("H1").CurrentRegion.Rows.Count Data = Range("H1:M" & myRow).Value For i = 1 To myRow If Data(i, 5) <> "" Then a = a + 1 Else b = b + 1 End If Next ReDim WC(a) ReDim WCE(b) c = 0 d = 0 For i = 1 To myRow If Data(i, 5) <> "" Then WC(c) = Range("H" & i & ":K" & i).Value c = c + 1 Else WCE(d) = Range(Cells(i, 8), Cells(i, 11)).Value d = d + 1 End If Next For i = 0 To a Range(Cells(i + 1, 15), Cells(i + 1, 18)).Value = WC(i) Next For i = 0 To b Range(Cells(i + 1, 19), Cells(i + 1, 22)).Value = WCE(i) Next e = Range(Cells(1, 15), Cells(a, 18)).Value Sheets("作業中").Range(Cells(1, 1), Cells(a, 4)).Value = e End Sub ちなみに同じシートから↓のコードを実行するとうまくいきます。 なぜ~??わからな~い??おしえてくださーい!! Sub test() Dim a As Variant a = Range("H1:K4") Sheets("作業中").Range("N1:Q4") = a End Sub

  • ExcelVBAでのユーザーフォームについて

    ご回答ありがとうございました。 これといった資料がなく(探し方が悪いのかもしれませんが)、少ない経験値で複雑なというか面倒な処理のマクロ(VBA)を組まされることになり、困っているところです。当初の話だと「勉強しながらでよい」ということだったのですが、いろいろと仕事が次々と舞い込んできて、そんな余裕もなくせっぱ詰まり少ない知識で必死にやっています。 先にご回答いただいた内容で是非アドバイスをいただきたいと思い、新たに質問させていただきました。 ユーザーフォームでマルチページを作っています。そこでもコンボボックスを使うのですがそこの記述方法をアドバイス下さい。やっぱり記述場所がおかしいのか、クリックするとリストの内容がコンボボックスをクリックした分だけ繰り返してしまうことがあります。 ////////////////////////////////////////////////////// Private Sub UserForm_Initialize() Dim sh As Worksheet Set sh = Worksheets("対象年") Dim i As Integer Dim lastRow As Integer lastRow = sh.Cells(Rows.Count, 1).End(xlUp).Row With ComboBox1 For i = 2 To lastRow If ComboBox1 = "" Then .AddItem sh.Cells(i, 1).Value End If Next i End With End Sub ////////////////////////////////////////////////////// Private Sub ComboBox1_DropButtonClick() Dim sh As Worksheet Set sh = Worksheets("対象年") Dim i As Integer Dim lastRow As Integer lastRow = sh.Cells(Rows.Count, 1).End(xlUp).Row With ComboBox1 For i = 2 To lastRow If ComboBox1 = "" Then .AddItem sh.Cells(i, 1).Value End If Next i End With End Sub ////////////////////////////////////////////////////// とまぁ、結局コードは同じなのですが。 それと、結果をラベルに出させる場合には回答で記述いただいた ////////////////////////////////////////////////////// Private Sub ComboBox1_Change()   Dim vTgYear As Variant   vTgYear = ComboBox1.Value   Label1.Caption = vTgYear - 1 & "~" & vTgYear + 1 & "年" End Sub ////////////////////////////////////////////////////// で、よいでしょうか? よろしくお願いいたします。

  • VBA 時間の抜き出しが上手く処理できない

    時間の抜き出しをするのに下記のコードを候補に挙げましたが、 「'コロンが2個の場合 (時:分:秒)」の場合は上手く処理できますが 「'コロンが1個の場合 (分:秒)」の数値が上手く処理できません。 ’----------------------------------------------------------------------- Option Explicit Sub コロンの数を数える() Dim i As Long, cnt As Long, n As Variant For i = 2 To Cells(Rows.Count, "A").End(xlUp).Row cnt = 0 '←cntをリセット Do n = InStr(n + 1, Cells(i, "A"), ":") If n = 0 Then Exit Do Else cnt = cnt + 1 End If Loop If cnt < 1 Then MsgBox "[:]がありません。" '←cntが1未満のときにメッセージを発出します。 End Else Cells(i, "B").Value = cnt End If Next End Sub Sub 時間抜き出し() Dim i As Long, cnt As Long Dim n As Single For i = 2 To Cells(Rows.Count, "A").End(xlUp).Row n = InStr(n + 1, Cells(i, "A"), ":") 'コロン「:」の位置を特定する If Cells(i, "B") = 1 Then 'コロンが1個の場合 (分:秒) Cells(i, "C").NumberFormatLocal = "h:mm:ss" If Mid(Cells(i, "A"), n - 2, 1) = " " Or Mid(Cells(i, "A"), n - 2, 1) = "(" Then '10分以下の場合 Cells(i, "C") = Mid(Cells(i, "A"), n - 1, 4) Cells(i, "C") = "0:" & Cells(i, "C") Else '10分以上 Cells(i, "C") = Mid(Cells(i, "A"), n - 2, 5) Cells(i, "C") = "0:" & Cells(i, "C") End If Else 'コロンが2個の場合 (時:分:秒) Cells(i, "C").NumberFormatLocal = "h:mm:ss" Cells(i, "c") = Mid(Cells(i, "A"), n - 1, 7) End If n = 0 Next End Sub

専門家に質問してみよう