|
▼セイチ さん:
こんにちは
>重ねて質問してしまって申し訳ないのですが、
>Sub t()
>Dim r As Range
> Set r = Application.Union(Range("B5"), Range("C5"), Range("D5"))
> MsgBox CheckData(r)
> Set r = Nothing
>End Sub
>のプログラムで、何故私の求める動きが出来るのでしょうか?
>この中に、
>「B5は入力あり」かつ「C5は入力なし」かつ「D5は入力あり」
>の条件が含まれているのですか?
↑はFunction CheckDataで判定しています。ステップ実行で1行ずつ実行
してみて下さい。動きがわかりますから。この辺りは基本ですから
よく勉強して於いてくださいね。
ちょっとサンプルを改造しました。若干ですが、説明を加えましたから
これで解っていただけますかね???
Sub t()
Dim r As Range
' '変数を使う書き方
' Set r = Application.Union(Range("B5"), Range("C5"), Range("D5"))
' If CheckData(r) = True Then
' MsgBox "条件を満たしています。"
' Else
' MsgBox "条件を満たしていません。"
' End If
' Set r = Nothing
'変数を使わない
If CheckData(Range("B5,C5,D5")) = True Then
MsgBox "条件を満たしています。"
Else
MsgBox "条件を満たしていません。"
End If
End Sub
'判断部分のみを関数化
'Boolean型を戻しているが、必要に応じ何型でもOK、独自に型を作っても良い
(EnumステートメントをHelpで調べて下さい。)
'引数
'pData Range型:評価したいRange
'戻り値:Boolean型 条件を満たす TRUE、満たさないFALSE を返す
Private Function CheckData(pData As Range) As Boolean
Dim ret As Boolean
'「B5は入力あり」かつ「C5は入力なし」かつ「D5は入力あり」のとき「「成功!」
If (Not IsEmpty(pData(1, 1)) And IsEmpty(pData(1, 2))) And Not IsEmpty(pData(1, 3)) Then
ret = True
Else '他の条件があればelseifにしてここに記述を追加する
ret = False
End If
CheckData = ret
End Function
こうするメリットは、判断条件が変わっても関数部分を書き換えるだけで
Mainプロシージャは変更しなくてすみます。大きなメリットです。
※これはサンプルなので、データチェック、エラーハンドルなどは省略してます
から、そのままで実践には使わない方が身の為です。
詳しくはHelpの
visual basic プログラミングのヒント
→Sub プロシージャと Function プロシージャの呼び出し
→オブジェクト変数の作成
などをご覧下さい。
|
|