初めて自分の家と他人の家が違う、と意識した時

If文の条件を外にだしさらに下記のようにIf文の中で論理演算を
させるようなプログラムを作りたいにのですが、
ExxelVBAでそのようなことはできますでしょうか?

できるとしたら教えてください。よろしくお願いします。

sub test()
S1=36
S2=48

’こういう名前の付け方はできないが、要はS1>0という条件に条件1と名づけたい。
条件1:=S1>0
条件2:=S2>0

IF 条件1*条件2=true then
cells(1,1)=1

else if 条件1=true then
cells(1,1)=2

else if 条件2=true then
cells(1,1)=3

else
cells(1,1)=0

end if

end sub

A 回答 (2件)

> ’こういう名前の付け方はできないが、要はS1>0という条件に条件1と名づけたい。



ご提示の例であれば、「変数を宣言して、そこに演算結果を格納」とすることで、
目的を達せられるかと思います。
(話を単純化させるための例で、実際にはこれでは対処できないようでしたら
 すみません(汗))

Sub Test()

  '「提示された式の演算結果」を格納する変数を宣言
  '(式そのものが格納されるわけではないのでご注意を)
  Dim 条件1 As Boolean, 条件2 As Boolean
  '「Cells(1,1)」をRangeオブジェクトとして格納する変数を宣言
  Dim objCell As Range

  S1 = 36
  S2 = 48

  Set objCell = Cells(1, 1)
  条件1 = (S1 > 0)  '「36 > 0」の演算結果「True」が格納される
  条件2 = (S2 > 0)  '「48 > 0」の演算結果「True」が格納される

  If (条件1 * 条件2) Then
    objCell = 1
  ElseIf (条件1) Then
    objCell = 2
  ElseIf (条件2) Then
    objCell = 3
  Else
    objCell = 0
  End If

  'オブジェクトを参照する変数は、念のため、明示的にメモリを解放
  Set objCell = Nothing

End Sub


【補足・蛇足】
 ・上記で使用している「( )」は、すべて省略可能ですが、個人的には
  つけた方が見た目としてわかりやすい感じがしたため、つけています。
 ・2個目以降の分岐条件では、「Else If」ではなく「ElseIf」(間にSpace
  なし)にしないと、エラーになります(多分普段はそうされているのだろう
  とは思いますが、念のためということでご了承下さい)。
 ・分岐条件では「=True」は省略可能なため、これについては省略しています。
 ・上記の例では条件1・条件2ともブール型(Boolean)なので、
  「条件1 * 条件2」は、masa_peeさんの回答にもある通り
  「条件1 And 条件2」でも同じ結果になりますが、実際に使用する場面では
  バイト型などを使用される場合もあるかと考え、上記の式としました。
  (例えば「条件1=1, 条件2=2」の場合、「(条件1 And 条件2) 」という式は
   「False」と判断されてしまいます)


・・・長文、失礼致しました。
    • good
    • 0
この回答へのお礼

これこそ求めていた回答です。分岐条件がたくさんになりすぎると、
書くのも見るのも面倒ですが、修正する場合には最悪
なので、なんとかすっきりさせられぬものかと思ってました。

また、Dim objCell As Rangeの件も先読みするかのように
教えていただきありがとうございました。

本当にたすかりました。

As Booleanで変数宣言するというのが、
本質ですね。一応バリアントでもうまくいきました。

ということで、自分が使う場合に近いものを、後の人のため?
以下、参考として付します。


P.S
ElseIfの件、失礼いたしました。




Sub Test()

'「提示された式の演算結果」を格納する変数を宣言
'(式そのものが格納されるわけではないのでご注意を)
Dim 条件(2) As Boolean


'「Cells(1,1)」をRangeオブジェクトとして格納する変数を宣言


Dim objCell As Range

S1 = 36
S2 = 48

Set objCell = Cells(1, 1)
条件1 = (S1 > 0) '「36 > 0」の演算結果「True」が格納される
条件2 = (S2 > 0) '「48 > 0」の演算結果「True」が格納される

If (条件1 * 条件2) = True Then
objCell = 1
ElseIf (条件1) = True Then
objCell = 2
ElseIf (条件2) = True Then
objCell = 3
Else
objCell = 0
End If

End Sub

お礼日時:2012/06/26 18:11

条件1 と 条件2 をそれぞれ Function にしたらいいんじゃないかな。



Function foo(…) As Boolean
 条件1を判定して TRUE/FALSE を返す
End Function

Function bar(…) As Boolean
 条件2を判定して TRUE/FALSE を返す
End Function

使うときは if foo = TRUE then … とかできる。

気になるのは質問文の「IF 条件1*条件2」だけど、たとえば「条件1がTRUE かつ 条件2がTRUE」とかのつもりなら「IF 条件1 And 条件2」にしたほうがいいんじゃないか。最近はこういう書き方のほうが多いんかな?
    • good
    • 0
この回答へのお礼

回答ありがとうございました。
関数として明示するということで、
複雑な条件のときには役立つかもしれません。

ありがとうございました。

お礼日時:2012/06/26 18:13

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報