• ベストアンサー

複数の、Falseの判定方法について

現在ゲームを作っているんですが、 どうしても、コーディングが、長くなってしまうので、 やりかたを教えて欲しいのですが、 複数の、オブジェクトの判定のやり方を、知りたいのです。 SHAPEを、コントロール配列にして、 0~4までが、全部Falseだったら、 チェックを入れる。 という風にしたいのです。 現在は If (Shape(0).Visible = False) And (Shape(1).Visible = False) And ~省略~ Then    hanntei = True 'Boolean形 end if という風に、全部書いてます。 まだまだ、SHAPEは増やす予定なので、 そうするとどうしても、長くなってしまうので、どうにかしたいのですが、思いつきません。 どなたか、教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • hequil
  • ベストアンサー率65% (242/372)
回答No.1

Shapeコントロールの数をあらかじめ「SHAPE_NUMS」という変数に入れておいて j = 0 For i = 1 To SHAPE_NUMS   j = j + Shape(i).Visible Next i If j = 0 Then   hanntei = True Else   hanntei = False End If なんて方法もありますけど、美しくないですね(苦笑) これはFalseの値が0という点を利用した方法ですけど、これならShapeコントロールが増えても対応できます。 参考まで

mutuzi
質問者

お礼

早速の書き込みありがとうございます。 変数を三つ使用してますが、 一番まともに動いたので、つかわせて、もらいます。 どうもありがとうございました。

その他の回答 (3)

  • yoshioz
  • ベストアンサー率28% (10/35)
回答No.4

こんな感じでコードを書いたらShapeが増えても コードを変更しなくてもいいし、 コードもすっきりします。 Dim shp As Shape hanntei = True For Each shp In Shape If shp.Visible Then hanntei = False Exit For End If Next shp

mutuzi
質問者

お礼

書き込みありがとうございます。 短くていいのですが、 for eachステートメントを知らなかったため、 解読に苦労しました。(苦笑) 最初に書かなかった俺も悪いのですが、 タイマーを二つで制御してますので、 始めに、TRUEにしてしまうと、誤作動が・・・ でも、for eachステートメントは、他ので使えるので 使わせてもらいます。 どうもありがとうございました。

  • ARC
  • ベストアンサー率46% (643/1383)
回答No.3

VBにおいては、FALSEは0と同値であるため、「行儀の悪い」手法を使えば、 For i=0 to 4   Hit=Hit + Shape(i).visible Next i IF Hit=0 THEN   hantei=True ELSE   hantei=False END IF であるとか、 IF Shape(0).Visible +Shape(1).Visible +… = 0 Then   hantei=True END IF ってな感じの記述ができます。 もしくは、「行儀のいい」方法でしたら hantei=True FOR i=0 to 4   IF Shape(i).Visible = True then     hantei=False     Exit For   END IF NEXT i みたいな書き方が出来るでしょう。

mutuzi
質問者

お礼

書き込みありがとうございます。 FALSEは0と同値は、知りませんでした。(苦笑) 行儀の悪い方法の、二つ目は、あまり俺のと変わりませんね。あと、いい方法でも、上の方と、変わらなく、 誤作動が起きてしまったので、 悪いと言われてますが、一番上の方法を取ろうと想います。 ありがとうございました。

noname#9414
noname#9414
回答No.2

C言語ならば、 if(Shape[0].Visible & Shape[1].Visible...) なんてこともできたはずですが、VBだとどうだろう? まぁ、hequil様のがいい手だと思いますよ。 #汎用性はないけど・・・ #どれかがTRUEだったらなんてことになったら、 #結構改良が面倒そうだから。 後から、どれかがTRUEだったらなんて判定を 追加しそうならば、サブルーチンを一つ作っておくと いいかもしれませんね。そちらに追加するだけで、 問題なく変更できますから。 ではでは☆

mutuzi
質問者

お礼

書き込みありがとうございます。 C言語ならば、と書いていただいた例は、 結論的には全部書く ということですよね・・・・?(苦笑) とりあえず、サブルーチンを~変更できますから というのは、ありえることなので、考えておこうと想います。 ありがとうございました。

