[[20170609091717]] 『VBAコードのシンプルな書き方について』(HM) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『VBAコードのシンプルな書き方について』(HM)

いつもお世話になっております。
下記コードのIF文をシンプルにしたくていろいろ試行錯誤をしてみたのですが、求める結果にならない為、現在は下記のコードを使用しております。
今後の勉強のためにもシンプルにまとめれるのであればご教授ください。
よろしくお願い致します。

Sub TextBox保存_Click()

    Dim a As Integer
    Dim a1 As Integer

    Range("BB1") = Range("BB1") + 1
    a = Range("BB1")

    If Range("BB1") = 1 Then    '保存ボタンのクリックが1回のみの処理
        Call 保存

    ElseIf Range("BB1") >= 2 And Range("G10") = "A社(未完了)" _
        Or Range("BB1") >= 2 And Range("G10") = "B社(未完了)" Then    '保存ボタンのクリックが2回以上で未完了の場合の処理
        Call 保存

    ElseIf Range("BB1") >= 2 And Range("G10") = "自社完了(A社)" _
        Or Range("BB1") >= 2 And Range("G10") = "自社完了(B社)" _
        Or Range("BB1") >= 2 And Range("G10") = "A社(完了)" _
        Or Range("BB1") >= 2 And Range("G10") = "B社(完了)" Then   '保存ボタンのクリックが2回以上かつ完了の場合の処理
        a1 = MsgBox("クリック回数が" & a & "回目です。" & vbLf & "担当者に完了データを削除してもらいましたか?" _
                & vbLf & "まだの場合は削除依頼をしてください。", vbOKCancel + vbExclamation + vbDefaultButton2, "確認")

    If a1 <> vbCancel Then   'OKボタンを押した場合・・・保存マクロを実行
        Call 保存
    ElseIf a1 <> vbOK Then   'Cancelボタン押した場合・・処理を終了
        MsgBox "処理をキャンセルしました。"

    End If
    End If

End Sub

< 使用 Excel:Excel2010、使用 OS:unknown >


HMさn
私のコードも汚い方なのですが、Select Caseを使うともう少しうまくまとまるかもしれません。

Sub TextBox保存_Click()

    Dim a As Integer
    Dim a1 As Integer

    Range("BB1").Value = Range("BB1").Value + 1
    a = Range("BB1").Value

    If Range("BB1").Value = 1 Then    '保存ボタンのクリックが1回のみの処理
        Call 保存
    Else
        If Range("BB1").Value >= 2 Then
            Select Case Range("G10").Value
            Case "A社(未完了)", "B社(未完了)"
                '保存ボタンのクリックが2回以上で未完了の場合の処理
                Call 保存
            Case "自社完了(A社)", "自社完了(B社)", "A社(完了)", "B社(完了)"
                '保存ボタンのクリックが2回以上かつ完了の場合の処理
                a1 = MsgBox("クリック回数が" & a & "回目です。" & vbLf & "担当者に完了データを削除してもらいましたか?" _
                    & vbLf & "まだの場合は削除依頼をしてください。", vbOKCancel + vbExclamation + vbDefaultButton2, "確認")
                If a1 <> vbCancel Then     'OKボタンを押した場合・・・保存マクロを実行
                   Call 保存
                ElseIf a1 <> vbOK Then   'Cancelボタン押した場合・・処理を終了
                   MsgBox "処理をキャンセルしました。"
                End If
            End Select
        End If
    End If
End Sub
(パオ〜〜ン) 2017/06/09(金) 10:15


 面白そうなので参加します。
 完了と未完了だけで判断しているので、A社B社自社等区別していません。
 BB1の値はマイナス(文字列も)を想定していません。

    Sub TextBox保存_Click()
        'Dim a1 As Integer 使わない
        Dim cnt As Long   'BB列の値 Dim a As Integer
        Dim txt As String 'G列の値
        Dim q   As String '質問文章

        cnt = Range("BB1").Value + 1
        txt = Range("G10").Value
        q = Join(Array("クリック回数がn回目です。", "担当者に完了データを削除してもらいましたか?", "まだの場合は削除依頼をしてください"), vbNewLine)
        q = Application.Substitute(q, "n", cnt)

        If cnt = 1 Then
            '■ボタン押下回数が1回の場合
            Call 保存
        ElseIf cnt >= 2 Then
            '■ボタン押下回数が2回以上
            Select Case True
                Case InStr(1, txt, "未完了") > 0 '■未完了が含まれている場合 !!必ず先にすること!!
                    Call 保存
                Case InStr(1, txt, "完了") > 0   '■完了が含まれている場合
                    If MsgBox(q, vbOKCancel + vbExclamation + vbDefaultButton2, "確認") = vbOK Then
                        Call 保存
                    Else
                        MsgBox "処理をキャンセルしました。"
                    End If
            End Select

        Else
            '何もしない
        End If

        Range("BB1").Value = cnt   '■ボタンを押す回数の加算は、一番最後。Call先のマクロが転んだ場合に備えて、条件分岐も入れたい。
    End Sub

 私はseiyaさんのコードが一番きれいで好きだなぁ。
