【解消】質問投稿時のカテゴリ選択の不具合について

ユーザーフォームを使用して指定した回数分(n回)、ユーザーフォーム内の数値のデータをセルに入力をさせたいのですが、上手く動作せず無限に繰り返してしまいます。

例として、ユーザーフォーム1のtxb1に3を入力し実行、ユーザーフォーム2を表示してtxb1-7に数値データを入力して1回反映させた後、ユーザーフォーム2のtxbをクリアして2~3回目も同様な動作をさせるようにしたいです。


Sub 実行()
Dim i as Integer, n as Integer

i=1
n=userform1.txb1.value

If i>n Then
Exit Sub
Else

i=i+1
ActiveCells.value=userform2.txb1.value
右に1マスずらしtxbの数値を反映する同様な処理のため省略

Unload Userform2
Userform2.show
Userform2.txb1.setfocus

End if
End sub

当方、VBA初心者の為勉強をしながら作成をしているのですが、どこを正せば上手く動くのか分からないためお教えいただきたいです。

A 回答 (3件)

繰り返し処理の記載がないようですが、それが書かれていたとして、考えてみます。



変数iが「ユーザーフォーム1」の「テキストボックス1」に入力された数値を超えた場合に、処理を止めるという事をしたいのですよね。

もしも「ユーザーフォーム1」の「テキストボックス1」が空欄だった場合、永遠に条件を満たさずループする… という可能性はありませんでしょうか。もしくは(数値でなく)文字列が入力された場合は、どうなんでしょうか。

テキストボックスの書式設定がどうなっているか、入力された内容が「数値」であるかどうか、確認されてはいかがでしょうか。
    • good
    • 0

こんばんは



ユーザフォームを利用する場合、通常はユーザからの入力を待ち、テキストボックスに入力された際や、あるいは「処理実行」ボタンなどを用意しておいて、入力終了時にボタンを押すことで処理をするものが多いと思いますが、ご提示のコードはそのような構成にはなっていません。

通常であれば、
 Sub TextBox1_Change()

 Sub CommandButton1_Click()
のようなプロシージャを用意しておいて、そちらで処理するのではないかという意味です。


ご提示のコードの場合、ユーザの入力待ちが無いので、無条件で初期設定のの値をそのまま取得すると思いますけれど、そのあたりはどうなっているのでしょうか?
現状であれば、
>Unload Userform2
>Userform2.show
などの表示操作も意味を持たないと思います。
というか、UserForm1も表示していないですし・・・

一方で、
>無限に繰り返してしまいます。
ご質問文に明示されている範囲では、繰り返すような内容は何も記述されていませんけれど、何か肝心の部分を省略していたりしませんか?
    • good
    • 0

まずは、userform1.txb1.valueがあっているかどうかを確認されるとよいかと思います。

 

n=userform1.txb1.value
のあとに
msgbox(n)の一文を加えれば確認できるかと思います。


その上で、テキストボックス1に入れた数値の分だけ処理を繰り返す、、という場合はFor~Next構文を使った方が良いです。

まずは例として、これを試してみてください。
※エラー処理はしていません。

Private Sub 実行()

n = userform1.txb1.Value

For i = 1 To n

’ここに繰り返したい処理を書く
’例ではメッセージボックスをn回表示します。
’表示内容は1からnまでカウントアップする感じででます。

MsgBox (i)

Next

End Sub

仮にテキストボックスに3を入れた場合、
1 2 3 と文字とともに3回メッセージボックスが表示されます。


また、txb1からtxb7 は同じ処理をすると思うので、これもfor~nextで簡潔に記述できます。

例:userform2のtxb1からtxb7までの値を都度メッセージボックスで表示する。

for j=1 to 7

msgbox(userform2.Controls(”txb” & j).Value)

next

>例として、ユーザーフォーム1のtxb1に3を入力し実行、ユーザーフォーム2を表示してtxb1-7に数値データを入力して1回反映させた後、ユーザーフォーム2のtxbをクリアして2~3回目も同様な動作をさせるようにしたいです。

ちょっとどのような処理をしたいかがわかりません。

ユーザフォーム1にはtxb1というテキストボックスと、実行ボタンがある。
txb1に数値を入れ(ここでは3)、実行ボタンを押すと「実行」サブルーチンが呼び出される

ユーザーフォーム2にはtxb1からtxb7までのテキストボックス7つと実行ボタンがある。

各テキストボックスに値を入れ、実行ボタンを押すと、所定のセルに各値が入力される。それが終わったらフォーム2の各テキストボックスの値をクリア
される(フォーム2の実行ボタンを押すと、別のサブルーチンが実行されるようにした方がいいと思います)

結果としては、仮にスタートのセルがA1、nが3だったとしたら、
A1~G1まで1回目のフォーム2のtxb1~7
A2~G2まで2回目のフォーム2のtxb1~7
A3~G3まで3回目のフォーム2のtxb1~7
3行7列=21セルに値が入った状態で終わる、、という事でいいのでしょうか?
    • good
    • 1

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

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報

このQ&Aを見た人がよく見るQ&A