[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『CASE文とIF文の判定について』(フェンダー)
下記の仕様で、情報分岐点が多くて
条件が合っているのか分からなくなってるので
アドバイスお願いします。
仕様とコードでまだ見直す部分等ございましたら
ご指摘ください。
まだ仕様通りに完成してないのですが
種別スイッチの判定や仕様のFGHの
*ただし種別が"00"の場合は・・・・・のあたりがどのように判定すればいいのか
よくわからなくなってます。
デバッグプリントの表示は気にしないで
下さい。
どうぞよろしくお願いいたします。
*********************************************
仕様
@種類
制度コード "01"の場合 旧厚年
制度コード "03"の場合 旧国年
制度コード "04"の場合 新法
制度コード "06"の場合 旧短
制度コード それ以外("07") 新短
A新法
種別 "11" 新法・老齢へ
種別 "13" 新法・障害へ それ以外 "14" 新法・遺族へ
B新法・老齢
基礎支払額が0円以外で上乗支払額が0円以外は "A"を設定
基礎支払額が0円以外で上乗支払額が0円なおかつ独自支払額0円以外 "A"を設定
基礎支払額が0円以外で上乗支払額が0円なおかつ独自支払額0円 "B"を設定
基礎支払額が0円以外で上乗支払額が0円以外 "C"を設定
基礎支払額が0円以外で上乗支払額が0円なおかつ独自支払額0円以外 "D"を設定
C新法障害
基礎支払額が0円以外で上乗支払額が0円以外は "E"を設定
基礎支払額が0円以外で上乗支払額が0円なおかつ独自支払額0円以外 "E"を設定
基礎支払額が0円以外で上乗支払額が0円なおかつ独自支払額0円 "F"を設定
基礎支払額が0円以外で上乗支払額が0円以外 "G"を設定
基礎支払額が0円以外で上乗支払額が0円なおかつ独自支払額0円以外 "H"を設定
D新法・遺族
基礎支払額が0円以外で上乗支払額が0円以外は "I"を設定
基礎支払額が0円以外で上乗支払額が0円なおかつ独自支払額0円以外 "I"を設定
基礎支払額が0円以外で上乗支払額が0円なおかつ独自支払額0円 "J"を設定
基礎支払額が0円以外で上乗支払額が0円以外 "K"を設定
基礎支払額が0円以外で上乗支払額が0円なおかつ独自支払額0円以外 "L"を設定
E旧厚年
種別 "01" "M"を設定
種別 "02" "N"を設定
種別 "03" "O"を設定
種別 "04" "P"を設定
種別 "05" "Q"を設定
種別 "06" "R"を設定
種別 "07" "S"を設定
種別 "08" "T"を設定
種別 "09" "U"を設定
種別 それ以外"10" "V"を設定
F旧国年
種別 "05" "W"を設定
種別 それ以外 "X"を設定
*ただし種別が"00"の場合は内部整理番号の11桁目12桁目からFの指示に従う
G旧短
種別 "06" "Y"を設定
種別 "07" "Z"を設定
種別 "08" "AA"を設定
種別 "09" "BB"を設定
種別 それ以外"10" "CC"を設定
*ただし種別が"00"の場合は内部整理番号の5桁目6桁目からGの指示に従う
H新短
種別 "26" "DD"を設定
種別 "53" "DD"を設定
種別 "63" "DD"を設定
種別 "27" "EE"を設定
種別 "28" "EE"を設定
種別 "64" "EE"を設定
種別 それ以外"59" "FF"を設定
*ただし種別が"00"の場合は内部整理番号の5桁目6桁目からHの指示に従う
*********************************************
/////////////////////////////////////////////////////////////////////
VBAコード
Function Edit8()
Dim tmp As String
Dim 種別スイッチ As String
Dim err_msg As String
Dim 内部整理番号 As String
内部整理番号 = 府県 & 課所 & 種別 & 番号 & 枝番
' err_msg = "エラー未設定"
err_msg = " " If (府県 = "00" And 課所 = "00" And 種別 = "000000" And 番号 = "00" And 枝番 = "00") Then
If (制度コード = "03") Then 種別スイッチ = 種別 Else 種別スイッチ = Mid(内部整理番号, 11, 2) End If Else 種別スイッチ = 種別 End If
Select Case 制度コード Case "04" '新法 Select Case 種別スイッチ Case "11" If (CLng(基礎支払額) <> 0 And (CLng(上乗支払額) <> 0 )) Then
tmp = "A"
ElseIf (CLng(基礎支払額) <> 0 And (CLng(上乗支払額) = 0 Or CLng(独自支払額) <> 0)) Then
tmp = "A"
ElseIf (CLng(基礎支払額) <> 0 And (CLng(上乗支払額) = 0 Or CLng(独自支払額) = 0)) Then
tmp = "B"
ElseIf (CLng(基礎支払額) = 0 And (CLng(上乗支払額) <> 0)) Then
tmp = "C"
ElseIf (CLng(基礎支払額) = 0 And (CLng(上乗支払額) = 0 Or CLng(独自支払額) <> 0)) Then tmp = "D"""
Else
tmp = err_msg
End If Case "13" If (CLng(基礎支払額) <> 0 And (CLng(上乗支払額) <> 0 )) Then
tmp = "E"
ElseIf (CLng(基礎支払額) <> 0 And (CLng(上乗支払額) = 0 Or CLng(独自支払額) <> 0)) Then
tmp = "E"
ElseIf (CLng(基礎支払額) <> 0 And (CLng(上乗支払額) = 0 Or CLng(独自支払額) = 0)) Then
tmp = "F"
ElseIf (CLng(基礎支払額) = 0 And (CLng(上乗支払額) <> 0)) Then
tmp = "G"
ElseIf (CLng(基礎支払額) = 0 And (CLng(上乗支払額) = 0 Or CLng(独自支払額) <> 0)) Then tmp = "H"
Else
tmp = err_msg
End If
Case "14" If (CLng(基礎支払額) <> 0 And (CLng(上乗支払額) <> 0 )) Then
tmp = "I"
ElseIf (CLng(基礎支払額) <> 0 And (CLng(上乗支払額) = 0 Or CLng(独自支払額) <> 0)) Then
tmp = "I"
ElseIf (CLng(基礎支払額) <> 0 And (CLng(上乗支払額) = 0 Or CLng(独自支払額) = 0)) Then
tmp = "J"
ElseIf (CLng(基礎支払額) = 0 And (CLng(上乗支払額) <> 0)) Then
tmp = "K"
ElseIf (CLng(基礎支払額) = 0 And (CLng(上乗支払額) = 0 Or CLng(独自支払額) <> 0)) Then tmp = "L"
Else
tmp = err_msg
End If
Case Else tmp = err_msg End Select
Case "01" '旧厚年 Select Case 種別スイッチ Case "01" tmp = "M" Case "02" tmp = "N" Case "03" tmp = "O" Case "04" tmp = "P" Case "05" tmp = "Q" Case "06" tmp = "R" Case "07" tmp = "S" Case "08" tmp = "T" Case "09" tmp = "U" Case "10" tmp = "V"
Case Else tmp = err_msg End Select
Case "03" '旧国年 Select Case 種別スイッチ
Case "05"
tmp = "W"
Case Else tmp = "X" End Select
Case "07" '新短 Select Case 種別スイッチ Case "26", "53", "63"
tmp = "DD"
Case "27", "28", "64"
tmp = "EE"
Case "59"
tmp = "FF"
Case Else tmp = err_msg & Kanma & err_msg End Select
Case "06" '旧短 Select Case 種別スイッチ Case "06" tmp = "Y" Case "07" tmp = "Z" Case "08" tmp = "AA" Case "09" tmp = "BB" Case "10" tmp = "CC"
Case Else tmp = err_msg & Kanma & err_msg End Select
Case Else tmp = err_msg & Kanma & err_msg End Select
If (tmp = (err_msg)) Then Debug.Print "Recno", lRec, " 基礎年金番号", 府県課所 & 番号, " 種別", 種別, " 区分", 区分, _ " 制度コード", 制度コード, " 内部整理番号_種別", 内部整理番号_種別, _ " Mid(内部整理番号_番号, 1, 2)", Mid(内部整理番号_番号, 1, 2)
End If
outDat(8) = tmp
End Function
/////////////////////////////////////////////////////////////////////
ウインドウズ7 エクセル2010 (フェンダー)
仕様もコードもざらっと眺めただけで精査していないんだけど、●●を設定 という表現は outData(8) に値を返すということ?
If (府県 = "00" And 課所 = "00" And 種別 = "000000" And 番号 = "00" And 枝番 = "00") Then から始まるプロシジャの最初の処理ブロックの要件説明はないと思うんだけど、ここは無視しておいていいの?
それと、規定されていない変数はモジュールレベルの変数? あと、なぜ、SubプロシジャではなくFunctionプロシジャにしてあるの?
(ぶらっと)
>仕様もコードもざらっと眺めただけで精査していないんだけど、●●を設定 という表現は
outData(8) に値を返すということ?
そうです。すべてコードを記載しますとかなりの情報量になってしまいますので・・・
>If (府県 = "00" And 課所 = "00" And 種別 = "000000" And 番号 = "00" And 枝番 = "00") Then
から始まるプロシジャの最初の処理ブロックの要件説明はないと思うんだけど、ここは無視しておいていいの?
他にも仕様があるのですがこれ以上細かく掲載しますと
ご回答者様に対して分かりにくくなってしますから記載しませんでした。
仕様にないコードを記載して申し訳ございません。
無視して下さい。
>それと、規定されていない変数はモジュールレベルの変数?
そうです。
CSVデータの各フィールド値を設定してます。
>あと、なぜ、SubプロシジャではなくFunctionプロシジャにしてあるの?
うまく伝わるかどうか分かりませんが
sub mainでCSV入出力指示を行ってますので
各フィールドの作業は
Functionプロシジャごとに管理してます。
ウインドウズ7 エクセル2010 (フェンダー)
>そうです。 >CSVデータの各フィールド値を設定してます。
それでもいいんだけど、プロシジャ(コード)の堅牢性を考えると、変数をMainプロシジャで保持して、 それら変数を引数としてサブプロシジャに渡してやるといった方法が望ましいかも。 変数が数多く大変だろうから、配列やユーザー定義構造体におさめて。
>sub mainでCSV入出力指示を行ってますので >各フィールドの作業は >Functionプロシジャごとに管理してます。
質問したのは、それらサブプロシジャを【なぜSubプロシジャにしないでFunctionプロシジャにしてるの?】 ということなんだけどね。
まぁ、それらはさておき。 現状のままでは、条件があっているかどうかのジャッジは困難だねぇ。
たとえば
B新法・老齢 の説明として
基礎支払額が0円以外で上乗支払額が0円以外は "A"を設定 基礎支払額が0円以外で上乗支払額が0円以外 "C"を設定
このように記載されている。どう読んでも同じ条件だと思うけど、"A" ? "C" ?
あるいは
基礎支払額が0円以外で上乗支払額が0円なおかつ独自支払額0円以外 "A"を設定 基礎支払額が0円以外で上乗支払額が0円なおかつ独自支払額0円以外 "D"を設定
これも同じ条件に読めるけど?
(ぶらっと)
それでもいいんだけど、プロシジャ(コード)の堅牢性を考えると、変数をMainプロシジャで保持して、
それら変数を引数としてサブプロシジャに渡してやるといった方法が望ましいかも。 変数が数多く大変だろうから、配列やユーザー定義構造体におさめて。
当初そのようにプログラムの土台を作成してたので
そのまま使っている感じです。
>質問したのは、それらサブプロシジャを【なぜSubプロシジャにしないでFunctionプロシジャにしてるの?】
ということなんだけどね。
異なるデータ型を利用し、
丸められて処理されてしまうのを防ぐため
各フィールド作業をFunctionで統一したのでしょうか。
以前からあるプログラムですので忘れてしまいました。
大変失礼いたしました。
記載ミスでしたので
下記のように訂正しました。
それと、当たり前ですが
最終的な値の確認は、それぞれの値を
変更して単体テストは行いますので
たとえば
こういった仕様の場合は
この部分のコードはこのように
考え直さなければ
条件を満たさない等ご指摘頂けるだけでも
助かります。
B新法・老齢
基礎支払額が0円以外で上乗支払額が0円以外は "A"を設定 基礎支払額が0円以外で上乗支払額が0円なおかつ独自支払額0円以外 "A"を設定 基礎支払額が0円以外で上乗支払額が0円なおかつ独自支払額0円 "B"を設定 基礎支払額が0円で上乗支払額が0円以外 "C"を設定 基礎支払額が0円で上乗支払額が0円なおかつ独自支払額0円以外 "D"を設定
C新法障害
基礎支払額が0円以外で上乗支払額が0円以外は "E"を設定 基礎支払額が0円以外で上乗支払額が0円なおかつ独自支払額0円以外 "E"を設定 基礎支払額が0円以外で上乗支払額が0円なおかつ独自支払額0円 "F"を設定 基礎支払額が0円で上乗支払額が0円以外 "G"を設定 基礎支払額が0円で上乗支払額が0円なおかつ独自支払額0円以外 "H"を設定 D新法・遺族
基礎支払額が0円以外で上乗支払額が0円以外は "I"を設定 基礎支払額が0円以外で上乗支払額が0円なおかつ独自支払額0円以外 "I"を設定 基礎支払額が0円以外で上乗支払額が0円なおかつ独自支払額0円 "J"を設定 基礎支払額が0円で上乗支払額が0円以外 "K"を設定 基礎支払額が0円で上乗支払額が0円なおかつ独自支払額0円以外 "L"を設定
(フェンダー)
>異なるデータ型を利用し、 >丸められて処理されてしまうのを防ぐため >各フィールド作業をFunctionで統一したのでしょうか。
よくわからないというか、説得力がないけど、テーマとは関係がないのでこのへんで。
本題だけど、そちらの表現で、たとえば
>基礎支払額が0円以外で上乗支払額が0円【なおかつ】独自支払額0円以外 "A"を設定
これにあたるコードが
ElseIf (CLng(基礎支払額) <> 0 And (CLng(上乗支払額) = 0 Or CLng(独自支払額) <> 0)) Then tmp = "A"
かな?
とすると、コードとしては 基礎支払額が0円以外で【かつ】(上乗支払額が0円 【または】独自支払額0円以外) になるけど、コードが正しい?説明文が正しい?
(ぶらっと)
すいませんです。
実際の仕様書は下記になります。 言葉で記載しないと分かりにくいと思ったのですが
B新法・老齢だけで記載しますと
条件 基礎支払額0円以外 ◯ ◯ ◯ × × 上乗支払額0円以外 ◯ × × 〇 × 独自支払額0円以外 ◯ × ◯
処理 "A" ◯ ◯ "B" ◯ "C" ◯ "D" ◯
因みにC新法障害 D新法・遺族の◯と×の位置も B新法・老齢とまったく 同じ位置になります。
この仕様にそって言葉にして記載したのですが・・・ 私は解釈は
0円以外 ◯は→ 0円以外 0円以外 ×は→ 0円と思い記載しました。 その場合Andやorの使用方法がおかしければ ご指摘ください。 お手数おかけします。
(フェンダー)
なるほど。 ということは、コードの記述が間違っているということだね。
これから、あらためて、コードを読んでチェックするのでしばしお待ち乞う。
(ぶらっと)
たびたびすいませんがご報告いたします。 FGHで ただし・・・・・・の条件でしたが 府県課所 = "0000" 番号 = "000000" 種別 = "00" 区分 = "00"の14桁すべてが0の場合内部整理番号から 各仕様に従う指示でした。
よって初めに指摘された部分
>If (府県 = "00" And 課所 = "00" And 種別 = "000000" And 番号 = "00" And 枝番 = "00") Then から始まるプロシジャの最初の処理ブロックの要件説明はないと思うんだけど、ここは 無視しておいていいの?
は下の
コードにしてみましたのでご確認ください。 制度コード03の場合はF旧国年になりますから 種別スイッチ = Mid(内部整理番号, 11, 2)で
制度コード06と07の場合はG旧短H新短になりますから 種別スイッチ = Mid(内部整理番号, 5, 2)に してみましたので 合わせて チェックして頂けたらと思います。
*********************************************
If (府県課所 = "0000" And 番号 = "000000" And 種別 = "00" And 区分 = "00") Then
If (制度コード = "03") Then 種別スイッチ = Mid(内部整理番号, 11, 2)
ElseIf (制度コード = "06" And 制度コード = "07") Then
種別スイッチ = Mid(内部整理番号, 5, 2)
End If Else 種別スイッチ = 種別 End If
*********************************************
(フェンダー)
横入りで失礼します。 部分的なコードですが、「基礎,上乗,独自 の支払金額と、種別(老齢,遺族,障害) から、temp を求める」 この処理を、Function を利用してこんな方法では ?? 支払いをパターン化してみました。 支払額0円以外 を、支払額 > 0 と解釈していますが、いいのかな ?
Sub test() Dim 基礎&, 上乗&, 独自&, 種別$, S$ 基礎 = 0 '支払額 上乗 = 0 独自 = 10 種別 = "障害" '老齢,遺族,障害
S = myTemp(基礎, 上乗, 独自, 種別) MsgBox S
End Sub Function myTemp(ByVal a&, ByVal b&, ByVal c&, ByVal S$) As String Dim i&, j&, n&, Sa, Sb, Pat Sa = Array(a, b, c) Sb = Split("Empty,A,B,C,D,E,F,G,H,I,J,K,L", ",") Select Case S Case "老齢": n = 1 Case "遺族": n = 5 Case "障害": n = 9 End Select For i = 0 To 2 'Pattarn Check If Sa(i) > 0 Then Pat = Pat & "x" Else Pat = Pat & "o" End If Next Select Case Pat Case "xxx", "xxo", "xox" myTemp = Sb(n) Case "xoo" myTemp = Sb(n + 1) Case "oxo", "oxx" myTemp = Sb(n + 2) Case "oox" myTemp = Sb(n + 3) End Select End Function (暇人)
>支払額0円以外 を、支払額 > 0 と解釈していますが、いいのかな ?
私もその認識です。
Splitを使用したパターン化ですね。
仕様書もしっかり把握出来てない状態でして・・・
こういった方法も今後アイデアとして使用できたらと思います。
今、こういったアイデアに切り替えてパターン化した方がスマートだと思いますが・・・
(フェンダー)
先頭のブロックに関しては、まだ目を通していないので、以下では、そのままにしてある。 必要があればレスをわけて後程。
ざらっとコードを眺めたけど、新法の条件判定における And や Or の使い方の間違い以外は そちらの仕様とコードは合致していると思う。
で、本題の前にちょこっと。
1.コード作成は、(当たり前だけど、第一義としては)【要件通りに安定して正しく動くもの】を作り上げる。 2.それをベースに 1)同じような処理が登場していたりして冗長なところを共通化してコンパクトにする。 2)これからの運用面を考慮すると【保守性】【可読性】ということが重要。
この2.の 1)と2)は、ケースによっては、相反するテーマ。 コンパクトにすればするほど、コードがマニアックになり読みづらくなる傾向になるし、そうすると、将来 何か要件追加・変更しようとしたときに大きなネックにもなりうる。
1)と2)については、自分のレベルというか理解の範囲の中で、落としどころを調整していくことになる。
ということで、コード。基本、そちらのコード構成のままで、新法部分を、And/Orの手当てに加え、少しスリムにしてある。 また、旧厚年も少しスリムに。 (コードを書いただけで、動かしてテストはしていないのでバグあればご容赦)
★9:50 コード差し替え
Function Edit8() Dim tmp As String Dim 種別スイッチ As String Dim err_msg As String Dim 内部整理番号 As String Dim ansArray As Variant
内部整理番号 = 府県 & 課所 & 種別 & 番号 & 枝番
' err_msg = "エラー未設定"
err_msg = " " If (府県 = "00" And 課所 = "00" And 種別 = "000000" And 番号 = "00" And 枝番 = "00") Then If (制度コード = "03") Then 種別スイッチ = 種別 Else 種別スイッチ = Mid(内部整理番号, 11, 2) End If Else 種別スイッチ = 種別 End If
Select Case 制度コード
Case "04" '新法
Select Case 種別スイッチ
Case "11": ansArray = VBA.Array("A", "A", "B", "C", "D") '老齢 Case "13": ansArray = VBA.Array("E", "E", "F", "G", "H") '障害 Case "14": ansArray = VBA.Array("I", "I", "J", "K", "L") '遺族
End Select
Select Case 種別スイッチ Case "11", "13", "14" Select Case True Case CLng(基礎支払額) <> 0 And (CLng(上乗支払額) <> 0): tmp = ansArray(0) Case CLng(基礎支払額) <> 0 And CLng(上乗支払額) = 0 And CLng(独自支払額) <> 0: tmp = ansArray(1) Case CLng(基礎支払額) <> 0 And CLng(上乗支払額) = 0 And CLng(独自支払額) = 0: tmp = ansArray(2) Case CLng(基礎支払額) = 0 And (CLng(上乗支払額) <> 0): tmp = ansArray(3) Case CLng(基礎支払額) = 0 And CLng(上乗支払額) = 0 And CLng(独自支払額) <> 0: tmp = ansArray(4) Case Else: tmp = err_msg End Select Case Else: tmp = err_msg End Select
Case "01" '旧厚年
Select Case Val(種別スイッチ) Case 1 To 10 tmp = Chr(Asc("M") + Val(種別スィッチ) - 1) ' "M"〜"V" Case Else tmp = err_msg End Select
Case "03" '旧国年
Select Case 種別スイッチ Case "05" tmp = "W" Case Else tmp = "X" End Select
Case "07" '新短
Select Case 種別スイッチ
Case "26", "53", "63" tmp = "DD" Case "27", "28", "64" tmp = "EE" Case "59" tmp = "FF" Case Else tmp = err_msg & Kanma & err_msg
End Select
Case "06" '旧短
Select Case 種別スイッチ
Case "06" tmp = "Y" Case "07" tmp = "Z" Case "08" tmp = "AA" Case "09" tmp = "BB" Case "10" tmp = "CC" Case Else tmp = err_msg & Kanma & err_msg
End Select
Case Else
tmp = err_msg & Kanma & err_msg
End Select
If (tmp = (err_msg)) Then Debug.Print "Recno", lRec, " 基礎年金番号", 府県課所 & 番号, " 種別", 種別, " 区分", 区分, _ " 制度コード", 制度コード, " 内部整理番号_種別", 内部整理番号_種別, _ " Mid(内部整理番号_番号, 1, 2)", Mid(内部整理番号_番号, 1, 2) End If
OutDat(8) = tmp
End Function
(ぶらっと)
Select Case 種別スイッチ Case "11", "13", "14" Select Case True Case CLng(基礎支払額) <> 0 And (CLng(上乗支払額) <> 0): tmp = ansArray(0) Case CLng(基礎支払額) <> 0 And CLng(上乗支払額) = 0 And CLng(独自支払額) <> 0: tmp = ansArray(1) Case CLng(基礎支払額) <> 0 And CLng(上乗支払額) = 0 And CLng(独自支払額) = 0: tmp = ansArray(2) Case CLng(基礎支払額) = 0 And (CLng(上乗支払額) <> 0): tmp = ansArray(3) Case CLng(基礎支払額) = 0 And CLng(上乗支払額) = 0 And CLng(独自支払額) <> 0: tmp = ansArray(4) Case Else: tmp = err_msg End Select Case Else: tmp = err_msg End Select
これは以下でもOK(このあたりは好みだけど)
If IsArray(ansArray) Then Select Case True Case CLng(基礎支払額) <> 0 And (CLng(上乗支払額) <> 0): tmp = ansArray(0) Case CLng(基礎支払額) <> 0 And CLng(上乗支払額) = 0 And CLng(独自支払額) <> 0: tmp = ansArray(1) Case CLng(基礎支払額) <> 0 And CLng(上乗支払額) = 0 And CLng(独自支払額) = 0: tmp = ansArray(2) Case CLng(基礎支払額) = 0 And (CLng(上乗支払額) <> 0): tmp = ansArray(3) Case CLng(基礎支払額) = 0 And CLng(上乗支払額) = 0 And CLng(独自支払額) <> 0: tmp = ansArray(4) Case Else: tmp = err_msg End Select Else tmp = err_msg End If
(ぶらっと)
コードの提示どうもありがとうございます。 新法については条件により配列から判定されたんですね。
>先頭のブロックに関しては、まだ目を通していないので、以下では、そのままにしてある。 必要があればレスをわけて後程。
***************************************** こちらに関しては把握できましたので対応いたします。 *****************************************
>ということで、コード。基本、そちらのコード構成のままで、新法部分を、And/Orの手当てに加 え、 少しスリムにしてある。 また、旧厚年も少しスリムに。 (コードを書いただけで、動かしてテストはしていないのでバグあればご容赦)
****************************************** 提示頂いたコードでそのまま使用できました。 今回、提出期日が短いので、同じ構成での提示は助かります。 ******************************************
>で、本題の前にちょこっと。
1.コード作成は、(当たり前だけど、第一義としては)【要件通りに安定して正しく動くもの】を作 り上げる。 2.それをベースに 1)同じような処理が登場していたりして冗長なところを共通化してコンパクトにする。 2)これからの運用面を考慮すると【保守性】【可読性】ということが重要。
***************************************** 今回の仕様のような複雑な条件処理は 今後、多くあると思います。 そして提出後、短い期日で一部仕様の変更や 大幅な仕様の変更もまれにあるので 【保守性】はもちろんのことと、【可読性】を考慮しないと コンパクトにまとめすぎて コメントを書いていても すぐに結果が得られなくなり、再提出に間に合わなくなる事です。 *******************************************
>この2.の 1)と2)は、ケースによっては、相反するテーマ。 コンパクトにすればするほど、コードがマニアックになり読みづらくなる傾向になるし、そうすると、 将来 何か要件追加・変更しようとしたときに大きなネックにもなりうる。
******************************************* そうなると1つ前の報告したテーマにつながってきます。 *******************************************
1)と2)については、自分のレベルというか理解の範囲の中で、落としどころを調整していくことに なる。
******************************************* こちらは、時間をかければパターン化出来なくはないとおもいますが 短時間での一部・もしくは大幅修正を考えると 私では【可読性】を考慮しないと厳しいかと思います。
それとせっかくなので報告いたしますが、 結果の"A"や"B" 等の値は仮の値でして、本来は漢字や平仮名の文字列で表示します。 旧厚年の Case 1 To 10のような方法は今後使用できる場合もあると思いますので メモしておきます。
先程ご報告しましたがコード構成はこちらで作成したままの 構成を崩さずに頂いてますので 一部修正があった仕様も含めて あとは最終的な単体テストで、確認できればと思ってます。 ご丁寧にありがとうございました。 ******************************************
(フェンダー)
了解。そちらで対応できたということで、蛇足になるけど、最初のブロックについてメモしたので。
最初のブロックについては、要件が正しいかどうかの判定はできないけど、説明文と、そちらが改訂したコードは マッチしていると思う。 コードとしては以下のようにも書けるかな?
内部整理番号 = 府県課所 & 番号 & 種別 & 区分
' err_msg = "エラー未設定"
err_msg = ""
If 内部整理番号 = String(14, 0) Then '14桁すべて 0 If 制度コード = "03" Then 種別スイッチ = Mid(内部整理番号, 11, 2) ElseIf 制度コード = "06" And 制度コード = "07" Then 種別スイッチ = Mid(内部整理番号, 5, 2) End If Else 種別スイッチ = 種別 End If
(ぶらっと)
(ぶらっと)さんのアイデアでミスに気がつきました。
オールゼロ表示と条件により桁数指定する ものは別ものでしたので
暗号番号 = 府県課所 & 番号 & 種別 & 区分 '4,6,2,2の14桁はこうで
内部整理番号 = 府県 & 課所 & 種別1 & 番号1 & 枝番 '2,2,2,6,2の14桁を宣言して
書き換えました。
因みに"06""07" の他に "01""04"も追加になりましたので こちらも加えて更新してみました。
Dim tmp As String Dim 種別スイッチ As String Dim err_msg As String Dim 内部整理番号 As String Dim 暗号番号 As String
暗号番号 = 府県課所 & 番号 & 種別 & 区分 '4,6,2,2の14桁
内部整理番号 = 府県 & 課所 & 種別1 & 番号1 & 枝番 '2,2,2,6,2の14桁
' err_msg = "エラー未設定"
err_msg = " " If 暗号番号 = String(14, 0) Then '4,6,2,2の14桁すべて 0
If (制度コード = "03") Then 種別スイッチ = Mid(内部整理番号, 11, 2)
ElseIf (制度コード = "01" And 制度コード = "04" And 制度コード = "06" And 制度コード = "07") Then
種別スイッチ = Mid(内部整理番号, 5, 2)
End If Else 種別スイッチ = 種別 End If
(フェンダー)
If 暗号番号 = String(14, 0) Then '4,6,2,2の14桁すべて 0 Select Case 制度コード Case "03" 種別スイッチ = Mid(内部整理番号, 11, 2) Case "01", "04", "06", "07" 種別スイッチ = Mid(内部整理番号, 5, 2) End Select Else 種別スイッチ = 種別 End If
名無しさんから、さりげなく指導(?)コードがでているけど IF文で対応するにしても
ElseIf (制度コード = "01" And 制度コード = "04" And 制度コード = "06" And 制度コード = "07") Then
これは【未来永劫、絶対に】True にはならないよ? "01" という値であり、【かつ】"02"という値であるということはないよね?
最初のコードがそうだったけど、 And と Or の使い方、ちょっと混乱してる?
それと、 If 複数の条件 Then の場合も、 ( ) は不要だよ。(もちろんつけてもいいけど)
(ぶらっと)
さっそくSelect Case 制度コードに切り替えさせていただきました。
ANDは論理積(なおかつ)でorは論理和(または)と 参考書には記載されたりしてますが 正直実行結果で判断してしまってます。
たとえば今回の制度コード"01", "04", "06", "07" を今回の仕様で判定する場合はIF文のAndとorの使い分けで 判定出来るのでしょうか?
>それと、 If 複数の条件 Then の場合も、 ( ) は不要だよ。(もちろんつけてもいいけど)
こちらに関しては、あまり気にせず付けてました。 計算式とかによっては気を付けるようにしてますけど・・・
(フェンダー)
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.