• ベストアンサー

回数の把握

VB6・DB:Access2002 Private Sub Command1_Click() j = 5 For i = 0 To 10 If Form1.Check1(i).Value = 1 Then xlSheet.Cells(j, 1) = Form1.Check1(i).Caption '次のレコードへ j = j + 2 [k = j] End If Next i End Sub 上記のようなコードを作成しているのですが、これでは 当然2回目にクリックイベントを実行した時にはj = 5 を通ってしまうため、最初のレコードからExcelへ書き 込んでしまいます。2回目からは[k = j]で代入した"k" の値を使用し、続きのレコードから書き込んでいきたい のですが、最初のjを通らせない、良い方法はありません か?よろしくお願いします。(すべて左側に寄っていて 見にくいようで申し訳ありませんが(汗))

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

  • ベストアンサー
  • taknt
  • ベストアンサー率19% (1556/7783)
回答No.3

jをグローバル変数にもたしてあげればいいだけでしょう。 General の Declarationsで 変数を宣言して 初期値をセットしてあげればいいだけです。 ま j = 5 だけでもいいと思いますが。 それで 最後の部分 Next i End Sub を Next i j = k End Sub としてあげればいいでしょう。

siamzou
質問者

お礼

グローバルに持たせてはいるのですが Public j As Integer と、定義のみしか行っていませんでした。 j = 5 自体もグローバルで設定するようにして うまくいきました。 ありがとうございました。

その他の回答 (2)

  • Largo_sp
  • ベストアンサー率19% (105/538)
回答No.2

Jをグーローバル変数にするのが、簡単かな... で、最初に定義しておく... 別にグローバル変数を作って何回目かのクリックを 判断させるというのもありますね... プライベート変数だけだど解決できないとおもいます。 変数の名前が違うかもしれないけど...

siamzou
質問者

お礼

ありがとうございました。解決できました。

  • PAPA0427
  • ベストアンサー率22% (559/2488)
回答No.1

フォーム上に、一つ隠しのフィールド(テキストボックス)を作成し、VisibleをFalseにして置いてください。これを「A」と命名しておくことにします。初期値を5に設定して置いてください。 で、 Private Sub Command1_Click()   j = Form1.A.Value    For i = 0 To 10   If Form1.Check1(i).Value = 1 Then    xlSheet.Cells(j, 1) = Form1.Check1(i).Caption    '次のレコードへ    j = j + 2   End If  Next i  Form1.A.Value = j End Sub となります。

siamzou
質問者

お礼

今回時間がありませんでしたので、異なる方法で 解決しましたが、貴重なご意見ありがとうございました。

