Page 107 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 通常モードに戻る ┃ INDEX ┃ ≪前へ │ 次へ≫ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ▼ワークシートにあるデータをUserFormをを使って書き換えるには? いぬだわん 02/9/5(木) 22:57 ┗Re:ワークシートにあるデータをUserFormを... コロスケ 02/9/6(金) 10:17 ┣Re:ワークシートにあるデータをUserFormを... いぬだわん 02/9/6(金) 20:00 ┗Re:ワークシートにあるデータをUserFormを... いぬだわん 02/9/19(木) 22:22 ┗Re:ワークシートにあるデータをUserFormを... いぬだわん 02/9/22(日) 0:35 ─────────────────────────────────────── ■題名 : ワークシートにあるデータをUserFormをを使って書き換えるには? ■名前 : いぬだわん ■日付 : 02/9/5(木) 22:57 -------------------------------------------------------------------------
こんばんは。 質問です。 あるワークシートの行の奇数列に任意の文字データがあるとします。 ex) A B C D E F G ・・・ 1 たぬき (空白) ぞう (空白) こじか (空白) さる (空白)・・・ UserForm1を使って、これらの任意の文字列をLavelプロパティに表示し、 TextBoxプロパティに入れた任意の文字をCommandButtonを押したら隣の空白の偶数列に入れるようにするものを考えています。 奇数列にある任意の文字行の個数は、その時々によって違うので、このプログラムを立ち上げたときに数えなくてはなりません。 UserForm1には、 任意の文字列(奇数列)をLavelプロパティに表示するLavel1?8、 任意の文字を偶数列に入れるためのTextBox1?8、 データが8個以上あった場合のために、9個目以上を表示するためのCommandButton(Next)、 9個以上あった場合、前の文字列データを表示するためのCommandButton(Back) があり、どちらのボタンを押してもTextBoxに入れた任意の文字を空白セルに書き込みできるようにしたいのです。 私自身、ヘタクソながらも下記のプログラムを考えて実行したところ、文字行の個数<=8まではうまくできますが、文字行の個数>8になるとCommandButton(Next)、およびCommandButton(Back)、ボタンを押すと、正しく表示および書き込みができないようです。どうしたうまくできるのでしょうか?お知恵を拝借できたらと思います。 === '変数宣言 Dim i As Integer Dim intTargetRec As Integer '現在の対象 Dim intMaxRec As Integer '登録の件数 Dim intDataCh As Integer '文字行の個数 Private Sub cmdBack_Click() 'Back '先頭行の時は何もしない If intTargetRec = 1 Then Exit Sub End If '前のデータをUserForm1に表示 intTargetRec = intTargetRec - 8 GetData 'カーソルをテキストボックスにあわせる TextBox1.SetFocus End Sub Private Sub cmdNext_Click() 'Next 'データ配列に格納する SetData '文字行の個数までいったら何もしない If intTargetRec = intDataCh Then Exit Sub End If Select Case intTargetRec '登録件数に達したら白紙画面を表示する Case Is = intMaxRec NewData intTargetRec = intTargetRec + 8 '次の配列のデータをコントロールに表示する Case Is < intMaxRec intTargetRec = intTargetRec + 8 GetData End Select 'カーソルをテキストボックスにあわせる TextBox1.SetFocus End Sub Private Sub cmdOk_Click() 'データ配列に格納する SetData If intTargetRec > intMaxRec Then intMaxRec = intMaxRec + 8 End If End Sub Private Sub UserForm_Initialize() '白紙の状態にする NewData '変数の初期設定 intTargetRec = 1 intMaxRec = 0 'はじめのデータを表示する。 GetData '総ch数 intDataCh = WorksheetFunction.CountA(ActiveSheet.Range("1:1")) End Sub Sub SetData() For i = 1 To 8 Cells(1, i + 1) = UserForm2.Controls("TextBox" & i).Text Next i End Sub Sub NewData() For i = 1 To 8 With UserForm1 .Controls("TextBox" & i).Text = "" End With Next i End Sub Sub GetData() For i = 1 To 8 With UserForm1 .Controls("Label" & i).Caption = Cells(1, 2*1-1) End With Next i End Sub |
▼いぬだわん さん: こんにちは。テキストの書き出しは、cmdNextか、cmdBackを押したときでよろしいんですよね? ちと、サンプルを書いてみましたので試してみてください。コードは全てUserForm1に書いてください。 ではー♪ '-------------------------------------------------------------------------- Option Explicit Dim i As Integer 'カウンタ用変数 '-------------------------------------------------------------------------- Private Sub UserForm_Initialize() Label1.Tag = 0 'Tag Propertyに初期値(列)をセット 変数の代わり Call GetData End Sub '-------------------------------------------------------------------------- Private Sub GetData() With Label1 For i = 1 To 8 Controls("Label" & i).Caption = Cells(1, 2 * i - 1 + Val(.Tag)).Value Controls("TextBox" & i).Text = Cells(1, 2 * i + Val(.Tag)).Value Next Select Case Val(.Tag) 'コマンドボタン処理 Case 0: cmdBack.Enabled = False Case 240: cmdNext.Enabled = False Case Else: cmdNext.Enabled = True: cmdBack.Enabled = True End Select End With TextBox1.SetFocus End Sub '-------------------------------------------------------------------------- Private Sub SetData() For i = 1 To 8 Cells(1, 2 * i + Val(Label1.Tag)).Value = Controls("TextBox" & i).Text Next End Sub '-------------------------------------------------------------------------- Private Sub cmdNext_Click() '進むボタンを押した場合 Call SetData 'データ書き込み With Label1 .Tag = Val(.Tag) + 16 If .Tag > 240 Then .Tag = 240 End With Call GetData 'データ読込み End Sub '-------------------------------------------------------------------------- Private Sub cmdBack_Click() '戻るボタンを押した場合 Call SetData 'データ書き込み With Label1 .Tag = Val(.Tag) - 16 If .Tag < 0 Then .Tag = 0 End With Call GetData 'データ読込み End Sub '-------------------------------------------------------------------------- |
▼コロスケ さん: こんばんは。 おかげさまで解決しました。 「8」が「16」っていうのは私自身も気付いたのですが、 あんなにスマートにprogができるとは目からウロコでした。 ありがとうございました。 |
こんばんは。 コロスケさんに教えていただいたコードで作ってみたら上手くいったので、 ちょっと改造したところ、上手くいかないところがあるので、 教えていただけたらと思います。 改造する前は、その場その場でデータ数を数えていき、 空白のセルに書き換えを行うものでした。 改造したものは、progを実行したときに、 書き換えるデータの個数を数えていき、 データ数<8 であればNextボタンおよびBackボタンの操作ができないように 改造しました。 また、 データ数>8 の場合でも、仮にデータ数が12個であったとしたら、 Nextボタンの操作ができないように改造しました。 しかし、 データ数が8で割り切れる場合、 つまり、データ数が8n(nは任意)の場合、 どうしてもNextボタンを押すと、次にいってしまいます。 この場合、どうしたらよいでしょうか。 わかれば教えていただきたいと思います。 |
上記の件、自力で解決しました。 すみません。 |