テクニック集”ユーザフォーム入門 - 住所入力フォームを作成する”の
1−8までの内容を前提とし、ここでは登録済みのデータを”前へ”、”次へ”ボタンで
レコード移動し、フォーム上に表示させる手法について検討します。
住所入力フォームの入力に使用しているテキストボックスコントロールは、
ControlSourceプロパティーを使用してワークシート上のセルにリンクさせることが
出来るため、”前へ”、”次へ”ボタンをクリックしたときに、このプロパティーを
動的に設定、変更することとします。
1.住所録フォームにコマンドボタン3つ(cmdNew, cmdPrevious, cmdNext)を追加します。
コマンドボタンのオブジェクト名を変更し、TabStopプロパティーをFalseに設定。
↓
2.フォームモジュールの宣言セクションに以下の一行(カレントレコード設定用カウンタ)
を追加します。
※宣言セクションはイベントプロシージャが記述される上の部分で、
モジュールレベル変数等を記述するセクションです。オブジェクトボックスより
”(General)”を選択してください。
Private CurNum As Long
↓
3.コマンドボタンのクリックイベントプロシージャと、ControlSource設定、解除用の
プロシージャを追加します。以下のサンプルをモジュールの最下部に貼り付けてください。
※ControlSourceプロパティー設定例
[ブック名]シート名!セル範囲のアドレス
ex) [MyBook.xls]!Sheet1!$A$1
(サンプル)
'=====================================================================
Private Sub cmdNew_Click()
'コントロールソースを解除し、新規入力が可能な状態とする
Call ReleaseCtrlSource
End Sub
'=====================================================================
Private Sub cmdNext_Click()
Dim LastRow As Integer
'住所録シートの最終行を取得
LastRow = Workbooks(BOOK_NAME).Sheets(1).Cells(65536, 1).End(xlUp).Row
'カレントレコードがない(CurNum=0)か、最終行以上である場合は
'メッセージボックスを表示し、ControlSouce解除する。
If CurNum = 0 Or CurNum >= LastRow Then
MsgBox "レコードがありません"
'ControlSource解除用のプロシージャ呼び出し
Call ReleaseCtrlSource
Exit Sub
Else
'対象行を設定(カレントレコードのカウントアップ)
CurNum = CurNum + 1
End If
'ControlSource設定用プロシージャ呼び出し
Call SetCtrlSource(CurNum)
End Sub
'=====================================================================
Private Sub cmdPrevious_Click()
'カレントレコードが0の場合には住所録の最終行をカレントレコードとする
If CurNum = 0 Then
CurNum = Workbooks(BOOK_NAME).Sheets(1).Cells(65536, 1).End(xlUp).Row
ElseIf CurNum <= 2 Then
'カレントレコードが2の場合には前のレコードは項目行となるため
'メッセージボックスを表示してからControlSource解除
MsgBox "レコードがありません"
Call ReleaseCtrlSource
Exit Sub
Else
'カレントレコード用カウンタをマイナス
CurNum = CurNum - 1
End If
'ControlSource設定用プロシージャ呼び出し
Call SetCtrlSource(CurNum)
End Sub
'=====================================================================
Private Sub SetCtrlSource(RowNum As Long)
Dim Ctrl As Control
Dim i As Integer
With Workbooks(BOOK_NAME).Sheets(1)
'各コントロールをループし、本プロシージャに渡された引数
'RoNumをカレントレコードとし、テキストボックスのControlSource
'を設定。
For Each Ctrl In Me.Controls
If Ctrl.Name Like "txt*" Then
i = i + 1
Ctrl.ControlSource = _
"[" & BOOK_NAME & "]" & .Name & "!" & .Cells(RowNum, i).Address
End If
Next
End With
End Sub
'=====================================================================
Private Sub ReleaseCtrlSource()
Dim Ctrl As Control
Dim i As Integer
'各コントロールをループ。テキストボックスはControlSourceを解除。
'表示されているデータをクリアします。
For Each Ctrl In Me.Controls
If Ctrl.Name Like "txt*" Then
Ctrl.ControlSource = ""
Ctrl.Value = ""
CurNum = 0
End If
Next
End Sub
'=====================================================================
|