プロが教えるわが家の防犯対策術!

宜しくお願い致します。
ユーザーフォームへのデータ入力を繰り返したいのですが、うまく動いてくれません。
登録件数分データを入力(textbox2)し、それをExcelのシートに出力していきたいと思っています。

具体的には
Dim 登録件数 as integer
DIM i as integer
For i = 1 To 登録件数
TextBox1.Value = i
Cells(i, 2).Value =textbox2.value
TextBox2.Value = ""
Next i
のようなことを考えていますが、これで実行すると、2回目以降、ユーザーフォームのtextbox2にデータを入れることができません。

初歩的な質問で誠に恐縮ではございますが、どこを正せば動くようになるのか、ご指導の程宜しくお願い致します。

A 回答 (10件)

単純なデータ入力なら



For i = 1 To 10
Cells(i, 2).Value = InputBox(i & " 件目")
Next

で可能です。

ユーザーフォームを使うなら、
モジュールのトップに変数(i)を定義して、グローバル変数にして、値を記憶させて置きます。

dim i as intger

Private Sub TextBox1_AfterUpdate()
If i > 登録件数 Then Exit Sub
i = i + 1
Cells(i, 2).Value = textbox2.Value
textbox2.Value = ""
end sub

この回答への補足

hana-hana3様
Give Upです・・・。どうもうまくいきません。
2回目にいく前に終わってしまいます。

補足日時:2006/07/10 17:27
    • good
    • 0
この回答へのお礼

hana-hana3様
いつもありがとうございます。
ユーザーフォームを使いたいと考えておりますので、後半の方法で試しております。
しかし、残念なことに複数回入力させることができません。
現在、原因を確認中です。動きましたら補足いたします。ちょっと時間がかかるかもしれません・・・・。

お礼日時:2006/07/10 17:02

やろうとしていることは、i が増えるたびに textbox2 に値を入力したいんですよね?



Cells(i,2).Value = textbox2.Value

Cells(i,2).Value = InputBox("データを入力してください")
に変更して InputeBox を出してはだめなんですか?
    • good
    • 0
この回答へのお礼

salf様
早速御回答下さりありがとうございます。
私の説明不足でした。すみません。

ユーザーフォームを使ってデータ入力をしたいと考えております。
宜しくお願い致します。

お礼日時:2006/07/10 16:54

>ユーザーフォームを使ってデータ入力をしたいと考えております。


For文を使用して上記をやるには、i が増えるたびに TextBox を入力するために処理を一旦停止しなければならないため、
その考え方は厳しいと思います。
(私が知る範囲ですが・・・。)

For文を使用するとなると、登録件数分の TextBox を作成し、その値を Cell に登録していくしかないと思います。

もしくは、hana-hana3 様が提示されているようにグローバル変数として定義し、
何かの処理(ボタンを押す等)ごとに i を増やして Cell に書き込んでいく方法しか思い浮かびません。
    • good
    • 0
この回答へのお礼

salf様
再度の御回答ありがとうございます。
頭の中のイメージでは簡単にできそうなことなのですが、現実はそう簡単ではないのですね・・・。
現在、hana-hana3 様の御回答を参考に努力しております。
今後ともどうぞ宜しくお願い致します。

お礼日時:2006/07/10 17:36

>頭の中のイメージでは簡単にできそうなことなのですが


あなたがイメージしている操作手順がわからないので
具体的な方法が提示できません。
セルに代入する値が必要になるたびにユーザフォームを表示する方法なら.

[ユーザフォーム]
データ入力用のテキストボックスTextBox1がある。
入力完了を示す、コマンドボタンがる。
コマンドボタンを押すと、ユーザフォームをHideする。

[メイン側]
userform1.Show vbModal
' ユーザフォームがHideすると戻ってくる。
Cells(i, 2).Value =yserform1.textbox1.value
unload yserform1

という方式でどうでしょうか?
    • good
    • 0
この回答へのお礼

Hayashi_Trek様
御回答いただきありがとうございます。
説明不足で申し訳ございません。

商品の管理を行うために、商品が届いたらそれに独自のバーコードを付け、廃棄するまでの状況をエクセルに記録していきたいと考えています。
例えば同一の商品が3個届いた場合、商品名やその他の情報は同じなのですが、1個ずつ管理したいため、別々にバーコードを付けます。
そして、バーコードの番号を入力する専用のユーザーフォームを立ち上げ、バーコードリーダーで読み込んだデータを「登録」ボタンをクリックすることによりエクセルのシートに登録し、ユーザーフォームをクリアした後、同様のことをあと2回繰り返すと言うことをしたいと考えています。
現状では1回目のバーコードの番号はシートに記録できるのですが、2回目以降は記録できずに終了してしまいます。

