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】にあります。) |
少し長くなりますが 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 |
▼Hirofumi さん: おはようございます。 実際、まだ試していないんですけど、 これでやってみます。 まずは取り急ぎお礼まで。 時間を割かせてしまって本当にすみません。 ホントにありがとうございます。 |
提示したコードに以下の部分を追加して下さい 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の関係かレスポンスが悪く成った様な形に成ります |
▼Hirofumi さん: >提示したコードに以下の部分を追加して下さい 了解しました。 わざわざありがとうございます。 |