[三流君] −−> [VBAで楽しく] −−> [バックナンバー一覧]

三流君VBA:プログラムの修正・追加のいろいろな方法?開発の進め方?

発行内容

プログラムの修正・追加のいろいろな方法?開発の進め方?

どうも、三流プログラマーのKen3です。

今回は、
プログラムの修正・追加のいろいろな方法?
について、少し書いてみます。

自分でも読み返すとあまり参考にならないのですが、
せっかく書いたので発行しちゃいます。
(読者の声:そんなことしてるから、最近のメルマガの質が落ちてるんだってば)

/* * 1. 今回のキッカケ */

前回のメルマガで、 全角英数字を半角にする下記のサブルーチンを作成した。
Function 全角ABCto半角ABC(strMOTO As String) As String
    Dim strRET As String
    Dim strCHK As String
    Dim n As Integer
    Dim lngCODE As Long
    
    strRET = "" 'リターン値の初期化
   
    '文字数分コードを調べて変換して、strRETに+する
    For n = 1 To Len(strMOTO)
        strCHK = Mid(strMOTO, n, 1)  'n番目の文字を取り出す
        Select Case Asc(strCHK)
            Case Asc("0") To Asc("9") '全角0〜9
                strRET = strRET & StrConv(strCHK, vbNarrow) '変換して+
            Case Asc("a") To Asc("z") '全角a〜z
                strRET = strRET & StrConv(strCHK, vbNarrow) '変換して+
            Case Asc("A") To Asc("Z") '全角A〜Z
                strRET = strRET & StrConv(strCHK, vbNarrow) '変換して+
            Case Else  'その他
                strRET = strRET & strCHK  '上記以外はそのまま+する
        End Select
    Next n

    '変換結果を返す
    全角ABCto半角ABC = strRET     'リターン値の代入(変換結果の代入)
End Function
Sub test()  'テスト確認用
    Dim strWORK As String
    strWORK = "Windows 2003 デバイスドライバ入門 "
    MsgBox 全角ABCto半角ABC(strWORK)
End Sub
ところが、このプログラムだと、下記のデータで不具合が発生した テストデータ: "Excel VBA(ブイビーエー) 2000/2002/2003対応" や ".NETエンタープライズWebアプリケーション開発技術大全(vol.2)" 結果: ()/.が半角とならない ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

/* * 2.原因と対策を立てる */

プログラマーの言い分 ------ はぁ〜 "Excel VBA(ブイビーエー) 2000/2002/2003対応" や ".NETエンタープライズWebアプリケーション開発技術大全(vol.2)" で 結果: ()/.が半角とならない ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ だと・・・ 原因はクソSEがテストデータ/テスト仕様書で "Windows 2003 デバイスドライバ入門 " しか渡さないからでしょ。 関数名もぷっ[全角ABCto半角ABC]だって(笑)、 ここからカッコやドットの変換をするんだと読み取れって? もっとまともな仕様を書けよ、オレ様が作ってやるから ---- あらら・・・かなり言われちゃってますね、 人間関係悪い!! ^^^^^^^^^^^^^^^^ なんてのは置いといて、 まず、全体的な原因は仕様の不足って感じですね。 次にプログラム的な原因は、 ()/. の変換処理が抜けているので、この処理を追加すれば直ります。 まぁ、追加の方法はいろいろとあるんだけど。

/* * 3.B君 外側に追加 Replace関数でリターン値を置き換える */

プログラマーA君との相性が悪いので(オイオイ) 日頃から飲みに連れてってかわいがっているB君に修正を依頼した。 A君が作ったプログラムに ()/. も半角に変換する処理を追加してくれよ B君はA君に気を使い、 えっと、A→A,a→a,9→9はできているから、 付け足して、最後にReplaceで変換しますか。 テストプログラムと追加修正したモジュール
Function 全角ABCto半角ABC(strMOTO As String) As String
    Dim strRET As String
    Dim strCHK As String
    Dim n As Integer
    Dim lngCODE As Long
    
    strRET = "" 'リターン値の初期化
   
    '文字数分コードを調べて変換して、strRETに+する
    For n = 1 To Len(strMOTO)
        strCHK = Mid(strMOTO, n, 1)  'n番目の文字を取り出す
        Select Case Asc(strCHK)
            Case Asc("0") To Asc("9") '全角0〜9
                strRET = strRET & StrConv(strCHK, vbNarrow) '変換して+
            Case Asc("a") To Asc("z") '全角a〜z
                strRET = strRET & StrConv(strCHK, vbNarrow) '変換して+
            Case Asc("A") To Asc("Z") '全角A〜Z
                strRET = strRET & StrConv(strCHK, vbNarrow) '変換して+
            Case Else  'その他
                strRET = strRET & strCHK  '上記以外はそのまま+する
        End Select
    Next n

    '追加で()/.を変換する
    strRET = Replace(strRET, "(", "(") 'カッコ
    strRET = Replace(strRET, ")", ")")
    strRET = Replace(strRET, "/", "/") 'スラッシュ
    strRET = Replace(strRET, ".", ".") 'ドット

    '変換結果を返す
    全角ABCto半角ABC = strRET     'リターン値の代入(変換結果の代入)
