過去ログ

                                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
 ───────────────────────────────────────  ■題名 : Re:ワークシートにあるデータをUserFormを...  ■名前 : コロスケ <corosuke@chan.co.jp>  ■日付 : 02/9/6(金) 10:17  -------------------------------------------------------------------------
   ▼いぬだわん さん:

こんにちは。テキストの書き出しは、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
'--------------------------------------------------------------------------
 ───────────────────────────────────────  ■題名 : Re:ワークシートにあるデータをUserFormを...  ■名前 : いぬだわん  ■日付 : 02/9/6(金) 20:00  -------------------------------------------------------------------------
   ▼コロスケ さん:

こんばんは。
おかげさまで解決しました。
「8」が「16」っていうのは私自身も気付いたのですが、
あんなにスマートにprogができるとは目からウロコでした。
ありがとうございました。
 ───────────────────────────────────────  ■題名 : Re:ワークシートにあるデータをUserFormを...  ■名前 : いぬだわん  ■日付 : 02/9/19(木) 22:22  -------------------------------------------------------------------------
   こんばんは。
コロスケさんに教えていただいたコードで作ってみたら上手くいったので、
ちょっと改造したところ、上手くいかないところがあるので、
教えていただけたらと思います。

改造する前は、その場その場でデータ数を数えていき、
空白のセルに書き換えを行うものでした。
改造したものは、progを実行したときに、
書き換えるデータの個数を数えていき、
データ数<8
であればNextボタンおよびBackボタンの操作ができないように
改造しました。
また、
データ数>8
の場合でも、仮にデータ数が12個であったとしたら、
Nextボタンの操作ができないように改造しました。
しかし、
データ数が8で割り切れる場合、
つまり、データ数が8n(nは任意)の場合、
どうしてもNextボタンを押すと、次にいってしまいます。
この場合、どうしたらよいでしょうか。
わかれば教えていただきたいと思います。
 ───────────────────────────────────────  ■題名 : Re:ワークシートにあるデータをUserFormを...  ■名前 : いぬだわん  ■日付 : 02/9/22(日) 0:35  -------------------------------------------------------------------------
   上記の件、自力で解決しました。
すみません。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━    通常モードに戻る  ┃  INDEX  ┃  ≪前へ  │  次へ≫    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━                                 Page 107