こんにちは。
if文を返すような関数を作りたいと思っています。
数値が入っている2種類の変数が複数(計12個)あります。
一つは記号に変換する数値で、「=、>、<、≧、≦」に画面では変換して表示しています。
プログラム内部では、「=、>、<、>=、<=」を使うつもりです。
もう一つは単に数値が入っています。
画面では「=、>、<、≧、≦」とそれぞれに該当する数値が入力できます。
それらを使ってif文を作成したいと思っています。
たとえば画面で「≧5と>12」が指定された場合、if x>=5 and y>12 thenというふうにしたいと思っています。
変数を一つ一つ見ていくため、何かのif文を何かの変数に入れて、最後にThanをつけれればいいなと思っています。
このようなことは、そもそも可能なのでしょうか?
記号を返す関数を作ろうとしたんですが、赤字(エラー)になってしまいます。
Dim v as Variant
v = >= ←エラーになります
初歩的な質問でごめんなさい。
よろしくお願いします。
> if x>=5 and y>12 thenというふうにしたいと思っています。
たとえば下記のような関数を作っておけば、上記の処理の代わりに
If Compare(X, ">=", 5) And Compare(Y, ">", 12) Then
という表現を使う事が出来ます。
Public Function Compare(ByVal a As Integer, ByVal op As String, ByVal b As Integer) As Boolean
Select Case op
Case "<"
Compare = a < b
Case "<=", "=<"
Compare = a <= b
Case "="
Compare = a = b
Case ">=", "=>"
Compare = a >= b
Case ">"
Compare = a > b
Case Else
Err.Raise 5
End Select
End Function
> 最後にThanをつけれればいいなと思っています。
Than → Then
> このようなことは、そもそも可能なのでしょうか?
処理効率は劣りますが、VBScript で評価させる手もあります。
Option Explicit
Private oVBS As Object
Public X As Variant
Public Y As Variant
Private Sub Command1_Click()
Label1.Caption = Condition(Text1.Text, Combo1.Text, Text2.Text, Combo2.Text)
End Sub
Private Function Condition(ByVal arg1 As String, ByVal op1 As String, ByVal arg2 As String, ByVal op2 As String) As Boolean
Dim statement As String
statement = "OBJ.X " & op1 & arg1 & " And OBJ.Y " & op2 & arg2
Condition = oVBS.Eval(statement)
Debug.Print "("; statement; ") = "; Condition
End Function
Private Sub Form_Initialize()
Set oVBS = CreateObject("ScriptControl")
oVBS.Language = "VBS"
Me.X = 7
Me.Y = 15
oVBS.AddObject "OBJ", Me, False
End Sub
Private Sub Form_Load()
Label1.Caption = ""
Text1.Text = "5"
'Style は「ドロップダウンリスト」にしておく
Combo1.AddItem "<"
Combo1.AddItem "<="
Combo1.AddItem "="
Combo1.AddItem ">="
Combo1.AddItem ">"
Combo1.AddItem "<>"
Text2.Text = "12"
'Style は「ドロップダウンリスト」にしておく
Combo2.AddItem "<"
Combo2.AddItem "<="
Combo2.AddItem "="
Combo2.AddItem ">="
Combo2.AddItem ">"
Combo2.AddItem "<>"
Combo1.Text = ">="
Combo2.Text = ">"
End Sub
魔界の仮面弁士さん、ありがとうございます。
教えていただいた関数、ありがたく参考にさせていただきます。
私の説明が良くなかったのかなと。
画面には「=、>、<、≧、≦」をリストに追加しているコンボボックスが6つあります。
その6つのコンボボックスの隣にテキストボックスをそれぞれ配置しています。
(テキストボックスは計6つです)
最低どれか一つのコンボボックスを指定して、テキストボックスに入力してもらうようになっています。
複数の指定入力も可能で、例えば3つのコンボボックスを指定してテキストボックスに入力するような感じです。
(全くのコンボボックス未指定テキストボックス未入力は不可にしています)
それで、一つ一つをチェックして変数(計6つの変数)に退避して、最後に変数を&で結合してif文を作りたいと思っていました。
説明が下手でごめんなさい。
>>> 「≧5と>12」が指定された場合、if x>=5 and y>12 thenというふうにしたいと思っています。
> 複数の指定入力も可能で
すべて And 条件で繋ぐだけなら、先の第一案にある Function Compare で、
arg1 = Compare(X, Combo1.Text, Text1.Text)
arg2 = Compare(Y, Combo2.Text, Text2.Text)
arg3 = Compare(Z, Combo3.Text, Text3.Text)
:
:
のようにして、それらを
If arg1 And arg2 And arg3 … And arg6 Then
とすれば良いかと思います。
指定されなかった項目は、argN を固定値 True にしておけば良いので、
項目数が幾つあっても同じ事かと。
# 数が多いので、実際には配列で管理した方が良いかも知れませんが。
> 最後に変数を&で結合してif文を作りたいと思っていました。
条件式を文字列として & 結合し、その内容を処理させる方法も、
先の回答にて第二案として提示してありますので、参考にしてみてください。
ありがとうございます。
教えていただいたやり方を参考にして、できました。
助かりました。
感謝感謝です。
ツイート | ![]() |