End Function
Sub test()
    Dim strWORK As String
    Debug.Print "テスト結果:" & Now
    strWORK = "Excel VBA(ブイビーエー) 2000/2002対応"
    Debug.Print 全角ABCto半角ABC(strWORK)
    strWORK = ".NETエンタープライズWebアプリケーション開発技術大全"
    Debug.Print 全角ABCto半角ABC(strWORK)
End Sub
テスト結果: Excel VBA(ブイビーエー) 2000/2002対応 .NETエンタープライズWebアプリケーション開発技術大全 バカくさいけど、 ある一部の処理はできているんだから、 外側に追加してみました。 A君が作った処理も尊重しつつ気を使って修正しました。 ※全部修正するとA君の面子もあるしね・・・

/* * 4.C君 途中に判断を追加する(Case文を追加する) */

さてと、面白そうだからC君にも同じ修正を頼むかな A君が作ったプログラムに ()/. も半角に変換する処理を追加してくれよ C君は素直に、 えっと、A→A,a→a,9→9の判断ができているので、 Case 文を付け足して変換てみます。 テストプログラムと追加修正したモジュール
Function 全角ABCto半角ABC(strMOTO As String) As String
    Dim strRET As String
    Dim strCHK As String
    Dim n As Integer
    Dim lngCODE As Long
    
    strRET = "" 'リターン値の初期化
   
    '文字数分コードを調べて変換して、strRETに+する
    For n = 1 To Len(strMOTO)
        strCHK = Mid(strMOTO, n, 1)  'n番目の文字を取り出す
        Select Case Asc(strCHK)
            Case Asc("0") To Asc("9") '全角0〜9
                strRET = strRET & StrConv(strCHK, vbNarrow) '変換して+
            Case Asc("a") To Asc("z") '全角a〜z
                strRET = strRET & StrConv(strCHK, vbNarrow) '変換して+
            Case Asc("A") To Asc("Z") '全角A〜Z
                strRET = strRET & StrConv(strCHK, vbNarrow) '変換して+
                
            Case Asc("(")             '( カッコ
                strRET = strRET & "("  '半角の(を+する
            Case Asc(")")             ') カッコ
                strRET = strRET & ")"  '半角の)を+する
            Case Asc("/")             '/ スラッシュ
                strRET = strRET & "/"  '半角の/を+する
            Case Asc(".")             '.ドット
                strRET = strRET & "."  '半角の.を+する
            
            Case Else  'その他
                strRET = strRET & strCHK  '上記以外はそのまま+する
        End Select
    Next n

    '変換結果を返す
    全角ABCto半角ABC = strRET     'リターン値の代入(変換結果の代入)
End Function
Sub test()
    Dim strWORK As String
    Debug.Print "テスト結果:" & Now
    strWORK = "Excel VBA(ブイビーエー) 2000/2002対応"
    Debug.Print 全角ABCto半角ABC(strWORK)
    strWORK = ".NETエンタープライズWebアプリケーション開発技術大全"
    Debug.Print 全角ABCto半角ABC(strWORK)