(稲葉) 2017/06/09(金) 12:52

まず、コードを見易くしようと心がけるのはとても良い事です。 ただし、それはご自身で少しずつ改良すべき事であり、他者を頼るべきではありません。例えば、家庭料理を作れる人が、コックさんを家に呼んで作り直しさせて勉強する、なんてしませんよね。普通に食べられるなら、それで良いんじゃないかなぁ、と思います。 とはいえ、今回は幾つか整形例がでていて、比べるのは面白いなぁ、と思いました。

次に、このロジックは最初にBB1セルをカウントアップしていますが、これだと処理キャンセルされても1増えます。それで良いのでしょうか? なんとなく不具合に思えるので、「保存」時のみアップするようにしましょう。

後は細かい点ですが、変数aを1回しか使わないのは勿体ないなぁ、と感じます。逆に、何度もBB1セルの値を調べるのは無駄だなぁ、と感じます。

以上を踏まえて整形してみたのが、以下になります。G11セルの参照も何度も出てくるので、ここをSelect Case文に変えても良いですね。 動作環境は無いので、コーディングしただけでデバッグしていないので、ミスがあってもご容赦ください。

 Sub TextBox保存_Click()
    Dim a As Integer
    Dim a1 As Integer

    a = Range("BB1")
    If 2 <= a Then
        If Range("G10") = "自社完了(A社)" Or _
           Range("G10") = "自社完了(B社)" Or _
           Range("G10") = "A社(完了)" Or _
           Range("G10") = "B社(完了)" Then
            a1 = MsgBox("クリック回数が" & a + 1 & "回目です。" & vbLf & "担当者に完了データを削除してもらいましたか?" _
                    & vbLf & "まだの場合は削除依頼をしてください。", vbOKCancel + vbExclamation + vbDefaultButton2, "確認")
            If a1 <> vbOK Then
                MsgBox "処理をキャンセルしました。"
                Exit Sub
            End If
        End If
    ElseIf a <> 1 Then  '1,2以外はあり得ないならば、この判定は不要です
        Exit Sub
    End If

    Range("BB1") = Range("BB1") + 1
    Call 保存
End Sub
(???) 2017/06/09(金) 13:07

 ちょっと乱暴かな?
 Sub TextBox保存_Click() 
    Dim n As Integer
    Dim x As VbMsgBoxResult
    Range("BB1") = Range("BB1") + 1
    n = Range("BB1")
    If n = 1 Then    '保存ボタンのクリックが1回のみの処理
        Call 保存
    ElseIf Range("G10") Like "*未完了*" Then    '保存ボタンのクリックが2回以上で未完了の場合の処理
        Call 保存
    ElseIf Range("G10") Like "*完了*" Then   '保存ボタンのクリックが2回以上かつ完了の場合の処理
        x = MsgBox("クリック回数が" & a & "回目です。" & vbLf & "担当者に完了データを削除してもらいましたか?" _
                & vbLf & "まだの場合は削除依頼をしてください。", vbOKCancel + vbExclamation + vbDefaultButton2, "確認")
    	If x <> vbCancel Then   'OKボタンを押した場合・・・保存マクロを実行
            Call 保存
        ElseIf x <> vbOK Then   'Cancelボタン押した場合・・処理を終了
            MsgBox "処理をキャンセルしました。"
        End If
    End If
End Sub
 稲葉さんありがとう。
(seiya) 2017/06/09(金) 13:29
 修正:16:09

 よくよく見ると、この文言は誤ってOKクリックする可能性ありません?
 依頼をしてください → OK みたいな。

 文章の順番を変えたり

 クリック回数が2回目です。
 担当者に削除依頼をしてください。
 削除してもらいましたか?
 [OK][キャンセル]

 OKを再試行にする等したらわかりやすいかも?
 If MsgBox(q, vbRetryCancel + vbExclamation + vbDefaultButton2, "確認") = vbRetry Then

 クリック回数が2回目です。
 担当者に完了データを削除してもらいましたか?
 まだの場合は削除依頼をしてください。
 [再試行][キャンセル]

 seiyaさんコードは余分なネストがなかったり大変勉強になります。
 a1が残ってて、時々抜けているあたりも好きですね!!
 >ElseIf a1 <> vbOK Then   'Cancelボタン押した場合・・処理を終了

(稲葉) 2017/06/09(金) 14:04


 おっと、やっちゃいましたね。
 いま携帯からなので修正は後ほどにします。
(seiya) 2017/06/09(金) 14:58

仕事中につきお返事遅くなり申し訳ありません。

皆様の色々なシンプルなコードを拝見しまして、自分がまだまだ勉強不足なことを実感しております。

自分が気付いていなかった問題点を指摘していただきありがとうございました。
保存した場合のみ+にする点は早く改善したいと思います。
知らないコードが沢山出てきたので、きちんと調べて勉強したいと思います。
また何かありましたら宜しくお願い致します。
(HM) 2017/06/09(金) 16:37


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.