[三流君] −−> [プログラマー業務の愚痴] −−> [バックナンバー一覧]
−−> No.012 Access97 SP_CNV変更依頼...を題材にして

Access97 SP_CNV変更依頼...を題材にして


本文(発行内容)


<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このまま続けたほうがいいって、
  そのうち言われるよキット。。。



ページフッター

ここまで、読んでいただきどうもです。ここから下は、三流君のホームページの紹介・案内です
目的の情報が見つかったか?少々心配しつつ、、、

リンクや広告など

項目別に本音?それとも建て前?的な記事をまとめました。

気になったジャンル↓を選択してください。
[ルーキー rookies]・・・ 新人さん達 初心者さんへ
[学ぶ study]・・・学習、技術の取得
[仕様書 doc]・・・仕様書・設計書関係の話
[共同作業 team]・・・チーム、グループ作業
[プログラムは心? spirit]・・・プログラマー 心・気質・魂

[掲示板デビューしようぜ bbs]・・・掲示板関係の話、質問者・回答者の気持ちほか
[昔はできた seo]・・・三流式の効果無しSEOとアフィリエイト
[仕事や作業、転職 job]・・・仕事や転職、評価、作業など
[その他 etc]・・・その他 分類外の記事

※↑文章の味付けが変わっていて、お口に合うかわかりませんが。。。
※※読んで、気分を悪くされたらスミマセン。

Blogとリンク:[三流君の作業日記]/ [愚痴(Bookmark)]/ [広告Blog(Bookmark)]



[三流君(TOP ken3.org へ戻る)] / [プログラマー業務の愚痴] / [バックナンバー 一覧]