End Sub
修正方法としては、 Case Asc("(") '( カッコ strRET = strRET & "(" '半角の(を+する と、各文字を判断して、リターン値のstrRET変数に追加しました。

/* * 5.やっぱりダメか?何も考えないでプログラムを作りやがる */

同僚のSEに愚痴をこぼす。 ( 愚痴系↓みたいなネタですが、お許しを http://www.ken3.org/guchi/ --- プログラマー関係の話を混ぜて語る本人の愚痴 ) やっぱりダメかアイツらは、言われた通りしかプログラムを修正しない。 えっ、別にそれでいいんじゃない?その為の仕様書でしょ? まぁ、聞いてよ。別に怒った訳、イヤミを言うつもりはないんだけど、 >原因はクソSEがテストデータ/テスト仕様書で >"Windows 2003 デバイスドライバ入門 " >しか渡さないからでしょ。 > >関数名もぷっ[全角ABCto半角ABC]だって(笑)、 >ここからカッコやドットの変換をするんだと読み取れって? >もっとまともな仕様を書けよ、オレ様が作ってやるから なんて言われたから売り言葉に買い言葉、逆切れには逆切れで、 君達は、VBAやVB.NETしか知らないと思うけど世の中には、 Visual C#.NETプログラミング入門 とか Microsoft Visual C++ .NETランゲージリファレンス なんて感じで、C#やC++って言語が存在するんだよ それに対して書籍が数点出ているの、VBよりは数量売れていないかもしれないけど、 職業プログラマーの君達は聞いたこと無かったの? ABC君一斉に:そんなの仕様書に載ってないでしょチャント仕様書書いてくださいよ うるせえなぁ、どこまで細かく仕様書書けばいいんだよそれくらい読み取れよ。 作りながら疑問に思わないの?その他変換する文字種類は無いのか?と・・・ ストップ、もうやめなどっちもどっちだよ、聞きたくない。 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

/* * 6.部分から全体を読むのは不可能、作らなくても全体や背景も見せる */

なんで醜い争いが発生するのか? 仕様書の不備だけじゃなくで進め方にも問題があったり。 プログラムやシステムは、必要だから作ります。 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ その最小単位のモジュールも当然必要だから作ります。 なぜ?必要か? どこで?使用するのか? どんな場面で使用するのか? 全体像や背景も説明すると 仕様書の行き違いがあっても作業者から質問が来てカバーできると思う。 全角英数字を半角にする と仕様書に一言書いておくだけじゃなく、 その背景、 http://h17-may.sazae.jp/Buy-Rakuten/Day18.html ↑書籍の売れ筋ランキングを紹介するhtmlで、 Windows Server 2003 Network とか、 タイトルが全角の英数字になってます。 ^^^^^^^^^^^^^^^^^^^^ これを半角の Windows Server 2003 Network にしたいです と一言、背景や全体像の説明があると、 たとえ仕様書に不備があっても、 作業者から、AtoZ,0to9以外の文字は変換しなくてもいいのですか? など、仕様書に対する疑問も沸いて来ると思う。 ↑なんて考えはもしかしてシステム屋的じゃないのかもしれないね、、、  プログラマーの技量、読解力に頼って仕様書の不備を原因としないのは・・間違い?

/* * 7.終わりの挨拶 */

今回は、 プログラムの追加・修正方法? そんな話でした。 プログラム作りは ^^^^^^^^^^^^^^^^ テクニックなのか? それとも 人の心なのか??? なんか、後半違う話にスリカワッテイルケドご勘弁を。 まぁ、人それぞれ、十人十色、百社百色だけどね。 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 次回に含みを持たせつつ、今回も逃げるように失礼します。 AB型の変わり者、三流プログラマーのKen3でした。


ページフッター

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

種類別のリンク や 広告など

気になったジャンル↓を選択してください。

人気記事(来場者が多いTOP3):
[VBAでIE,WebBrowserを操作]・・・VBAでIE,WebBrowserを操作する サンプルです
[Access から Excel 連携 CreateObject("Excel.Application")]・・・AccessからExcelを操作したりデータの書き出しなどです
[VBAでOutlookの操作 CreateObject("Outlook.Application" )]・・・VBAからOutlookを使い、メール関係を処理するサンプルです
↑上記3つみたいなCreateObjectで他のアプリケーションを操作するサンプルが人気です。

Excel関係:
[Excel UserFormを操作する]・・・エクセルでユーザーフォームを作成して入力などを行ってます
[ExcelからAccessを操作する]・・・ExcelからAccessのマクロを起動してみました、
[Excel関係 関数、その他]・・・その他Excel関係です

Access関係:
[Access UserForm/サブフォーム 操作]・・・アクセスでフォームを使ったサンプルです
[Access レポート操作]・・・レポートを操作してみました
[Access クエリーやその他関数]・・・あまりまとまってませんが、スポット的な単体関数の解説です

その他:VBAの共通関数やテキストファイルの操作など
[VBAでテキストファイル(TextFile)の操作]・・・普通のテキストファイルを使ったサンプルです
[VBA 標準関数関係とその他解説]・・・その他、グダグタ解説してます

開発時の操作: [F1を押してHELPを見る]/ [Debug.Print と イミディエイトウインドウ]/ [実行時エラーでデバッグ]/ [ウォッチ式とSTOP]/ [参照設定を行う]

仕様書(設計書?) XXXX書類: [基本設計書や要求仕様書]/ [テスト仕様書 テストデータ]/ [バグ票]/ [関数仕様書]/ [流れは 入力・処理・出力]

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

Blogとリンク:[三流君の作業日記]/ [VBAやASPのサンプルコード]/ 広告-[通販人気商品の足跡]



[三流君(TOP ken3.org へ戻る)] / [VBA系TOPへ] / [VBA系バックナンバー目次へ移動]