過去ログ

                                Page     146
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
   通常モードに戻る  ┃  INDEX  ┃  ≪前へ  │  次へ≫   
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 ▼ある条件で、CommandButtonを.Enabled=Fal...  いぬだわん 02/9/25(水) 13:13
   ┗Re:ある条件で、CommandButtonを.Enabled=Fal...  Hirofumi 02/9/27(金) 21:40
      ┗Re:ある条件で、CommandButtonを.Enabled=Fal...  いぬだわん 02/9/28(土) 9:28
         ┗Re:ある条件で、CommandButtonを.Enabled=Fal...  Hirofumi 02/9/28(土) 23:35
            ┗Re:ある条件で、CommandButtonを.Enabled=Fal...  いぬだわん 02/9/30(月) 13:15

 ───────────────────────────────────────
 ■題名 : ある条件で、CommandButtonを.Enabled=Fal...
 ■名前 : いぬだわん
 ■日付 : 02/9/25(水) 13:13
 -------------------------------------------------------------------------
   こんにちは。
長い題名ですみません(思いつかなかったもので)。

また質問させていただきます。

以前このような質問をしました。

あるワークシートの行の奇数列に任意の文字データがあるとします。
ex)
   A     B   C    D   E     F   G   ・・・
1 たぬき (空白) ぞう (空白) こじか (空白) さる (空白)・・・

UserForm1があるとして、
UserForm1には、
任意の文字列(奇数列)をLabelプロパティに表示するLabel1から8、
任意の文字を偶数列に入れるためのTextBox1から8、
データが8個以上あった場合のために、9個目以上を表示するためのCommandButton(Next)、
9個以上あった場合、前の文字列データを表示するためのCommandButton(Back)
があるとします。

UserForm1には、
任意の文字列(奇数列)をLabelプロパティに表示するLabel1から8、
任意の文字を偶数列に入れるためのTextBox1から8、
データが8個以上あった場合のために、9個目以上を表示するためのCommandButton(Next)、
9個以上あった場合、前の文字列データを表示するためのCommandButton(Back)
があり、どちらのボタンを押してもTextBoxに入れた任意の文字を空白セルに書き込みできるようにはできました。
(コロスケさん、その節はありがとうございました。)

↓↓↓ここからが本題です↓↓↓

そこで、
データがたくさんあった場合、
何回CommandButton(Next)を押したら書き込む作業が終わるのかしりたいので、
UserForm1にLabel9とLabel10を追加して
Label9には総データ数を、
Label10には、何回押したら書き込む作業が終わるのかの数字を入れたいのです。
そして、最終の数字までCommandButton(Next)を押したら、
その先に行かないように、CommandButton(Next)を.Enabled=False
にしたいのです。

これだけの説明ではわかりにくいと思うので、
例をあげますと、

ex1)データが10個ある場合
CommandButton(Next)を1回押すと9番目、10番目のデータを表示。
さきにいかないようにCommandButton(Next)を.Enabled=Falseにする。

ex2)データが16個ある場合
CommandButton(Next)を1回押すと
LabelおよびTextBoxには16番目のデータを表示。
さきにいかないようにCommandButton(Next)を.Enabled=Falseにする。

いろいろやってみたのですが、
データ数がLabelおよびTextBoxに全部おさまる場合は、うまくいくのですが、
それ以外の場合はちょっとうまくいかないようです。
お知恵を拝借できればと思います。

(はじめの質問は、【238】にあります。)
 ───────────────────────────────────────  ■題名 : Re:ある条件で、CommandButtonを.Enabled=Fal...  ■名前 : Hirofumi <hirofumi@venus.dti.ne.jp>  ■日付 : 02/9/27(金) 21:40  -------------------------------------------------------------------------
   少し長くなりますが
UserFormのコード、全文を載せます
尚、UserFormにはOkボタンも有るとします
理由として、Back、NextでCellに書きこむ時、データ数が8個以内のだと
動きが取れなくなるのでOkボタンでCellに書き込みます
また、データは全て、配列を用意し、Okボタンが押されるまで
この配列に対して読み書きを行っています

Option Explicit

Private lngWriteRow As Long
Private lngPage As Long
Private lngPageMax As Long
Private lngDataEnd As Long
Private vntData As Variant
Private wksDataSheet As Worksheet
Private blnDirty As Boolean
Private Const DISP_MAX As Long = 8

Private Sub UserForm_Initialize()

  Dim lngColEnd As Long

  Set wksDataSheet = Worksheets("Sheet1")
  lngPage = 1
  lngWriteRow = 1
  
  With wksDataSheet
    lngDataEnd = .Cells(lngWriteRow, 256).End(xlToLeft).Column
  End With
  If lngDataEnd Mod 2 = 1 Then
    lngDataEnd = lngDataEnd + 1
  End If
  
  Label9.Caption = lngDataEnd \ 2
  
  lngPageMax = (lngDataEnd \ 2) \ DISP_MAX
  If (lngDataEnd \ 2) Mod DISP_MAX <> 0 Then
    lngPageMax = lngPageMax + 1
  End If

  With wksDataSheet
    vntData = .Range(.Cells(lngWriteRow, 1), _
            .Cells(lngWriteRow, lngDataEnd)).Value
  End With
  
  SetDatas
  SetNextBackButton
  
