<Access97 SP_CNV変更依頼...を題材にして> 目次 1.こんにちは 2.現バージョンの考え方と問題点 3.問題点を考慮した、新バージョン 4.おわりの挨拶 ---------------------------------------------------------------------------- /* * 1.こんにちは */ こんにちは。 匿名さんより、Access関係で出したサンプル、 SP_CNVの質問、いただきました。 質問内容 >漢字の時は「匿名 希望」姓と名の間は全角スペース一つで、半角(ア >ルファベットの場合(Tokumei Kibou)、半角カタカナ(トクメイ キ >ボウ(半角カナだと文字化けしますので、全角で表記します))の場合 >は姓と名の間に半角一つにする場合のやり方を教えて下さい。 >お願いします。 今回は、これを題材にして、 いつものように、AB型で気分屋のKen3が、一人二役で回答します。 *別なやり方を思いついた人、 イヤこれは違う、、と一緒に毒舌したい人は、 メール送ってください。 またまた、C言語から離れてしまった、、、、、、、 /* * 2.現バージョンの考え方と問題点 */ No.006で書いたサンプル、簡単に説明します。 ---- Public Function SP_Cnv(moji) As String Dim n As Integer Dim RET As String Dim ChkString As String RET = "" 'リターン値の初期化 '文字数分ループする For n = 1 To Len(moji & "") ChkString = Mid(moji, n, 1) If ChkString = " " Then '半角スペースかチェック RET = RET & " " '全角スペースをプラスする If Mid(moji, (n + 1), 1) = " " Then '次の文字がスペースがチェック n = n + 1 'ループカウンタを小細工 End If Else RET = RET & ChkString 'スペース以外の時、そのままプラスする End If Next n SP_Cnv = RET End Function ---- 関数の処理イメージとしては、 受け取った文字を左から1文字毎調べ、 半角スペースなら、全角スペースに置き換えます。 同時に、半角2個を全角1つにしたいために、 次の文字が半角か、チェックして、半角の場合、文字を飛ばしています。 ---- この方法だと、以下の問題点か発生します ア.半角スペースが3つの時、間の全角が2つになってしまう 例)匿名 希望 --> 匿名□□希望 123 あっ、あれ、、、なんで? アレじゃねえだろ、、、データが半角1つか2つとしか考えてねぇから、 3つの場合、全角2つに変換されちゃったんだろ、、、 もっと、実際のデータは汚い?って考えなきゃ イ.せっかく英字は変換されないのに、スペースは全角になる 英字や半角カナを漢字に変換したくないために、 strconv(a,vbwide)関数使わないで関数を自作しているのに、 間のスペースが全角になってしまう 例)Kibou Tokumei --> Kibou□Tokumei あっ、良く考えたら、抜けてますね。 抜けてますねじゃねぇだろ、、、チョット考えれば(使用者の立場になって) わかるだろ、、、 /* * 3.問題点を考慮した、新バージョン */ う〜ん、、データって、奥が深いな、、と思いつつ、 問題点を考慮した処理を考える。 --- 発想を半角スペースを見つけたら、全角スペースに置き換え処理をしよう から 半角・全角スペースどちらか見つけたら、 氏名を、姓と名に分ける 間に半角・全角どちらを入れるか判断するために、 一番左側の一文字を取りだし、サイズを判断。 サイズが1なら、半角カナ・英数字と判断し、 半角スペースに、、2バイト(漢字)なら全角スペースにする 間に一つスペースを+し、文字列を完成させる。 に発想を変えます。 下記に変換後のサンプルを載せます。 --- ホームページに圧縮して置いておきます。よかったらダウンロードしてください。 Public Function SP_Cnv(moji As Variant) As Variant Dim n As Integer 'ループカウンタ Dim RET As Variant 'リターン値 Dim ChkString As String 'チェックする文字 Dim strSEI As String '姓 Dim strMEI As String '名 Dim strSPC As String 'スペース RET = moji 'リターン値の初期化 '文字数分ループする 途中で、スペースが現れたら、分割処理を行う For n = 1 To Len(moji & "") ChkString = Mid(moji, n, 1) '半角スペース 及び 全角スペースかチェック If ChkString = " " Or ChkString = " " Then '姓名を分ける strSEI = Trim(Left(moji, n)) '左からn文字切り取り、空白を取って代入 strMEI = Trim(Mid(moji, n, 255)) 'n文字目から255文字切取り空白を取る '漢字で入力されているか、チェックし、スペースの種類を判断 '左側の一文字を取りだし、バイト数を判断、、、 If LenB(StrConv(Left(strSEI, 1), vbFromUnicode)) = 1 Then strSPC = " " '半角スペースを代入 Else strSPC = " " '全角スペースを代入 End If RET = strSEI & strSPC & strMEI 'スペースをプラスし、リターン値を作る Exit For '処理を抜ける End If Next n SP_Cnv = RET End Function --- で、できるの? た、たぶん。。。できます。 今、言っていい? はい、どうぞ、 3つに区切られてたら、どうなるの? 例)Tokumei Kibou Desu 氏名なんだから、、日本人は大丈夫でしょうキット。。。 *サンプル作ってから、また、気が付きました。 --- newconv.lzh --- 枠外解説・グチ -- LenB , Unicode a="漢字" ? lenb(a) --> 4バイト、、当然でしょ b="KA" ? lenb(b) --> 4バイト、、なんで? 私、ハマリましたが、有名な話みたいですね。 ?マークの人は、Unicode、ヘルプで見てください。 勉強になりますよ。。。 なんでテメエが解説しないんだ、あっ、手間取りそうだからだろ? バレました、、、今日はこのへんでカンベンしてください。。。 (どうしても?の時は、メールでリクエストしてください) PS. IsNull関数があって、IsKanji関数が無いのは、、 作ってほしいなぁ、、それとも、私の見落とし? /* * 4.おわりの挨拶 */ 素朴な疑問、これは、コッチの方がいいですよなどのアドバイス、 何かありましたら、気軽に まで、メール下さい。 新たな、毒舌まってます。 Ken3より では、また。。。 次こそは、Cの講座(If)始めるぞ、、、 *おいおい、いまさらそんなこと言っても、みんな、あてにしてないって.... Access VBAこのまま続けたほうがいいって、 そのうち言われるよキット。。。
ここまで、読んでいただきどうもです。ここから下は、三流君のホームページの紹介・案内です
目的の情報が見つかったか?少々心配しつつ、、、
項目別に本音?それとも建て前?的な記事をまとめました。
気になったジャンル↓を選択してください。 |
Blogとリンク:[三流君の作業日記]/ [愚痴(Bookmark)]/ [広告Blog(Bookmark)]