Hayashi_Trek様の方法により試してみたのですが、ユーザーフォーム側とメイン側というものがよくわかりませんでした。どこにコードを書けばよろしいのでしょうか?

お礼日時:2006/07/10 23:14

皆さんこの問題で苦労したことがないらしいようにおもいます。


私は今もってよくわからない点がありますが、参考までに下記を載せます。
Userform1を挿入し、テキストボックスを1つ貼り付けます。
そして標準モジュールに下記を貼り付けます。
やってみてください。ただし下記に満足してるわけで有りません。
実際使うと色々不便なところがあります。おもちゃのような気がします。
諸賢の下記についてのあら捜しと改善法や別方法のご教示を私自身が求めてます。
入力はデータ+ENTERで入力するものとします。
データはActiveSheetのA1セルから下に順次セットしていきます。
Dim i

Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If KeyCode = 13 Then
i = i + 1
If IsNumeric(TextBox1) Then
Cells(i, "A") = Val(TextBox1)
Else
Cells(i, "A") = TextBox1
End If
TextBox1 = ""

End If
End Sub
    • good
    • 0
この回答へのお礼

imogasi様
御回答いただきましてありがとうございます。
同じような経験をなさった方がアドバイスしてくださり、心強く思っております。
さて、・・・すみません。最近エクセルのマクロを始めたばかりで、よくわかっておりません。
「標準モジュールに下記を貼り付ける」と言うのは、標準モジュールを新たにつくればいいのだと思うのですが、フォームとの関連付けみたいなものはどのようにすればよろしいのでしょうか?
初歩的な質問ですみません。宜しくご指導の程お願い致します。

お礼日時:2006/07/10 23:22

#5です。


すみません大事なところを勘違いして、間違えました。標準モジュールでなく、フォームモジュールでした。
フォームのデザインモードのテキストボックスをダブルクリックして出てくる画面で、テキストボックスのKeyDownイベントを指定し、その中に回答の中身を貼り付けてください。
    • good
    • 0
この回答へのお礼

imogasi様
再度の御回答ありがとうございます。
すみません・・・。頭の中がごちゃごちゃになりどうすればよいのかよく分かりません。
一度、imogasi様の方法でどう動くのか確認したいのですが、それができずにいます。

ユーザーフォーム1にテキストボックス1個と、登録ボタン1個を付け、登録件数を3回として、Sheet1に3件分のデータを貼り付けるということができるプログラムのコードを御教示していただけませんでしょうか?
ご多忙のところ誠に恐縮ではございますが、どうぞ宜しくお願い致します。

お礼日時:2006/07/11 08:44

>しかし、残念なことに複数回入力させることができません。



"登録件数" には、値が入っているのですか?
補足された文面からは、この値の取得場所が全く見えていませんけど?
別のテキストボックスですか?
それともシートのどこかですか?

この回答への補足

hana-hana3様
すみません。混乱させてしまいまして。
本来、登録件数には値は入っていません。

皆様からのアドバイスの元に色々試しているのですがどうもできないため、私の質問文自体に問題があるものと考え、問題を簡略化しようとしたのが#6様のお礼欄です。

簡略化して登録件数を例えば3件と指定し、どのように動くか、自分の考えているとおりの動きをするのかをまず確認したかったのです。

「登録件数=3」として、動作を確認した後に登録件数を変数に変えれば自分の思うとおりに動くかもしれないと考えました。
申し訳ございません。

補足日時:2006/07/11 11:01
    • good
    • 0

一部修正しました



Private Sub TextBox2_AfterUpdate()
Dim 登録件数 As Integer
登録件数 = 3

If i >= 登録件数 Then
MsgBox "Count Up"
Exit Sub
Else
i = i + 1
Cells(i, 2).Value = TextBox2.Value
TextBox2.Value = ""
End If
End Sub


実験的な物としてはとりあえず動作すると思いますが、このまま、実使用時に登録件数の値を変更するだけでは、思ったような動作しません。
    • good
    • 0
この回答へのお礼

hana-hana3様
お手数をおかけしまして申し訳ございません。
コマンドボタン(「登録」)の部分はどのようなコードにすればよろしいのでしょうか?

> このまま、実使用時に登録件数の値を変更するだけ
> では、思ったような動作しません。
・・・と言うことは、あまりユーザーフォームにこだわらずにinputboxを使った方がいいと言うことでしょうか。ちなみにinputboxではきちんと動作しました。
しかし、文字や画面が小さく読みづらいかなぁと思っています。
inputboxの文字(入力欄も含めて)は大きくしたりできるのでしょうか?色々調べているのですが、情報が出ていません。ご存じでしたら御教示の程お願い致します。
(また、質問が発展してしまい申し訳ございません。)