End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)

  PutDatas
  If blnDirty Then
    Beep
    If MsgBox("データが変更されていますセルに書き込みますか", _
          vbExclamation + vbOKCancel, "変更") = vbOK Then
      WriteCells
    End If
  End If
  
End Sub

Private Sub UserForm_Terminate()

  Set wksDataSheet = Nothing
  
End Sub

Private Sub cmdBack_Click()

  PutDatas
  lngPage = lngPage - 1
  SetNextBackButton
  SetDatas
    
End Sub

Private Sub cmdNext_Click()

  PutDatas
  lngPage = lngPage + 1
  SetNextBackButton
  SetDatas
  
End Sub

Private Sub cmdOk_Click()

  PutDatas
  If blnDirty Then
    WriteCells
  End If
  
End Sub

Private Sub SetDatas()

'  配列からコントロールへ読み込み

  Dim i As Long
  Dim lngCol As Long
  
  Label10.Caption = lngPage & " / " & lngPageMax
  
  For i = 1 To DISP_MAX
    lngCol = 2 * ((lngPage - 1) * DISP_MAX + i)
    If lngCol <= lngDataEnd Then
      Controls("Label" & i).Caption = vntData(1, lngCol - 1)
      With Controls("TextBox" & i)
        .Text = vntData(1, lngCol)
        .Enabled = True
      End With
    Else
      Controls("Label" & i).Caption = ""
      With Controls("TextBox" & i)
        .Text = ""
        .Enabled = False
      End With
    End If
  Next i
  
End Sub

Private Sub PutDatas()

'  コントロールから配列に読み込み

  Dim i As Long
  Dim vntTmp As Variant
  Dim lngCol As Long

  For i = 1 To DISP_MAX
    lngCol = 2 * ((lngPage - 1) * DISP_MAX + i)
    If lngCol <= lngDataEnd Then
      vntTmp = Controls("TextBox" & i).Text
      If vntData(1, lngCol) <> vntTmp Then
        vntData(1, lngCol) = vntTmp
        blnDirty = True
      End If
    End If
  Next i

End Sub

Private Sub WriteCells()

'  セルへデータの書き込み

  Dim i As Long
  
  With wksDataSheet
    For i = 2 To lngDataEnd Step 2
      .Cells(lngWriteRow, i) = vntData(1, i)
    Next i
  End With
  
  blnDirty = False

End Sub

Private Sub SetNextBackButton()
  
  If lngPageMax = lngPage Then
    cmdNext.Enabled = False
  Else
    cmdNext.Enabled = True
  End If
  If lngPage = 1 Then
    cmdBack.Enabled = False
  Else
    cmdBack.Enabled = True
  End If

End Sub
 ───────────────────────────────────────  ■題名 : Re:ある条件で、CommandButtonを.Enabled=Fal...  ■名前 : いぬだわん  ■日付 : 02/9/28(土) 9:28  -------------------------------------------------------------------------
   ▼Hirofumi さん:
おはようございます。
実際、まだ試していないんですけど、
これでやってみます。
まずは取り急ぎお礼まで。
時間を割かせてしまって本当にすみません。
ホントにありがとうございます。
 ───────────────────────────────────────  ■題名 : Re:ある条件で、CommandButtonを.Enabled=Fal...  ■名前 : Hirofumi <hirofumi@venus.dti.ne.jp>  ■日付 : 02/9/28(土) 23:35  -------------------------------------------------------------------------
   提示したコードに以下の部分を追加して下さい

Private Sub SetNextBackButton()
  
  If lngPageMax = lngPage Then
    cmdNext.Enabled = False
  Else
    cmdNext.Enabled = True
  End If
  If lngPage = 1 Then
    cmdBack.Enabled = False
  Else
    cmdBack.Enabled = True
  End If

  '追加するコード
  TextBox1.SetFocus
  
End Sub

此れが無くても動きますが
Back、Nextのボタンを押した場合、Forcusの関係かレスポンスが悪く成った様な形に成ります
 ───────────────────────────────────────  ■題名 : Re:ある条件で、CommandButtonを.Enabled=Fal...  ■名前 : いぬだわん  ■日付 : 02/9/30(月) 13:15  -------------------------------------------------------------------------
   ▼Hirofumi さん:
>提示したコードに以下の部分を追加して下さい

了解しました。
わざわざありがとうございます。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━    通常モードに戻る  ┃  INDEX  ┃  ≪前へ  │  次へ≫    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━                                 Page 146