• ベストアンサー

VB6.0 で

現在、VB6.0でイルミネーションもどきのプログラムを作成しています。 8つのランプコントロールがコントロール配列されていて、初めは全て消灯している状態から、コマンドボタンを1回クリックすると一番右側の一つが点灯し、またクリックすると右のランプが消えて、左隣のランプが点灯します。 これを繰り返していって、一番左のランプが点灯したら再び一番右のランプが点灯するという下の図の様な感じです。 7 6 5 4 3 2 1 0 ←オブジェクトCWBtnのIndex番号です。 ○○○○○○○● ↓ ○○○○○○●○ ↓ ○○○○○●○○ ↓ ○○○○●○○○ ↓ ○○○●○○○○ ↓ ○○●○○○○○ ↓ ○●○○○○○○ ↓ ●○○○○○○○ ↓ ○○○○○○○● この繰返しです。 現在のコードです。当方、VBを勉強し始めて未熟ですので、まずどういった変数を用意するか、データ型はどうしようなどで深く悩んでしまうレベルです。突っ込みどころ満載でしょうが、ご容赦下さい。。。 Private Sub cmd2_Click() '変数の宣言 Dim Index As Integer   For Index = 0 To 7 Step 1 If CWBtn(Index).Value = False Then Select Case Index Case 0 CWBtn(0).Value = True Case 1 CWBtn(1).Value = True Case 2 CWBtn(2).Value = True Case 3 CWBtn(3).Value = True Case 4 CWBtn(4).Value = True Case 5 CWBtn(5).Value = True Case 6 CWBtn(6).Value = True Case 7 CWBtn(7).Value = True End Select Exit For ElseIf CWBtn(Index).Value = True Then Select Case Index Case 0 CWBtn(0).Value = False Case 1 CWBtn(1).Value = False Case 2 CWBtn(2).Value = False Case 3 CWBtn(3).Value = False Case 4 CWBtn(4).Value = False Case 5 CWBtn(5).Value = False Case 6 CWBtn(6).Value = False Case 7 CWBtn(7).Value = False End Select End If Next Index 実行は出来るのですが、うまくいきません。 どなたか教えて下さい。宜しくお願いします。

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

  • ベストアンサー
  • s-uzen
  • ベストアンサー率65% (2051/3118)
回答No.3

No.1さんのをチョット拝借して Private Index As Integer Private Sub Form_Load()  For Index = 0 To 7   CWBtn(Index).Value = False '全て消灯  Next Index  Index = 7 End Sub Private Sub Command_Button_Click()  CWBtn(Index).Value = False '消灯  Index = Index + 1  If Index > 7 Then Index = 0 '最後の左端を消灯なら、Indexを最初にする  CWBtn(Index).Value = True '点灯 End Sub のような感じで。 Indexの初期値やカウントアップする場所、判定の仕方で、何通りもありと思いますけどね。  

aries-0323
質問者

お礼

ご回答有難う御座います。 なるほど、判定の仕方などでやり方は何通りもあるんですね! 書いて頂いたコードを勉強させてもらいます。

その他の回答 (2)

  • ShowMeHow
  • ベストアンサー率28% (1424/5027)
回答No.2

for index = 0 to 7 if cwbtn(index) then csbtn(index) = false cwbtn((index+1) mod 8) = true exit for end if next index (点灯部分を探して操作する、悪いプログラミングの例でした。) 突っ込みといえば、 > Select Case Index Case 0 CWBtn(0).Value = True Case 1 CWBtn(1).Value = True Case 2 CWBtn(2).Value = True Case 3 CWBtn(3).Value = True Case 4 CWBtn(4).Value = True Case 5 CWBtn(5).Value = True Case 6 CWBtn(6).Value = True Case 7 CWBtn(7).Value = True End Select これって、 CWBtn(Index).Value = True 一行と同じことです。

aries-0323
質問者

お礼

ご回答有難う御座います。 ご指摘も言われるまで全く気づきませんでした… 教えて頂いたコードを試したりして、落ち着いて勉強していきます。

  • OKbokuzyo
  • ベストアンサー率43% (130/296)
