ページ制御 ②ユーザーフォーム

YouTube VBA

  この続きですので、こちらからご覧ください!

ユーザーフォームを作成する

<ユーザーフォーム>

フォーム名  :PCFrm

コマンドボタン
前ページ   :UpButton
次ページ   :DownButton
先頭ページ  :UpButton
最終ページ  :BottomButton
表示     :HyoujiButton
終了     :EndButton

テキストボックス
表示ページ  :HyoujiPage
ページ表示行数:PageGyousu

ラベル
全ページ数  :ZenPage

ユーザーフォームの作り方はこちらを見てね!

ユーザーフォームを呼び出す

PCfrm.Show vbModeless PCfrmをモーダレスで呼び出す
この命令をどこに書く?

ユーザーフォームの呼び出し方

  1. コマンドボタン
  2. ワークシートのイベント
  3. ワークブックのイベント 等


今回は3の方法で呼び出します

ページ制御ボタン・ページ指定で、
ThisWorkBookに、ブックが開いたとき実行されるプロシージャWorkbook_Openを作成しました
このプロシージャの先頭に PCfrm.Show を書きます
ブックが開くと、このフォームも表示されます

Sub Workbook_Open()
    
    PCfrm.Show vbModeless
    
    ページ表示行数 = 20                             '初期値は20に指定

      ~

テストしてみましょう Workbook_Open()を実行します
フォームが表示されましたか?

ボタンにプログラムを追加

フォームのボタンをダブルクリック

フォームのUpButtonをダブルクリック

Private Sub UpButton_Click()

End Sub

と表示されるので、

Private Sub UpButton_Click()
  Call 前のページ
End Sub

ページ制御①で作成したプロシージャを
呼び出します

Private Sub UpButton_Click()
  Call 前のページ
End Sub
Sub 前のページ()

    If 表示ページ <= 1 Then Exit Sub
    表示ページ = 表示ページ - 1
    
    最初データ番号 = (表示ページ - 1) * ページ表示行数 + 1
    最後データ番号 = 表示ページ * ページ表示行数
    
    Call Hyouji
    
End Sub

同様に他のボタンもプロシージャを作成します

Private Sub DownButton_Click()
  Call 次のページ
End Sub

Private Sub TopButton_Click()
  Call 先頭ページ
End Sub

Private Sub BottomButton_Click()
  Call 最終ページ
End Sub

テストしてみましょう!
各ボタンの動作を確認します

プロシージャをユーザーフォーム対応に変更しましょう

編集→置換 あるいは Ctrl+H置換ダイアログを表示します

対象は、カレントプロジェクトとしてプロジェクト全体で検索します

検索する文字列 : 一覧表.Range(“J11”)
置換後の文字列 : PCfrm.HyoujiPage.Value

検索する文字列 : 一覧表.Range(“K11”)
置換後の文字列 : PCfrm.ZenPage.Caption

検索する文字列 : 一覧表.Range(“J17”)
置換後の文字列 : PCfrm.PageGyousu.Value


フォームの変数に置換してください

置換は、オキカエと読むらしいです
動画で連呼していますが、”チカンします”は、まずかったですね(笑)

フォームの表示をダブルクリック

Private Sub HyoujiButton_Click()

End Sub

と表示されるので、

Private Sub HyoujiButton_Click()
  Call 一覧表表示
End Sub

ページ制御①で作成した一覧表表示
プロシージャを呼び出します

テストしましょう!
表示ページページ表示行数を変更して、表示ボタンを押します

表示ボタン押すのめんどくさいな~

表示ページ変更&ページ表示行数処理

HyoujiPageをダブルクリック

Private Sub HyoujiPage_Change()

End Sub

表示ページが変更されたときに
実行するプロシージャ

PageGyosuをダブルクリック

Private Sub PageGyosu_Change()

End Sub

ページ表示行数が変更されたときに
実行するプロシージャ

