Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


1567 / 13645 ツリー ←次へ | 前へ→

【73462】テキストボックスからセルへ For文 さんたぱぱ 13/1/13(日) 21:15 質問[未読]
【73463】Re:テキストボックスからセルへ For文 UO3 13/1/13(日) 22:24 発言[未読]
【73464】Re:テキストボックスからセルへ For文 さんたぱぱ 13/1/13(日) 23:00 発言[未読]
【73465】Re:テキストボックスからセルへ For文 カリーニン 13/1/13(日) 23:14 発言[未読]
【73467】Re:テキストボックスからセルへ For文 さんたぱぱ 13/1/14(月) 7:07 発言[未読]
【73469】Re:テキストボックスからセルへ For文 ichinose 13/1/14(月) 8:40 発言[未読]
【73480】Re:テキストボックスからセルへ For文 さんたぱぱ 13/1/14(月) 21:59 発言[未読]
【73486】Re:テキストボックスからセルへ For文 ichinose 13/1/15(火) 6:41 発言[未読]
【73470】Re:テキストボックスからセルへ For文 UO3 13/1/14(月) 10:00 発言[未読]
【73482】Re:テキストボックスからセルへ For文 さんたぱぱ 13/1/14(月) 22:17 発言[未読]
【73483】Re:テキストボックスからセルへ For文 さんたぱぱ 13/1/14(月) 22:20 回答[未読]
【73490】Re:テキストボックスからセルへ For文 UO3 13/1/15(火) 9:58 発言[未読]
【73494】Re:テキストボックスからセルへ For文 さんたぱぱ 13/1/15(火) 23:29 お礼[未読]

【73462】テキストボックスからセルへ For文
質問  さんたぱぱ  - 13/1/13(日) 21:15 -

引用なし
パスワード
   ユーザーフォームにテキストボックス0〜19があり、1〜19が入力欄、0は明細番号(連番)となっています。
1〜19に入力後、登録ボタンを押すとワークシートのセルのA列〜T列にそれぞれのテキストボックスの値が入力されるようにしたいのですが、うまくいきません。

A列にはテキストボックス1の値が正しく入力されるのですが、B列〜T列には何も入力されません。
解決策を教えていただけませんでしょうか。

Private Sub upBtn1_Click()

DB行 = txtBox0.Value + 1
For i = 1 To 19
Worksheets("売上データ").Cells(DB行, i + 1) = upForm("txtBox" & i).Text
Next i

End Sub

ワークシートの1行目は見出しとなっていますので、明細番号(テキストボックス0)+1を行番号としています。

よろしくお願いいたします。

【73463】Re:テキストボックスからセルへ For文
発言  UO3  - 13/1/13(日) 22:24 -

引用なし
パスワード
   ▼さんたぱぱ さん:


こんばんは

本当に、このコードでエラーなく、A列に転記されるのですか?
そうは思えないのですが・・・・
以下でお試しください。

Private Sub upBtn1_Click()
  Dim DB行 As Long
  Dim i As Long

  DB行 = TxtBox0.Value + 1

  For i = 1 To 19
    Worksheets("売上データ").Cells(DB行, i + 1) = Me.Controls("TxtBox" & i).Text
  Next i

End Sub

【73464】Re:テキストボックスからセルへ For文
発言  さんたぱぱ  - 13/1/13(日) 23:00 -

引用なし
パスワード
   ▼UO3 さん:

ご回答ありがとうございます。

誤りがありました。入力されるのはB列からT列で、正しく入力されるのもB列です。

記載していただいたコードをコピペしてやってみましたが、状況は変わりませんでした。

【73465】Re:テキストボックスからセルへ For文
発言  カリーニン  - 13/1/13(日) 23:14 -

引用なし
パスワード
   横から失礼します。

>"TxtBox"

"TextBox"
では?

【73467】Re:テキストボックスからセルへ For文
発言  さんたぱぱ  - 13/1/14(月) 7:07 -

引用なし
パスワード
   ▼カリーニン さん:

ありがとうございます。

テキストボックスのオブジェクト名をtxtBox0、txtBox1…としていますので大丈夫だと思います。

