<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)]