関連するQ&A

  • 特定のキーを入力すると、visible=falseからtrueになるよ

    特定のキーを入力すると、visible=falseからtrueになるようにコーディングしたいのですがうまくいきません。次のようにalt+F12でFrameを表示させたいのですが全く反応しません。何故でしょう。 Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) Select Case KeyCode Case vbKeyF12 If Shift = vbAltMask Then Frame2.Visible = True End If End Select End Sub アドバイス願いますm(_ _)m

  • エクセルVBAでShapesまたはDrawingObjects

    シート上のフォームなどを表示/非表示するためtest04を書きましたが、「実行時エラー438 オブジェクトはこのプロパティまたはメッソッドをサポートしていません」となります。 しかし、Test05のように同じことをForNextで回せばうまくいきます。 また、Test06のようにShapesをDrawingObjectsに書き換えただけでもうまくいきます。 では、Test04がエラーになるのはなぜでしょうか? Sub test04() With ActiveSheet.Shapes If .Visible = False Then .Visible = True Else .Visible = False End If End With End Sub Sub test05() For Each sp In ActiveSheet.Shapes If sp.Visible = False Then sp.Visible = True Else sp.Visible = False End If Next End Sub Sub test06() With ActiveSheet.DrawingObjects If .Visible = False Then .Visible = True Else .Visible = False End If End With End Sub

  • SGN関数を使った2つの動的配列の初期化判定

    Excelのvbaにおいて2つの動的配列を同時に初期化(redimされているか)どうか判定するときに sgn関数を使うとおかしな現象が起こります。 a,bの動的配列を2つ宣言して、redimを行う前あるいはeraseで開放した後に sgn(a)=0とsgn(b)=0の結果を評価すると共にTrueが返ってきますが (Sgn(a) = 0) And (Sgn(b) = 0) を評価すると なぜかFALSEが返ってきます。 (True And True = FALSEとかいう矛盾した結果が返ってくる) sgn(a)=0、sgn(b)=0の結果をそれぞれAbool,Bboolというbool型変数に格納してから Abool And Bboolとすれば、正しい評価は可能なのですが、 (Sgn(a) = 0) And (Sgn(b) = 0) がFALSEになる理由がわかりません。 この現象が起こる理由を押して下さい。 この現象が発生しているパソコンは2台あります。 OSはWindows 7の32bitと64bit Excel 2013 32bit (2台とも) 以下はサンプルコードです。 Public Sub test() Dim a() As Integer Dim b() As Integer If Sgn(a) = 0 Then MsgBox "配列aは初期化されていません。" If Sgn(b) = 0 Then MsgBox "配列bは初期化されていません。" If (Sgn(a) = 0) And (Sgn(b) = 0) Then MsgBox "配列a,bは両方共初期化されていません。" Else MsgBox "配列a,bはいずれかが初期化されています。" End If End Sub

  • 複数のセルのなかに該当があればオートシェイプを表示

    http://okwave.jp/qa/q8365189.html 上記質問の続きです。 画像のようなチェック表をExcelで作っています。 右側欄外に表を作成し、 ◎を付ける番号、○をつける番号をそれぞれ入力し、 「入力内容を反映」ボタンをクリックすると、 オートシェイプで配置した◎や○が表示されるようにしたいです。 VBAを以下のように作成してみたのですが、 ◎はつくのですが、 ○をつけるVBAが動きません。 どのように修正するべきでしょうか? ご教授ください! Private Sub CommandButton1_Click() '○で囲むVBA Dim c For Each c In Range("U103:Y103") If InStr(c.Value, "1") > 0 Then ActiveSheet.Shapes("1を囲む○").Visible = True Else ActiveSheet.Shapes("1を囲む○").Visible = False End If If InStr(c.Value, "2") > 0 Then ActiveSheet.Shapes("2を囲む○").Visible = True Else ActiveSheet.Shapes("2を囲む○").Visible = False End If Next c ・ ・ ・ '最も重要なものを◎で囲むVBA If Range("T103").Value = "1" Then ActiveSheet.Shapes("1を囲む◎").Visible = True Else ActiveSheet.Shapes("1を囲む◎").Visible = False End If If Range("T103").Value = "2" Then ActiveSheet.Shapes("2を囲む◎").Visible = True Else ActiveSheet.Shapes("2を囲む◎").Visible = False End If ・ ・ ・ End Sub ちなみに「'○で囲むVBA」のコードだけを残して動作させてみると、 1や2が一番右のセル(Y103)に入力されると、1を囲む○、2を囲む○がそれぞれ表示されるのですが、 それ以外のセル(U103からX103)に1や2を入力しても○は表示されません。 全コードを入力して動作させると、 1や2を一番右のセル(Y103)に入力しても○はどこにも表示されません。 よろしくお願いいたします!

  • if文で・・・

    booleanの判定するときのif文の書き方ですが、 (1) if( !flg ) then (2) if( flg != true ) then (3) if( flg == false ) then のどれにしますか?

  • DataGridView上のチェックボックスが、TrueかFalseか

    DataGridView上のチェックボックスが、TrueかFalseか判定する際にエラーが出て困っています。 DataGridViewにチェックボックスのカラムを設定し、そのチェックボックスがTrueがFalseかを判断したいと思っています。 以下のコードではエラーになるのですが、何が原因でしょうか。 前提条件 ・環境:VS.NET(VB) ・DataGridView名:dgv ・チェックボックスのカラム名:cCheck For Each dgr As DataGridViewRow In dgv.Rows If CType(dgr.Cells("cCheck").Value, Boolean) Then '処理 End If Next デバッグをしていると、 上記の「 If CType(dgr.Cells("cCheck").Value, Boolean) Then」 でエラーが発生します。 エラー内容は「string型からBoolean型への変換は無効です。」です。 お分かりの方がおりましたら、ご回答頂ければ幸いでございます。 よろしくお願い致します。

  • Access レポートの詳細Formatに複数の式

    いつもお世話になっています。 レポートの詳細に結婚して姓が変更になった場合、旧姓に取り消し線を引く という式を作成しました。 Private Sub 詳細_Format(Cancel As Integer, FormatCount As Integer) If 新姓 <> "" Then Me.取り消し線1.Visible = True Me.取り消し線2.Visible = True Else Me.取り消し線1.Visible = False Me.取り消し線2.Visible = False End If End Sub 今回は、住所も変更になって新住所が入力されたら、旧住所に取り消し線を引きたいと 思います。 ただし、変更にならない場合もあるので、別のIF文になります。 Private Sub 詳細_Format(Cancel As Integer, FormatCount As Integer) If 新住所 <> "" Then Me.取り消し線3.Visible = True Me.取り消し線4.Visible = True Else Me.取り消し線3.Visible = False Me.取り消し線4.Visible = False End If End Sub レポートの詳細_Formatに複数の条件を設定することができるのでしょうか。 お力添えをお願いいたします。

  • VBのコードが理解できません 解説いただけないでしょうか?

    Dim ObjIE As Object Dim ObjShell As Object Dim ObjWindow As Object Dim WinExist As Boolean WinExist = False Set ObjShell = CreateObject("Shell.Application") For Each ObjWindow In ObjShell.Windows If TypeName(ObjWindow.Document) = "HTMLDocument" Then  WinExist = True  Set ObjIE = ObjWindow End If Next Set ObjShell = Nothing If Not WinExist = True Then Set ObjIE = CreateObject("InternetExplorer.Application") End If ObjIE.Navigate "http://nantokakantoka.html" ObjIE.Visible = True このコードを解説いただけないでしょうか? 特に WinExist For Each ObjWindow In ObjShell.Windows If TypeName(ObjWindow.Document) = "HTMLDocument" Then が何をしているのか分からないんです。

  • VBScript 正規表現で入力された値を判定する

    初めまして。現在VBScriptでプログラムを組んでいるのですが、 どうしても詰まってしまいましたので、ご教授お願いします。 内容は、textboxに入力された値(textbox)を正規表現を用いて 半角数字のみtrue、数字以外の文字が含まれている場合はfalseを返したいと思っています。 if moji_check(textbox)=false then response.write "数字以外が入力されました。<br>"  else      Session("hensuu") = textbox end if function moji_check(strLen) if strLen.pattern("[^0-9]") then moji_check = true else moji_check = false end if end function という風に書いてみたのですが、実行してみると if strLen.pattern("[^0-9]") then 部分のstrLenがオブジェクトが無いと エラーが吐かれてしまいます。 このような場合の対処法を調べてみたのですが、プログラミング自体が不慣れなため わかりませんでした。 よろしくお願いいたします。

  • エクセル2000VBAでオブジェクトの指定

    エクセル2000VBAでオブジェクトの指定 ワークシート上にボタン、チェックボックス、コンボボックス等のコントロールがあります。(OLEオブジェクトではありません、フォームのオブジェクトです。) そして、それらのすべてが表示されているわけではなく、中にはVisible=False で非表示にされているものもあります。 またフォーム以外にもワードアート、ピクチャー等のオブジェクトも配置されています。 このうち、現在表示されているボタン、チェックボックス、コンボボックス等のコントロールだけを非表示にし、その後再度表示させたいのです。(最初から非表示のものは表示させない) 一応、以下のようなVBAコードで目的は達成されます。 Sub TEST01()   Dim ob As Object   Dim buf As Boolean, myAry As Variant   With ActiveSheet        Application.ScreenUpdating = False '画面更新停止     For Each ob In .DrawingObjects 'Shapesではダメ       If ob.Visible = True Then '可視なら         Select Case TypeName(ob) '以下に該当すれば選択           Case "Button": ob.Select (False)           Case "CheckBox": ob.Select (False)           Case "DropDown": ob.Select (False)           Case "Spinner": ob.Select (False)         End Select       End If     Next ob          If TypeName(Selection) <> "Range" Then '対象があれば       buf = True       Set myAry = Selection       .Range("A1").Select       myAry.Visible = False '非表示に     End If     Application.ScreenUpdating = True '画面更新停止解除          If buf Then       MsgBox "非表示にしました。"       myAry.Visible = True '表示       MsgBox "再度表示しました。"       Set varAry = Nothing     Else       MsgBox "非表示にする対象はありません。"     End If        End With End Sub 質問は2つですが、どちらかへの回答でもかまいません。 1.上記コードでは対象のオブジェクトをSelectしてから Set myAry = Selection で変数を定義しましたが、いちいちSelectしなくともよい方法を知りたいのです。 多分、対象のオブジェクトを配列に取り込めばいいのでしょうが、やり方がわかりません。 2.上記コードではいちいち Case "Button" Case "CheckBox" などと、コントロールの種類を列記していますが、これを列記しないでもコントロールだと識別する方法はないのでしょうか? お知恵をお貸しください。