【73469】Re:テキストボックスからセルへ For文
発言  ichinose  - 13/1/14(月) 8:40 -

引用なし
パスワード
   おはようございます。

拝見した限り、特に間違いはみあたりませんが・・・。


>
>Private Sub upBtn1_Click()
>
> DB行 = txtBox0.Value + 1
 Debug.Print "セルに書き出す行番号 = " & DB行
> For i = 1 To 19
    Debug.Print "txtBox" & i & " = " & upForm("txtBox" & i).Text
    Worksheets("売上データ").Cells(DB行, i + 1).Value = upForm("txtBox" & i).Text
'                        ↑プロパティはつける癖を・・・
> Next i


> End Sub

上記の様にイミディエイトウインドーにテキストボックスの内容を表示させて
書き込む行番号やテキストボックスに入力した内容が正しく表示されているか確認してみて下さい。

【73470】Re:テキストボックスからセルへ For文
発言  UO3  - 13/1/14(月) 10:00 -

引用なし
パスワード
   ▼さんたぱぱ さん:


おはようございます
B列〜転記ということなら了解です。
そうしますと、ichinoseさんもいわれるように、コードを見る限り
転記されるはずですね。

ichinoseさんからアドバイスのあるイミディエイトウインドウを利用した変数の確認に加え
ステップ実行でコードの処理の流れを確かめられてはいかがでしょう。

・DB行 = txtBox0.Value + 1
 この行をマウスでクリックして F9 を押します。
 コードが茶色くなって左のバーに●がつきます。
・この状態で処理を実行して、ボタンをおしますと、このコードが黄色く光って
 ここで実行がとまります。
・この後、F8 をおしながら1行ずつ実行します。

どういう流れで実行されるのか(あるいは実行されないのか)確かめることができます。
必要なら、Worksheets("売上データ").Cells(DB行, i + 1) = upForm("txtBox" & i).Text
を実行するたびに エクセル側の売上シートを表示させてセルの状態も確認できます。

まお、ブレークポイントとして設定された ●、用が無くなれば、その行をクリックして
F9 をおしますと、解除されます。

それと、不具合と直接関係が有るわけではないですが、モジュールの先頭に
必ず Option Explicit 記述を行った上で、プロシジャで使う変数はすべて
明示的に宣言されるべきかと思います。

【73480】Re:テキストボックスからセルへ For文
発言  さんたぱぱ  - 13/1/14(月) 21:59 -

引用なし
パスワード
   ▼ichinose さん:

ありがとうございます。

イミディエイトウインドウというものを初めて知りました。
ネットで調べてみたのですが、使い方がよくわかりません。

> Debug.Print "セルに書き出す行番号 = " & DB行

この部分をイミディエイトウインドウに書いてエンターでよいのでしょうか?
やってみましたが、セルに書き出す行番号=と表示されただけでした。

>  Debug.Print "txtBox" & i & " = " & upForm("txtBox" & i).Text
の部分はオブジェクトが見つかりませんというようなエラーとなりました。

使い方が間違っておりますか?

【73482】Re:テキストボックスからセルへ For文
発言  さんたぱぱ  - 13/1/14(月) 22:17 -

引用なし
パスワード
   ▼UO3 さん:

ありがとうございます。

ステップ実行を試してみましたが、1行ずつ進んでいってもセルに変化はありませんでした。

U03、ichinoseさんとも間違いはなさそうとのことでしたので、他に原因があるのか考えてみたのですが、テキストボックスの入力は、予めワークシートに入力したデータをリストボックスに表示させ、それを選択して値を取得し、修正するようになっています。

そこに問題があるのでしょうか?


