質問: ansdata next c end sub
回答: こんにちは。お邪魔します。 テーマは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のこと)についても調べて 理解できたものを書いてみるといいと思います。 長、失礼しました。以上です。