回答No.1

落ち着いて考えてみ。 1回目⇒0番目点灯(true) 2回目⇒0番目消灯(false)、1番目(true) 3回目⇒0番目がfalseなので再び0番目点灯(true) やり方はいろいろあるけどIndexのスコープをあげてインスタンス変数かなんかにしたら? ↓のようなカンジではどぅ? Private Index As Integer = 0 Private Sub cmd2_Click() CWBtn(Index).Value = false If Index <> 7 then CWBtn(Index + 1).Value = true else CWBtn(0).Value = true End If ※未検証

aries-0323
質問者

お礼

ご回答有難う御座います。 焦らず落ち着いて勉強していこうと思います。 動きを確認しながら試してみます。

関連するQ&A

  • VB6.0 で パート2

    前回ご回答頂きました皆様、有難う御座います。 度々質問させて頂きます。8つのコントロールがコントロール配列されていて、初めは全て消灯している状態から、コマンドボタンを1回クリックすると一番右側の一つが点灯し、またクリックすると右のランプが消えて、左隣のランプが点灯します。 これを繰り返していって、一番左のランプが点灯したら再び一番右のランプが点灯します。以前はここまでの動きをこちらで質問して教えて頂いたのですが、この動きの延長でそこから今度は逆に一番左側のランプが点灯した跡にもう一回、ボタンをクリックしたら右側のランプが順々に点灯していくような事を考えています。 説明が下手なのですが、下の図の様な感じです。 7 6 5 4 3 2 1 0 ←CWBtn(Index)番号 ○○○○○○○●      ↓ ○○○○○○●○      ↓ ○○○○○●○○      ↓ ○○○○●○○○      ↓ ○○○●○○○○      ↓ ○○●○○○○○      ↓ ○●○○○○○○      ↓ ●○○○○○○○      ↓ ○●○○○○○○      ↓ ○○●○○○○○      ↓ ○○○●○○○○      ↓ ○○○○●○○○      ↓ ○○○○○●○○      ↓ ○○○○○○●○      ↓ ○○○○○○○● この繰返しです。 Private Sub cmd1_Click() Dim Index As Integer '右から左へランプコントロールが点灯していく処理 '消灯の処理 CWBtn(Index).Value = False Index = Index + 1 'もしIndexが7より大きければ、Indexを最初の0に戻す If Index > 7 Then Index = 0 End If '点灯の処理 CWBtn(Index).Value = True '左から右へランプコントロールが点灯していく処理 CWBtn(Index).Value = True Index = 0 '消灯の処理 CWBtn(Index).Value = False Index = Index + 1 'もしIndexが7より小さければ、Indexを右の6方向に戻す If CWBtn(7).Value = True Then Index = Index + 1 End If '点灯の処理 CWBtn(Index).Value = True End Sub Private Sub Form_Load() 'フォームを開く直前に行う処理 For Index = 0 To 7 '全て消灯 CWBtn(Index).Value = False Next Index 'Indexに7の初期値を設定 Index = 7 End Sub 以上が教えていただいたコードで自分で書いたのですが… また教えて頂きたいです。宜しくお願い致します。

  • VBA初心者なのですが(Userformについて)

    まずは質問ご覧いただきありがとうございますm(_ _)m さっそくなのですが、次のプログラムを打つとSelect Caseのところで”指定されたオブジェクトは見つかりません”と出てしまうのですがなぜでしょうか。回答お待ちしております。 Private Sub CommandButton2_Click() Dim msg As String, i As Integer Dim ii As Integer, msg2 As String For i = 1 To 3 If Controls("CheckBox" & i).Value = True Then msg = msg & Controls("CheckBox" & i).Caption & vbCrLf End If Next i For ii = i To 2 If Controls("OptionBotton" & i).Value = True Then msg2 = msg2 & Controls("OptionBottob" & i).Caption & vbCrLf End If Next ii Select Case Controls("CheckBox" & i).Value & Controls("OptionBotton" & i).Value Case Controls("CheckBox" & i).Value = True & Controls("OptionBotton" & i).Value = False MsgBox msg & "がチェックされてます" Case Controls("CheckBox" & i).Value = False & Controls("OptionBotton" & i).Value = True MsgBox msg2 & "オン" Case Controls("CheckBox" & i).Value = True & Controls("OptionBotton" & i).Value = True MsgBox msg & "がチェックされています" & vbCrLf & msg2 & "オン" Case Else MsgBox "チェック又は、オンにしてください" End Select End Sub

  • VBのReturnの使い方

    Excel2007のVBで以下のfunctionを定義すると、Returnのところでコンパイルエラーになります。 -------------------------------------- Public Function IsTen(lNumber As Integer) As Boolean If lNumber = 10 Then Return True Else Return False End If End Function -------------------------------------- ググってみるとReturn True とか Return False とかができるように思えるのですが、何が不味いのでしょうか? VBの知識はあまりなく、低レベルな質問かもしれませんが、よろしくお願いします。

  • エクセル VBA for文について

    再び失礼します。 昨日VBAを始めた初心者です。 1、チェックボタン17個にそれぞれ変数を設定 2、2つだけチェックを入れると仮定して、実行ボタンを押したときに チェックが入っている2つの中で変数の大きいものをMax、小さいものをMinとしてシートに出力したいのですが、”ここ”と書いてあるところに Me("hensuu" & n). hensuu & n など入れてみたのですがエラーになります。 くだらないミスだと思いますがよくわかりません。 どなたかご教授お願いします。 Private Sub CommandButton2_Click() If Check1.Value = True Then hensuu1 = "9" End If If Check2.Value = True Then hensuu2 = "8" End If If Check3.Value = True Then hensuu3 = "7" End If If Check4.Value = True Then hensuu4 = "6" End If If Check5.Value = True Then hensuu5 = "5" End If If Check6.Value = True Then hensuu6 = "4" End If If Check7.Value = True Then hensuu7 = "3" End If If Check8.Value = True Then hensuu8 = "2" End If If Check9.Value = True Then hensuu9 = "1" End If If Check11.Value = True Then hensuu10 = "1/2" End If If Check11.Value = True Then hensuu11 = "1/3" End If If Check12.Value = True Then hensuu12 = "1/4" End If If Check13.Value = True Then hensuu13 = "1/5" End If If Check14.Value = True Then hensuu14 = "1/6" End If If Check15.Value = True Then hensuu15 = "1/7" End If If Check16.Value = True Then hensuu16 = "1/8" End If If Check14.Value = True Then hensuu17 = "1/9" End If Dim n As Long Dim Max As Long Dim Min As Long For n = 1 To 17 If Me("Check" & n).Value = True Then Max = ”ここ” If Me("Check" & n).Value = True Then Exit For Next n For n = Max To 17 If Me("Check" & n).Value = True Then Min = ”ここ” If Me("Check" & n).Value = True Then Exit For Next n Worksheets("Sheet1").Range("A1") = Min Worksheets("Sheet1").Range("B1") = Max MsgBox hensuu End Sub

  • excel2007 VBで

    下記のマクロ作成して実際にセルにA、あるいは何かデータを入力しても下記イベント?が発生している気配がありません。 Application.EnableEvents = Falseの行がなにか問題なのでしょうか。実プログラムは If Target.Value = "A" Or Target.Value = "A" Thenの他にB、C、計算も含んでいるのですがApplication.EnableEvents = TrueはEnd Subの前行に入れてあります。 他に設定することがあるのでしょうか。どなたか教えてください。 Private Sub Worksheet_Change(ByVal Target As Range)    If Target.Count > 1 Then Exit Sub '複数セルの入力は無視 Application.EnableEvents = False '割込み停止 ’[B3] = 123 ’Stop If Target.Value = "A" Or Target.Value = "A" Then Target.Value = "A" End If Application.EnableEvents = True '割込み再開 End Sub excel2007 VB6.5です。

  • タブ移動で最後のTabIndexまで行くと頭から繰り返さないようにしたい

    環境は、VB.NETです。 タブ移動で、最後のTabIndexまでカーソルが行くと、その次は、また頭から(最初のTabIndexから)繰り返しますが、それを止めたいです。 つまり、最後のTabIndexまでカーソルが行くと、いくらTabキーを押しても、そのコントロールにカーソルをとどめておきたいのです。 しかし、逆タブ(Shift+Tab)を押すと、TabIndexをさかのぼって、最初のTabIndexのコントロールまでバックさせたいです。 で、頭のコントロールにカーソルをたどり着くと、またそこでとどまるといった動きを実現したいと思っています。 何か、良い方法がございましたら、ご教授下さいませ。 ちなみに、以下のコードで、Enterキーを使ってタブ移動させています。 Select Case e.KeyCode  Case Keys.Enter   Dim bThrough As Boolean = False   If TypeOf Me.ActiveControl Is Edit Then    If (CType(Me.ActiveControl, Edit)).Multiline = True Then     bThrough = True    End If   End If   If bThrough = False Then    Dim forward As Boolean = e.Modifiers <> Keys.Shift    'this.ProcessTabKey(forward);    Me.SelectNextControl(Me.ActiveControl, forward, True, True, True)   End If   ・   ・   ・ End Select

  • VB2010 のユーザコントロールのプロパティ

    お世話になっております Windows7、VB2010 Expless で開発しております 後にVS2010のVBに移行する予定です ユーザコントロールでテキストボックスを作っております そこで、初期値を設定しようと思い設定をしたのですが反映されません Imports System.ComponentModel <DefaultValue(True)> Public Property Chk_Num() As Boolean Set(ByVal value As Boolean) If (value = True) Then blnChk_Num = value Else blnChk_Num = value End If End Set Get Return blnChk_Num End Get End Property <System.ComponentModel.DefaultValueAttribute(1)> Public Property Chk_ZenHankaku() As Integer Set(ByVal value As Integer) If (value >= 0 And value <= 2) Then '0以上2以下 blnChk_ZenHankaku = value Else 'マイナス、または3以上の場合は0にする blnChk_ZenHankaku = 0 End If End Set Get Return blnChk_ZenHankaku End Get End Property どちらの方法でも、Booleanの場合は「False」、Integerの場合は「0」になってしまいます また、初期化~プロパティ宣言間に、改行しても改行しなくても結果は同じです どうにか設定できる方法はありますでしょうか よろしくお願いします

  • 【VB】もっと簡単に書けないかな?

    お世話になっております。VB2005を最近かじりました。 フォーム上にボタンが100個ほど並んでいます。 グローバル変数としてboolean型のフラグを立てて、 ボタンを押したらボタンの色がピンクに、もう一度押したら元の色にという ごく簡単なプログラムを書きたいのですが、 1個のボタンごとに Private Flag as Boolean   Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click   Select Case Flag     Case False       Button1.BackColor = Color.Pink       Flag = True     Case True       Button1.BackColor = Color.FromKnownColor(KnownColor.ControlLight)       Flag = False     End Select   End Sub というプログラムを書くと100個同じようなプログラムを書かなくてはいけなくなり、大変手間がかかりメンテも大変です。 もっと簡単にする方法があったら教えていただきたく存じます。

  • Excel VB のチェックボックスの処理について

    Excel VB のチェックボックスの処理について すみません。チェックボックスのチェックの状態を条件に処理をしたいです。 うまくいきません。 Dim strcheckBox As String For i = 0 To 100 strcheckBox = "CheckBox1_" & i   celleSe = "A" & i If Worksheets("test1").Controls(strcheckBox).Value = True Then Worksheets("test2").Range(celleSe).Value = "真" End If Next

  • エクセル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" などと、コントロールの種類を列記していますが、これを列記しないでもコントロールだと識別する方法はないのでしょうか? お知恵をお貸しください。

専門家に質問してみよう