Private Sub ListBox1_Click()

  DB行 = ListBox1.Value + 1   'リストボックス内で選択された行数 + 1
  txtBox0.Text = Worksheets("売上データ").Cells(DB行, 1)
  txtBox1.Text = Worksheets("売上データ").Cells(DB行, 2)
  txtBox2.Text = Worksheets("売上データ").Cells(DB行, 3)
  txtBox3.Text = Worksheets("売上データ").Cells(DB行, 4)
  txtBox4.Text = Worksheets("売上データ").Cells(DB行, 5)
  txtBox5.Text = Worksheets("売上データ").Cells(DB行, 6)
  txtBox6.Text = Worksheets("売上データ").Cells(DB行, 7)
  txtBox7.Text = Worksheets("売上データ").Cells(DB行, 8)
  txtBox8.Text = Worksheets("売上データ").Cells(DB行, 9)
  txtBox9.Text = Worksheets("売上データ").Cells(DB行, 10)
  txtBox10.Text = Worksheets("売上データ").Cells(DB行, 11)
  txtBox11.Text = Worksheets("売上データ").Cells(DB行, 12)
  txtBox12.Text = Worksheets("売上データ").Cells(DB行, 13)
  txtBox13.Text = Worksheets("売上データ").Cells(DB行, 14)
  txtBox14.Text = Worksheets("売上データ").Cells(DB行, 15)
  txtBox15.Text = Worksheets("売上データ").Cells(DB行, 16)
  txtBox16.Text = Worksheets("売上データ").Cells(DB行, 17)
  txtBox17.Text = Worksheets("売上データ").Cells(DB行, 18)
  txtBox18.Text = Worksheets("売上データ").Cells(DB行, 19)
  txtBox19.Text = Worksheets("売上データ").Cells(DB行, 20)
  
End Sub

となっています。

リストボックの値はRowSourceに売上データ!a2:t100として取得しています。

引き続きご教授いただけますでしょうか。

>プロシジャで使う変数はすべて明示的に宣言されるべきかと思います。
ichinoseさんご指摘のプロパティ同様、習慣づけます。

【73483】Re:テキストボックスからセルへ For文
回答  さんたぱぱ  - 13/1/14(月) 22:20 -

引用なし
パスワード
   ▼UO3 さん:

ありがとうございます。

ステップ実行を試してみましたが、1行ずつ進んでいってもセルに変化はありませんでした。

U03、ichinoseさんとも間違いはなさそうとのことでしたので、他に原因があるのか考えてみたのですが、テキストボックスの入力は、予めワークシートに入力したデータをリストボックスに表示させ、それを選択して値を取得し、修正するようになっています。

そこに問題があるのでしょうか?


Private Sub ListBox1_Click()

  DB行 = ListBox1.Value + 1   'リストボックス内で選択された行数 + 1
  txtBox0.Text = Worksheets("売上データ").Cells(DB行, 1)
  txtBox1.Text = Worksheets("売上データ").Cells(DB行, 2)
  txtBox2.Text = Worksheets("売上データ").Cells(DB行, 3)
  txtBox3.Text = Worksheets("売上データ").Cells(DB行, 4)
  txtBox4.Text = Worksheets("売上データ").Cells(DB行, 5)
  txtBox5.Text = Worksheets("売上データ").Cells(DB行, 6)
  txtBox6.Text = Worksheets("売上データ").Cells(DB行, 7)
  txtBox7.Text = Worksheets("売上データ").Cells(DB行, 8)
  txtBox8.Text = Worksheets("売上データ").Cells(DB行, 9)
  txtBox9.Text = Worksheets("売上データ").Cells(DB行, 10)
  txtBox10.Text = Worksheets("売上データ").Cells(DB行, 11)
  txtBox11.Text = Worksheets("売上データ").Cells(DB行, 12)
  txtBox12.Text = Worksheets("売上データ").Cells(DB行, 13)
  txtBox13.Text = Worksheets("売上データ").Cells(DB行, 14)
  txtBox14.Text = Worksheets("売上データ").Cells(DB行, 15)
  txtBox15.Text = Worksheets("売上データ").Cells(DB行, 16)
  txtBox16.Text = Worksheets("売上データ").Cells(DB行, 17)
  txtBox17.Text = Worksheets("売上データ").Cells(DB行, 18)
  txtBox18.Text = Worksheets("売上データ").Cells(DB行, 19)
  txtBox19.Text = Worksheets("売上データ").Cells(DB行, 20)
  
