[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『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 >
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.