Sub 一覧表表示()
    
    'ページ表示行数が変更された場合
    If ページ表示行数 <> 一覧表.Range("J17") Then
        表示ページ = 1                                                  '表示ページは1にする
        ページ表示行数 = 一覧表.Range("J17")                'ページ表示行数を更新する
        全ページ数 = WorksheetFunction.RoundUp(最終行数 / ページ表示行数, 0)
    Else
        '表示ページが変更された場合
        If 表示ページ <> 一覧表.Range("J11") Then
            If 一覧表.Range("J11") > 全ページ数 Then Exit Sub   '全ページ数を超える時
            表示ページ = 一覧表.Range("J11")                            '表示ページを更新する
        End If
    End If
    
'    '配列を使う場合
'    ReDim Data(最終行数, 7)
'    Data = TestData.Range("a2", "g" & (最終行数 + 1))
    
    'どこからどこまで表示
    最初データ番号 = (表示ページ - 1) * ページ表示行数 + 1
    If 最終行数 > 表示ページ * ページ表示行数 Then
        最後データ番号 = 表示ページ * ページ表示行数
    Else
        最後データ番号 = 最終行数
    End If
    
    Call Hyouji
    
End Sub

この一覧表表示を分割します
このままコピーして、1つは表示ページが変更された時の処理
表示ページ変更プロシージャを作成します
もう1つは、ページ表示行数が変更された時の処理
ページ表示行数変更プロシージャを作成します

Sub 表示ページ変更()
   
        '表示ページが変更された場合
        If IsNumeric(PCfrm.HyoujiPage.Value) = False Then Exit Sub
        If PCfrm.HyoujiPage.Value < 1 Then
           PCfrm.HyoujiPage.Value = ""
           Beep
           Exit Sub
        End If
        If PCfrm.HyoujiPage.Value > 全ページ数 Then Exit Sub  '全ページ数を超える時
        表示ページ = PCfrm.HyoujiPage.Value                           '表示ページを更新する
     
'    '配列を使う場合
'    ReDim Data(最終行数, 7)
'    Data = TestData.Range("a2", "g" & (最終行数 + 1))
    
    'どこからどこまで表示
    最初データ番号 = (表示ページ - 1) * ページ表示行数 + 1
    If 最終行数 > 表示ページ * ページ表示行数 Then
        最後データ番号 = 表示ページ * ページ表示行数
    Else
        最後データ番号 = 最終行数
    End If
    
    Call Hyouji
    
End Sub
Sub ページ表示行数変更()
    
    'ページ表示行数が変更された場合
    If IsNumeric(PCfrm.PageGyosu.Value) = False Then Exit Sub
    If PCfrm.PageGyosu.Value < 1 Then
        PCfrm.PageGyosu.Value = ""
        Beep
        Exit Sub
    End If
    表示ページ = 1                                       '表示ページは1にする
    ページ表示行数 = PCfrm.PageGyosu.Value                'ページ表示行数を更新する
    全ページ数 = WorksheetFunction.RoundUp(最終行数 / ページ表示行数, 0)
   
'    '配列を使う場合
'    ReDim Data(最終行数, 7)
'    Data = TestData.Range("a2", "g" & (最終行数 + 1))
    
    'どこからどこまで表示
    最初データ番号 = (表示ページ - 1) * ページ表示行数 + 1
    If 最終行数 > 表示ページ * ページ表示行数 Then
        最後データ番号 = 表示ページ * ページ表示行数
    Else
        最後データ番号 = 最終行数
    End If
    
    Call Hyouji
    
End Sub

数値以外が入力されないように、IsNumeric関数を加えました
マイナスが入力された時は、NULLにしてExit Subします

作成したプロシージャを呼び出します

Private Sub HyoujiPage_Change()
  Call 表示ページ変更
End Sub



Private Sub PageGyosu_Change()
  Call ページ表示行数変更
End Sub

テストしてみましょう
表示ページやページ表示行数を変更します
表示ボタンを押さなくても更新されましたか?

不要なボタン・プロシージャの削除

表示ボタンはいらないので
フォームから表示ボタンをクリックして
DELETEキーを押します

Private Sub HyoujiButton_Click()
  Call 一覧表表示
End Sub

このプロシージャもいらないので削除します
(表示ボタンがクリックされた時
    実行するプロシージャなので)

