この続きですので、こちらからご覧ください!
ユーザーフォームを作成する
<ユーザーフォーム>
フォーム名 :PCFrm
コマンドボタン
前ページ :UpButton
次ページ :DownButton
先頭ページ :UpButton
最終ページ :BottomButton
表示 :HyoujiButton
終了 :EndButton
テキストボックス
表示ページ :HyoujiPage
ページ表示行数:PageGyousu
ラベル
全ページ数 :ZenPage
ユーザーフォームの作り方はこちらを見てね!
ユーザーフォームを呼び出す
PCfrm.Show vbModeless PCfrmをモーダレスで呼び出す
この命令をどこに書く?
ユーザーフォームの呼び出し方
- コマンドボタン
- ワークシートのイベント
- ワークブックのイベント 等
今回は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
コメント