お礼日時:2006/07/11 12:46

>あまりユーザーフォームにこだわらずにinputboxを使った方がいいと言うことでしょうか。



そうではなくて・・・
For文を使った無理なプログラムではなくて、基本的な繰返し入力の方法を覚えて欲しかっただけです。

実際に稼働させるには、
繰返しの回数を「いつ」「どこから」取得して、入力を繰り返すのか?
データを記入する位置を「いつ」「どうやって」決めるのかなど・・・。
基本的な事が解決できていないので、「実験的な~」という事を書きました。

また、入力の誤りを減らすためには、コマンドボタンからの実行が確実かと思います。

現在の記入位置に連続して書き込むにしろ、新規に別の場所に書き込むにしろ、「行番号」と「回数」の比較しかしていないので、そのまま適用するにも無理はあるでしょう。

>文字や画面が小さく読みづらいかなぁと思っています。

文字サイズは、テキストボックスのFontプロパティで設定できます。

>コマンドボタン(「登録」)の部分はどのようなコードにすればよろしいのでしょうか?

先のものは、テキストボックスにデータを記入してエンターキーを下げると自動実行します。
入力の確認を行いながら入力するなら、先のイベント(コード)は削除して、コマンドボタンに同じ内容を記入して実行してみてください。


実装する場合には、入力の誤りを減らす(場合によってはデータチェックする)事と、作業の迅速化や使いやすさを考えてコーティングする必要があるので、作業をする立場にたった操作性を考える必要があります。
    • good
    • 0
この回答へのお礼

hana-hana3様
いつもありがとうございます。

> そうではなくて・・・
> For文を使った無理なプログラムではなくて、基本的な繰返し入力の方法を
> 覚えて欲しかっただけです。

そうだったんですか・・・。すみません。そこまでお考え下さっていたのですね。
そうとは知らず、「何でFor文でなくて、If文なのだろう?突然If文になるとプログラムがわからなくなっちゃう・・・」などと思い、本当にすみませんでした。

hana-hana3様のIf文を使った方法で1つ1つメッセージボックスを表示して試してみているのですが、登録件数が3件となっていても変数iをきちんとカウントしてくれず、3回以上(10回とか)入力しても終了してくれません。
また、データはB1のセルにどんどん上書きをしてしまいます。
その他、一回登録ボタンを押した後、次のデータを入力するためには、テキストボックス内をマウスでクリックしてからでないとデータを入力できません。(カーソルがどこかにいってしまいます。)
しつこくてすみませんが、宜しくご指導の程お願い致します。
(hana-hana3様に一生懸命ついていこうと思っております。宜しくお願い致します。)

お礼日時:2006/07/11 14:28

>データはB1のセルにどんどん上書きをしてしまいます。



DIM i as integer
の変数宣言をプロシージャ(sub ~ End Sub)の外に置いていますか?
内部にあると常に初期化されて、カウントアップ(+1)してくれません。

>「何でFor文でなくて、If文なのだろう?

IF文は比較するのに使います。
今回の場合、書き込み前に繰返し回数をiの値をIF文で比較し、iの値をカウントアップ(i=i+1)して、書き込みます。

for文でも同じ事ができますが、テキストボックスのデータ入力状態を待って繰返して実行させるには不適な方法です。

>一回登録ボタンを押した後、次のデータを入力するためには、テキストボックス内をマウスでクリックしてからでないとデータを入力できません。

これも実装時の些細な気遣いが必要な部分です。
フォーム上のコントロールは、実行時には自動的に次のコントロールにフォーカスが移動します。
TabIndex プロパティの番号順にフォーカスが移動して行くので、入力順によってはこの値(順番)も変更した方が良いでしょう。

Dim i As Integer

Private Sub CommandButton1_Click()
Dim 登録件数 As Integer
登録件数 = 10

If i >= 登録件数 Then
MsgBox "Count Up"
Exit Sub
Else
i = i + 1
Cells(i, 2).Value = TextBox2.Value
TextBox2.Value = ""
TextBox2.SetFocus
End If
End Sub

>TextBox2.SetFocus

で、コマンドボタンデータ転記後にフォーカスを任意のコントロールに戻せます。
    • good
    • 0
この回答へのお礼

hana-hana3様
ありがとうございます!! 私のやりたい通りのことがまさにできました!!

こんなに親切にご指導いただき本当にありがとうございました。

次は、今回の結果を私が組んでいるプログラムに組み直して動作するか確認してみます。たぶんうまくいきそうな感じがしています。

これからもどうぞ宜しくお願い致します。

お礼日時:2006/07/11 15:43

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

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


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