これらのボタンも削除しましょう

シートの保護を解除して、
ホーム→検索と選択オブジェクトの選択
(カーソルが➡になる)

削除したいボタンをかこんで Delete

この状態でDeleteキー



もう一度、検索と選択オブジェクトの選択
(カーソルが✙に戻る)

範囲を選択して、

クリア→すべてクリア

もう一度シートの保護をしておきましょう!

終了ボタン処理

終了をダブルクリック

Private Sub EndButton_Click()
  Unload PCfrm
End Sub

ユーザーフォームを閉じるプロシージャです

フォームがなくなってしまうので、ユーザーフォームを表示するボタンも必要ですね

ユーザーフォーム表示というボタンを作成し、ThisWorkbook.Workbook_Openと紐づけます
ブックを開いた時と同じ状態になり、フォームも表示されます

プログラムコード

ThisWorkBook

Sub Workbook_Open()
    
    PCfrm.Show vbModeless
    
    ページ表示行数 = 20                             '初期値は20に指定
    PCfrm.PageGyosu.Value = ページ表示行数   'J17セルの値を更新
    表示ページ = 1
    最終行数 = TestData.Cells(Rows.Count, 1).End(xlUp).Row - 1
    全ページ数 = WorksheetFunction.RoundUp(最終行数 / ページ表示行数, 0)
    
    '配列を使う場合
    ReDim Data(最終行数, 7)
    Data = TestData.Range("a2", "g" & (最終行数 + 1))
        
    'どこからどこまで表示
    最初データ番号 = 1
    If 最終行数 > ページ表示行数 Then
        最後データ番号 = ページ表示行数
    Else
        最後データ番号 = 最終行数
    End If
    
    Call Hyouji
    
End Sub

Module1

Public 最終行数 As Long            'データの総行数
Public ページ表示行数 As Long      '1ページに表示する行数
Public 全ページ数 As Long          '表示するページの総数
Public 最初データ番号 As Long       '表示するページの最初のデータの位置
Public 最後データ番号 As Long       '表示するページの最後のデータの位置
Public 表示ページ As Long           '表示するページ
Public Data() As Variant           '顧客データを格納する配列
'PCfrm.HyoujiPage.Value            '表示する(している)ページ
'PCfrm.PageGyosu.Value             '1ページに表示する行数
'********************************************************

Sub 表示ページ変更()
   
    '表示ページが変更された場合
    If IsNumeric(PCfrm.HyoujiPage.Value) = False Then Exit Sub
    If PCfrm.HyoujiPage.Value < 1 Then
       PCfrm.HyoujiPage.Value = ""
       Beep
       Exit Sub
    End If
    If PCfrm.HyoujiPage.Value > 全ページ数 Then Exit Sub  '全ページ数を超える時
    表示ページ = PCfrm.HyoujiPage.Value                           '表示ページを更新する
     
'    '配列を使う場合
'    ReDim Data(最終行数, 7)
'    Data = TestData.Range("a2", "g" & (最終行数 + 1))
    
    'どこからどこまで表示
    最初データ番号 = (表示ページ - 1) * ページ表示行数 + 1
    If 最終行数 > 表示ページ * ページ表示行数 Then
        最後データ番号 = 表示ページ * ページ表示行数
    Else
        最後データ番号 = 最終行数
    End If
    
    Call Hyouji
    
End Sub

Sub ページ表示行数変更()
    
    'ページ表示行数が変更された場合
    If IsNumeric(PCfrm.PageGyosu.Value) = False Then Exit Sub
    If PCfrm.PageGyosu.Value < 1 Then
        PCfrm.PageGyosu.Value = ""
        Beep
        Exit Sub
    End If
    表示ページ = 1                                                       '表示ページは1にする
    ページ表示行数 = PCfrm.PageGyosu.Value                'ページ表示行数を更新する
    全ページ数 = WorksheetFunction.RoundUp(最終行数 / ページ表示行数, 0)
   