End Sub

となっています。

リストボックの値はRowSourceに売上データ!a2:t100として取得しています。

引き続きご教授いただけますでしょうか。

>プロシジャで使う変数はすべて明示的に宣言されるべきかと思います。
ichinoseさんご指摘のプロパティ同様、習慣づけます。

同一内容の再投稿は禁止されています。
となったらどうすればよいのでしょうか…。

【73486】Re:テキストボックスからセルへ For文
発言  ichinose  - 13/1/15(火) 6:41 -

引用なし
パスワード
   おはようございます。


>イミディエイトウインドウというものを初めて知りました。
>ネットで調べてみたのですが、使い方がよくわかりません。
>
>> Debug.Print "セルに書き出す行番号 = " & DB行
>
>この部分をイミディエイトウインドウに書いてエンターでよいのでしょうか?
>やってみましたが、セルに書き出す行番号=と表示されただけでした。

Debug.Print〜

は、投稿したようにコードに追化するのですよ!!

これで今までの様にプログラムを実行して テキストボックスにデータを設定し、
upBtn1というコマンドボタンをクリックしてください。

プログラムが終了した後、イミディエイトウインドーの結果を
確認するのです。正しい値が入っているか否かをです。

【73490】Re:テキストボックスからセルへ For文
発言  UO3  - 13/1/15(火) 9:58 -

引用なし
パスワード
   ▼さんたぱぱ さん:

おはようございます

書込み行(txtBox0 の値)をなぜリストボックスから選ぶのか、
そして、そのリストボックスになぜ A〜T列の複数列を指定しているのか
それは、そちらの要件でしょうから、どうこうコメントしません。
(選んだ行が間違いないということを操作者がリストボックス上のほかの項目も目視しながら確認する
 ということだと想像していますが。ただ、A列に、おそらく、その行番号と同じ数字が入っているのでしょうけど
 これは、選ばれたもののListIndexをもとに把握したほうが確実だとは思います)

さて、いずれにしてもRowSource付のリストボックスに対して、ボタンクリックで、そのRowSource内のセル領域に
書き込みますよね。そうしますと、ステップ実行を行ったとき、

Worksheets("売上データ").Cells(DB行, i + 1) = upForm("txtBox" & i).Text

この実行の後、

Private Sub ListBox1_Click()
ここに飛び込みませんでしたか? 
(ステップ実行は、このあたりを明確につかむためにも有効です)


最初にB列に書き込んだ後、イベントの連鎖が発生しています。
で、まだ書き込まれていないC列以降の値を txtBox2以降にセットします。なので空白になります。
それがおわれば、またupBtn1_Clickに戻り次のテキストビック巣を処理します。
で、またもやイベント連鎖でListBox1_Clickに飛び込みます。
これが延々と19回、繰り返されます。

現象を回避するだけならたとえば以下の措置をしてください。
でも、リストボックスのClickイベントとコマンドボタンのClickイベントの役割分担というか
処理の構成については、再検討されたらよろしいのではと思いますが?

・Private Sub ListBox1_Click() の下に

 If Me.Tag = "Skip" Then Exit Sub を追加

・Private Sub upBtn1_Click() の下に

 Me.Tag = "Skip" を追加

 また、このプロシジャの End Sub の上に

 Me.Tag = Empty を追加。

【73494】Re:テキストボックスからセルへ For文
お礼  さんたぱぱ  - 13/1/15(火) 23:29 -

引用なし
パスワード
   ▼UO3 さん:

ありがとうございます。
できました!

教えていただいたとおりコードに追加したら希望通りのことができました。

>Private Sub ListBox1_Click()
>ここに飛び込みませんでしたか?

飛び込みました!

>リストボックスのClickイベントとコマンドボタンのClickイベントの役割分担というか>処理の構成については、再検討されたらよろしいのではと思いますが?

今の知識では難しいですが、少しずつできるようになりたいと思います。

UO3 さんをはじめご回答下さった皆さん本当に有難うございます。
すごい人達はいるものですね。

丁寧に教えていただき感動しました。

1567 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free