関連するQ&A

  • VB初心者です

    計算結果が"7"の時に限り、「当たり!」と表示される、ちょっと意味不明な計算機を作っています。 現在、下記のように書いてますが、何故かうまくいきません。(当たりが表示されない 何故でしょうか?お助けください。。m(_ _)m Private Sub Command1_Click() Label1.Caption = Str(Val(Text1.Text) + Val(Text2.Text)) Label3.Caption = "+" Label4.Visible = False '画像を隠す。 'いずれかの数字が「7」のとき、メッセージを表示する。 If Label1.Caption = "7" Then Label4.Visible = True End If End Sub Private Sub Command2_Click() End End Sub Private Sub Command3_Click() Label1.Caption = Str(Val(Text1.Text) * Val(Text2.Text)) Label3.Caption = "*" End Sub Private Sub Command4_Click() Label1.Caption = Str(Val(Text1.Text) - Val(Text2.Text)) Label3.Caption = "-" End Sub Private Sub Command5_Click() Label1.Caption = Str(Val(Text1.Text) / Val(Text2.Text)) Label3.Caption = "/" End Sub

  • VB6 Form内のDragDrop

    VB6でForm内にCommandButtonがいくつか有ります。 各CommandButtonはClickするとShellオブジェクトでファイルを開く様になっています。 やりたいことは 2つのCommandButton間をDragDrop?によりCaptionを入れ替えたいです。 (CommandButton間をマウスDragDropでCaption名入れ替え) MouseDownとDragDropイベントで何とかなると思いましたがうまくいきません。 Dim dd As Integer Private Sub Command1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) If Button = vbLeftButton Then dd = 1 'CommandボタンNo, End If End Sub Private Sub Command2_DragDrop(Source As Control, X As Single, Y As Single) Dim cn As String cn = Command2.Caption Command2.Caption = Controls("Command" & dd).Caption Controls("Command" & dd).Caption = cn End Sub CommandButtonプロパティでDragModeを自動にするとShellオブジェクトでファイルが開かないし サイトで調べたところファイルの移動やコマンド自体の移動などで分かりませんでした。 ご教授お願い致します。

  • オブジェクト名を変数で参照できますか

    VB初心者です。 配列の場合 Dim str(10) as string と宣言し、i番目のデータを取り出したいときには、str(i) と記述すると思います。 そこで質問ですが、例えばCommandが1~10まであるとします。 オブジェクト名はそのまま(Command1, Command2)で、それぞれのCaptionに違ったデータが入っています。 (例えば、Command1のCaptionには'A' Command2のCaptionには'B'といった感じに) ある文字列があり、For文を使い、CommandのCaptionとその文字列が一致したときに文字列を出力するという処理を行いたいとき、どのように Command1~10のCaptionを回せばいいのでしょうか? コードを記述しておきます。 Dim str(10) as String Dim i as Integer Dim j as Integer for i = 0 to 10 for j = 0 to 10 ☆☆ if Command(i).Caption = str(j) then print.str(j) end if next next ☆☆のところです。 可能であれば回答をお待ちしております。 環境は windows XP, VB6.0 です。

  • ループが無駄に複雑な気が…

    以下は私が作成したプログラムで、 1.form[4][4][4]の三次元配列に0~32のランダムな正の整数を入れる 2.このランダムな数値の同じものは2つまで 3.form[i][j][0]~form[i][j][3]には同じ数値が入ってはいけない という条件を考えて作成したのですが、無駄に複雑になった気がします。 このプログラムはform[i][j][0]~form[i][j][3]が入らないように、数値が被ったら最初からやり直しにしています。 この作り方だと、これ入れないと最後の1個が被ってしまうものだったら無限ループが起きてしまうので…。 この無駄に複雑になってしまった気がするプログラムを、もっとシンプルに出来ないでしょうか? import java.util.Random; public class Loop { public static void main(String[] args){ int num; int[] check=new int [32]; int[][][] form=new int[4][4][4]; Random rand=new Random(); int i=0,j=0,k=0; for(i=0;i<32;i++) check[i]=0; i=-1; while(true){ while(true){ while(i<3){ num=rand.nextInt(32); if(check[num]!=2){ i++; form[i][j][k]=num; System.out.println(i+" "+j+" "+k+" "+form[i][j][k]); check[num]++; if(0<k){ for(int l=0;l<k;l++){ if(form[i][j][k]==form[i][j][l]){//同じだったらループのやり直し for(int m=0;m<32;m++) check[m]=0; i=-1; j=0; k=0; } } } } } if(j==3) break; num=rand.nextInt(32); if(check[num]!=2){ i=0; j++; form[i][j][k]=num; System.out.println(i+" "+j+" "+k+" "+form[i][j][k]); check[num]++; } } if(k==3) break; num=rand.nextInt(32); if(check[num]!=2){ i=0; j=0; k++; form[i][j][k]=num; System.out.println(i+" "+j+" "+k+" "+form[i][j][k]); check[num]++; } } for(i=0;i<4;i++){ for(j=0;j<4;j++){ for(k=0;k<4;k++){ System.out.println(k+" "+j+" "+i+" "+form[k][j][i]); } } } System.out.println("end"); System.exit(0); } }

    • ベストアンサー
    • Java
  • 3次元配列のループによる比較の回数を減らす

    以下は正の整数が入った3次元配列form[30][20][8]で、中身が一致している2カ所に-1を代入してループを抜けるというプログラムの一部分なんですが、無駄なループを減らすにはどういった変更をすればいいでしょうか? form[30][20][8]は変更しない方向でお願いします。 check: for(int i=0;i<30;i++){ for(int j=0;j<20;j++){ for(int k=0;k<8;k++){ for(int l=0;l<30;l++){ for(int m=0;m<20;m++){ for(int n=0;n<8;n++){ if(form[i][j][k]==form[l][m][n]&&!(i==l&&j==m&&k==n)form[i][j][k]!=-1) count++; form[i][j][k]=-1; form[l][m][n]=-1; break check; } } } } } } }

    • ベストアンサー
    • Java
  • ステートメントの簡略方法(ループ)

    Visual Basic 6.0 For/Doを使って省略可させようと考えているのですが、オブジェクト名は ループさせて省略可出来ないのでしょうか? 下記はフォームロード時に各セルの値を各CommandButton名に割り当てています。(一部分です) (例) CB○はCommandButtonのオブジェクト名です。 Form2.CB1.Caption = Trim(xlSheet.Cells(11, 3)) Form2.CB2.Caption = Trim(xlSheet.Cells(12, 3)) Form2.CB3.Caption = Trim(xlSheet.Cells(13, 3)) Form2.CB4.Caption = Trim(xlSheet.Cells(14, 3)) Form2.CB5.Caption = Trim(xlSheet.Cells(15, 3)) ・ ・ ・  ↓ Dim SUU As Integer Dim i As Integer SUU = 0 For i = 1 To 20 Step 1 SUU = SUU + 1 Form2.CB1.Caption = Trim(xlSheet.Cells(10 + SUU, 3)) Next i CB1の部分を "CB" & SUU の様にしたいのですが、エラーしてしまいます。 省略可の方法が有りましたら教えて下さい。

  • "Enterキー"で閉じる方法…

    お世話になります。 VB初心者&独学でどうしても解けない問題があり、是非、お知恵をお貸し頂けたらと思います。 アラームを作ろうと思い、下記のようなプログラムを作りました。(簡略版) 指定した時間になるとForm2が開かれ、"OK"ボタンで閉じるという単純なものです。 ここで問題が発生したのですがアプリケーションがアクティブ(選択されている)状態だとForm2もアクティブ状態になり"Enterキー"で閉じることが出来ますが、非アクティブ状態ですとForm2も非アクティブ状態で開かれ、タスクバーが点滅して"Enterキー"で閉じれず一度マウスでクリックしてアクティブにしてからではないと閉じれません。 SetActiveWindowや、SetForcusなどでアクティブしても見た目はアクティブになっていますが、"Enterキー"で閉じることが出来ません。 メインForm1が非アクティブ状態でもForm2がアクティブになり、"Enterキー"だけで閉じる方法は無いでしょうか…。 まとまりの無い文章で難解かと思いますが、宜しく御願いします。 (VB6.0、Windows2000) *Form1* Private Sub Form_Load() Me.Timer1.Interval = 500 End Sub Private Sub Timer1_Timer() If Format(Now, "hh:mm:ss") = "12:00:00" Then Form2.Show End If End Sub *Form2* Private Sub Command1_Click() Unload Me End Sub Private Sub Form_Load() Form2.Command1.Caption = "閉じます" End Sub

  • for文の使い方

    for文の中にif文を入れて使いたいのですが「Nextに対するforがありません」となりエラーが出てしまいます。どうしたらよいのでしょうか? If Option1.Value = True Then For i = 2 To 10  If xlSheet.Cells(i, 2).Value > 10 Then Form2.List1.AddItem xlSheet.Cells(i, 1) Next i End If End If

  • 途中でエラーが出てしまい手が止まってしまいました(T_T)

    Visual Basicについてなんですが、いいですか? http://azsx00.tripod.co.jp/D001.jpg 初心者じみた質問ですみません。 上記の画像ののようなプログラムが途中までで引っかかってしまって先に進めません。 どなたかご指導下さい。 一応自分で考えた結果です。どこが悪いとか何が分かってないとかいろいろアドバイスもあればお願いします。まだ習い始めたばかりです。 Dim Number As Integer Dim Score As Integer Dim MessageText As String Private Sub Command1_Click() If Number > 7 Then Score = Score + 1 MessageText "あたり" End If If Number < 7 Then Score = Score - 1 MessageText "外れ" End If If Number = 7 Then Score = Score + 0 MessageText "引き分け" End If End Sub Private Sub Command2_Click() If Number > 7 Then Score = Score + 1 MessageText "あたり" End If If Number < 7 Then Score = Score - 1 MessageText "外れ" End If If Number = 7 Then Score = Score + 0 MessageText "引き分け" End If End Sub Private Sub Form_Load() Number = Rnd() * 13 + 1 Score = 0 Label1.Caption = "?" Text1.Text = "Score:" & Score End Sub Private Sub Label1_Click() If Number > 7 Then Label1.Caption = "Score" End If If Number < 7 Then Label1.Caption = "Score" End If End Sub

  • VB6 動的追加コントロールの値変更

    お世話になります。VB6初心者です。 動的追加コントロールの値変更で困っています。 Form3にFrame1をコントロール配列で1つ置いています。 ループ処理でFrame1をループ分LOADし、そのフレームの上にチェックボックスを動的に追加していく処理をしています。この動的に追加したチェックボックスの値の変更ができません。 ちなみに値やキャプションの取得はできます。 どなたかご教授願います。 Private Sub Command1_Click() Dim CHKbox(4) As VB.CheckBox Dim i As Integer For i = 1 To 4 Load Form3.Frame1(i) With Form3.Frame1(i) .Top = Form3.Frame1(i - 1).Top + 450 .Visible = True .Caption = "フレーム" & i End With Set CHKbox(i) = Controls.Add("VB.Checkbox", "CHKbox" & i, Form3.Frame1(i)) With CHKbox(i) .Move 2000, 200, 1300, 180 .Visible = True .Caption = "チェック" & i End With Next MsgBox CHKbox(1).Value  `値の取得は可能ですが CHKbox(1).Value = True   `値の変更ができません End Sub