'    '配列を使う場合
'    ReDim Data(最終行数, 7)
'    Data = TestData.Range("a2", "g" & (最終行数 + 1))
    
    'どこからどこまで表示
    最初データ番号 = (表示ページ - 1) * ページ表示行数 + 1
    If 最終行数 > 表示ページ * ページ表示行数 Then
        最後データ番号 = 表示ページ * ページ表示行数
    Else
        最後データ番号 = 最終行数
    End If
    
    Call Hyouji
    
End Sub
Sub Hyouji()
 
    Dim i As Long, j As Long
    Dim Gyo As Long
    
    'シートの保護解除'
    一覧表.Unprotect
    
    '前のデータを削除
    一覧表.Range("b3").CurrentRegion.Offset(1, 0).Clear

    Gyo = 4
'    For i = 最初データ番号 To 最後データ番号
'        For j = 1 To 7
'            '一覧表.Cells(Gyo, j + 1) = TestData.Cells(i + 1, j)
'            一覧表.Cells(Gyo, j + 1) = Data(i, j)                      '配列を使う場合
'        Next j
'        Gyo = Gyo + 1
'    Next i
    
    For i = 最初データ番号 To 最後データ番号
        一覧表.Cells(Gyo, 2).Resize(1, 7) = WorksheetFunction.Index(Data, i)
        Gyo = Gyo + 1
    Next i
    
    'TestDataの書式(罫線・センタリング・表示形式など)を一気に貼り付ける
    TestData.Range("A2:G2").Copy
    一覧表.Range("b4:h" & 最後データ番号 - 最初データ番号 + 4).PasteSpecial _
    Paste:=xlPasteFormats
    
    '罫線を引く
'    With 一覧表.Range("b3").CurrentRegion.Borders
'        .LineStyle = xlContains
'        .ColorIndex = 1
'    End With
    
    PCfrm.HyoujiPage.Value = 表示ページ
    PCfrm.ZenPage.Caption = "/" & 全ページ数
    
    
    'シートの保護
     一覧表.Protect
     
End Sub
Sub 前のページ()

    If 表示ページ <= 1 Then Exit Sub
    表示ページ = 表示ページ - 1
    
    最初データ番号 = (表示ページ - 1) * ページ表示行数 + 1
    最後データ番号 = 表示ページ * ページ表示行数
    
    Call Hyouji
    
End Sub

Sub 次のページ()

    If 表示ページ >= 全ページ数 Then Exit Sub
    表示ページ = 表示ページ + 1
    
    最初データ番号 = (表示ページ - 1) * ページ表示行数 + 1
    If 最終行数 > 表示ページ * ページ表示行数 Then
        最後データ番号 = 表示ページ * ページ表示行数
    Else
        最後データ番号 = 最終行数
    End If
    
    Call Hyouji
    
End Sub

Sub 先頭ページ()
     
    If 表示ページ <= 1 Then Exit Sub
    表示ページ = 1
    
    最初データ番号 = 1
    If ページ表示行数 < 最終行数 Then
        最後データ番号 = ページ表示行数
    Else
        最後データ番号 = 最終行数
    End If
    
    Call Hyouji
    
End Sub

Sub 最終ページ()

    If 表示ページ >= 全ページ数 Then Exit Sub
    表示ページ = 全ページ数
    
    最初データ番号 = (表示ページ - 1) * ページ表示行数 + 1
    If 最終行数 > 表示ページ * ページ表示行数 Then
        最後データ番号 = 表示ページ * ページ表示行数
    Else
        最後データ番号 = 最終行数
    End If
    
    Call Hyouji
    
End Sub

PCFrm

Private Sub BottomButton_Click()
    Call 最終ページ
End Sub

Private Sub DownButton_Click()
    Call 次のページ
End Sub

Private Sub EndButton_Click()
    Unload PCfrm
End Sub

Private Sub HyoujiPage_Change()
    Call 表示ページ変更
End Sub

Private Sub PageGyosu_Change()
    Call ページ表示行数変更
End Sub

Private Sub TopButton_Click()
    Call 先頭ページ
End Sub

Private Sub UpButton_Click()
    Call 前のページ
End Sub

コメント