Home > 即効テクニック > Excel VBA > ユーザーフォーム関連のテクニック > ユーザフォーム入門 - 住所入力フォームを作成する(9) 〜 レコードの移動

即効テクニック

ユーザーフォーム関連のテクニック

ユーザフォーム入門 - 住所入力フォームを作成する(9) 〜 レコードの移動

(Excel 2000)
テクニック集”ユーザフォーム入門 - 住所入力フォームを作成する”の1−8までの内容を前提とし、ここでは登録済みのデータを”前へ”、”次へ”ボタンでレコード移動し、フォーム上に表示させる手法について検討します。
住所入力フォームの入力に使用しているテキストボックスコントロールは、ControlSourceプロパティーを使用してワークシート上のセルにリンクさせることが出来るため、”前へ”、”次へ”ボタンをクリックしたときに、このプロパティーを動的に設定、変更することとします。
  1. 住所録フォームにコマンドボタン3つ(cmdNew, cmdPrevious, cmdNext)を追加します。 コマンドボタンのオブジェクト名を変更し、TabStopプロパティーをFalseに設定。
  2.         ↓
  3. フォームモジュールの宣言セクションに以下の一行(カレントレコード設定用カウンタ) を追加します。 ※宣言セクションはイベントプロシージャが記述される上の部分で、モジュールレベル変数等を記述するセクションです。オブジェクトボックスより”(General)”を選択してください。
Private CurNum As Long
       ↓
  • コマンドボタンのクリックイベントプロシージャと、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 "レコードがありません"
        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
    '=====================================================================