[[20110811094331]] 『VBA コードの書き方』(初心者) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『VBA コードの書き方』(初心者)
 ユーザーフォーム上にたくさんのテキストボックスが配置されており,シートのデータを読み込ませます。
テキストボックスごとにコードを記述するのが面倒なので,同じ処理を繰り返しさせようとしますが,うまく読み込みません。どうしたらよいでしょうか。
 
シート セル(C4)から横にデータが記述。以下,次行へ個別データが同じように入力されています。
 
テキストボックス1〜10に4行目のデータを読み込み,テキストボックス11〜20に5行目のデータを読み込む。
以下,同じように100人分のデータをユーザーフォーム上に一括で読み込みたいのですが,簡単にコード記述する方法を教えてください。
 
自分でやってみた記述
――――――――――――――――――――
Private Sub UserForm_initialize()
    Call 読み込み(4)
End Sub
――――――――――――――――――――
Sub 読み込み(行 As Long)
    Cells(行, 1).Select

    For i = 3 To 12
    Me.Controls("tbx" & i).Value = Cells(行, i).Value
    Next i

    行 = 行 + 1

    For i = 13 To 22
        For j = 3 To 12
            Me.Controls("tbx" & i).Value = Cells(行, j).Value
        Next j
    Next i
―――――――――――――――――――――
上記の記述では,一人目は正しく読み込むのですが,2人以降は,セルの列がうまく動かず,
(○,3)セルの値が,すべてのテキストボックスに入力されてしまいます。


 こんな感じで出来ますか?
 でも、いったい何個のテキストボックスがあるんでしょう?
 早いうちに仕様を考え直さないと、後で重くて動かないなんて事にも・・・

  Sub 読み込み(行 As Long)
  Dim r As Range
  Dim i As Long
  For Each r In Range("C4:L103")
    i = i + 1
    Me.Controls("tbx" & i).Value = r.Value
  Next r
  End Sub

 (momo)

 衝突。。。
 
 この部分↓を良くみてください。
 
    For i = 13 To 22
        For j = 3 To 12
            Me.Controls("tbx" & i).Value = Cells(行, j).Value
        Next j
    Next i
 
tbx23〜tbx102?にはまったくアクセスしていませんね?
また、行も変化していないので、ず〜っと4行目を読み込んでいますよ。
 
テキストボックスを100個も配置していると、何かと不便そうです。
リストボックスなどに変更してはいかがでしょうか?
(ROUGE)

―――――――――――――――――――――――――――――――――

すばやいご教授,ありがとうございます。

テキストボックスは,フォーム上に1500個ぐらい並べてあります。

とりあえず,(momo)さんのフォームを参考にして,やってみました。
お試しとして,C4:G5 を範囲とし,テキストボックスを1人5個

Sub 読み込み(行 As Long)

  Dim r As Range
  Dim i As Long
  For Each r In Range("C4:g5")
    i = i + 1
    Me.Controls("tbx" & i).Value = r.Value
  Next r
  End Sub

以下のように書き直し,読み込ませました。すると「実行時エラー 指定されたオブジェクトは見つかりません」となります。うーーん,よくわかりません。
このエラーメッセージは,作業していると,よく表れるのですが,どうしたら解決できるのでしょうか。初歩的な質問ですみません。


 エラーになる時のiの値はいくつですか?
 そのiの値のtbx?というコントロールはありますか?
 試す場合は既定のTextBoxという名前のままでやってみた方が良さそうです。

 >テキストボックスは,フォーム上に1500個ぐらい並べてあります。
 通常、考えられない量ですね。
 思わぬエラーが頻発しそうです。
 というより、画面に表示しきれていますか?

 現状の考え方のままでは無理があると思うので
 実際にやりたい事を書いてみて、他の提案を受けたほうが良いと思いますが如何でしょう?
 ROUGEさんの仰るリストボックスも一案ですね。
 (momo)

momoさん ありがとうございました。
最終的に次のように記述したら,思うように動きました。

―――――――――――――――――――――――――――――――

Sub 読み込み(行 As Long)

  Dim r As Range
  Dim i As Long

  Cells(行, 1).Select
  i = 0
  For Each r In Range("C4:AB13")
    i = i + 1

    Me.Controls("textbox" & i).Value = r.Value

  Next r

  Cells(行, 1).Select
  i = 0

  For Each q In Range("b4:b13")
   i = i + 1

   Me.Controls("label" & i).Caption = q.Value
  Next q

End Sub

10人分のデータを各テキストボックスに収納,ラベルにも名前データを表示。
これを1つのまとまりとしてユーザーフォーム上にマルチページを配置し,50人分のデータを処理できるように作りたいと思います。
ありがとうございました。[初心者より]


(ROUGE)さんへ
ありがとうございます。
質問ですが,リストボックスにする利点は何ですか。
リストボックスだと,フォーム上でデータの書き換えはできますか。(フォーム上で選択したデータが,そのままエクセルシート上に書き換えられるという意味です)
[初心者より]


 > Cells(行, 1).Select
 この行はまったく要らないですね。

 やりたい事がフォーム上での書き換えだけだとしたら
 そんなにたくさんのテキストボックスを用意する必要は無いんじゃないかな?と思います。

 50人分を一度に書き換えるなんて事は出来ないわけですから
 選択して必要な項目だけテキストボックスを使えば良いのでは?

 たとえば、リストボックスで変更したい人の名前を選ぶと
 選んだ人のデータがテキストボックス(1人分の項目数分だけあれば良い)に表示され
 そこを書き換えてコマンドボタンを押せばシートに反映される。

 というような仕様にするのが一般的だと思います。
 (momo)

 そういうことなら、ユーザフォームを作成するまでもなく、データ→フォーム で良さそうですね。
 (ROUGE)

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.