ktCellMovePad

モーダルフォーム上でアクティブセルを移動させるマウスパッド機能を
提供するサブルーチンです。


【 構 文 】

Call ktCellMovePad ( Action, Now_X, Now_Y, Now_Shift,
Before_X, Before_Y, MousePad, ActRng,
[Book名], [Sheet名] )

Action ‥‥‥ Boolean 型
Now_X ‥‥‥ Single 型
Now_Y ‥‥‥ Single 型
Now_Shift ‥‥‥ Integer 型
Before_X ‥‥‥ Single 型  (ByRef
Before_Y ‥‥‥ Single 型  (ByRef )
MousePad ‥‥‥ MSForms.Label 型  (ByRef
ActRng ‥‥‥ Range 型  (ByRef
Book名 ‥‥‥ String 型    (省略可、省略時="" )
Sheet名 ‥‥‥ String 型    (省略可、省略時="" )

【 パラメータ 内容 】

Action ‥‥‥ UserForm_Initialize および UserForm_MouseMove では[False ]
MousePad に指定するラベルの MouseMove では[True ]
 
Now_X
  / Now_Y
‥‥‥ UserForm_Initialize および UserForm_MouseMove では[ 0 ]
MousePad に指定するラベルの MouseMove では、
    MouseMoveイベントで得られる[ X ][ Y ]を指定
 
Now_Shift ‥‥‥ UserForm_Initialize および UserForm_MouseMove では[ 0 ]
MousePad に指定するラベルの MouseMove では
    MouseMoveイベントで得られる[ Shift ]を指定
 
Before_X
  / Before_Y
‥‥‥ モジュール宣言セクションにて[Private ]で定義したSingle 型変数を指定

 
MousePad ‥‥‥ マウスパッド用に用意した「ラベル」を指定
このラベルは背景色[白]で用意して下さい。幅/高さは任意です。
 
ActRng ‥‥‥ Range 型変数を指定
Action=False の場合、常に[Nothing ]が返ります。

Action=True で Book名/Sheet名を指定しない場合
          ActiveCell のRange オブジェクトが返ります。

Action=True で Book名/Sheet名を指定した場合
    Book名/Sheet名が存在すれば、
          そのシートがアクティブになって、ActiveCell のRange オブジェクト
          が返ります。
    Book名/Sheet名が存在しなければ、
          [Nothing ]が返ります。

マウスパッドを複数用意して複数のセル位置を指定する場合は、モジュール宣言セクションにて[Private ]で定義したRange 型変数を用意し、この[ActRng]の内容を保存していくようにします(例:暦シートの作成)。
 
Book名
 / Sheet名
‥‥‥   フォームにBook/Sheet の選択機能も持たせる場合に、そのBook名/Sheet名を指定します。
  マウスパッド用ラベルに入った瞬間(Action=Trueで Call 中)に、Book名/Sheet名の存在チェックが行なわれます。
  存在しない場合、[ActRng = Nothing ]を返し、マウスパッド用ラベルの背景を薄赤にします。存在すれば、[ActRng ]にActiveCell を返し、背景は白または薄黄(Shift 押下中)になります。

  Book/Sheet の切り換えが無く、現在のActiveSheetのみを対象とする場合は省略します。

  [Action = False ]の場合は省略して構いません。
 
実際には、使用例そのままにコピーして利用して下さい。
 

【 解 説 】

  モードレスフォームではフォーム表示中に自由にセルを選択してアクティブセルを変えられますが、
モーダルフォーム表示中にはシートに触れません。このサブルーチンは、UserForm上にラベルを用
意し、
      そのラベル内で[Shift ]を押しながらマウスを動かした時に、
      マウスの動いたのと同じ方向へアクティブセルを移動
させる機能を提供します。
 

【 使用例 】

現在のアクティブシートのみ対象とする例             : 祝日一覧作成 , カレンダーマーク描画
ブック/シートの選択機能を持たせる例                 : 休日マップ作成
複数のセル位置取得(ブック/シート選択付き)の例: 暦シートの作成

UserFormにラベル「 lblMousePad 」を用意し、UserFormモジュールに下記コードを
そのまま貼り付けて下さい。




'----------- ひとつのセル指定(Book/Sheet 切り換えが無い場合) ---------------
Private Before_X As Single
Private Before_Y As Single
Private rngActCell As Range

Private Sub UserForm_Initialize()
Dim rngDummy As Range
    '初期化
    Call ktCellMovePad(False, 0, 0, 0, Before_X, Before_Y, lblMousePad, rngDummy )
    Set rngActCell = ActiveCell
End Sub

Private Sub UserForm_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, _
                               ByVal X As Single, ByVal Y As Single)
Dim rngDummy As Range
    'マウスパッド用ラベルから外に出たのでリセットする
    Call ktCellMovePad(False, 0, 0, 0, Before_X, Before_Y, lblMousePad, rngDummy )
End Sub

Private Sub lblMousePad_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, _
                                  ByVal X As Single, ByVal Y As Single)
    Call ktCellMovePad(True, X, Y, Shift, Before_X, Before_Y, lblMousePad, rngActCell )
End Sub



'----------- ひとつのセル指定(Book/Sheet 切り換えが有る場合) ---------------
' txtBook/txtSheet に選択したブック名/シート名が入っているとする
' Active なセルアドレスを txtCell に表示

Private Before_X As Single
Private Before_Y As Single
Private rngActCell As Range

Private Sub UserForm_Initialize()
Dim rngDummy As Range
    '初期化
    Call ktCellMovePad(False, 0, 0, 0, Before_X, Before_Y, lblMousePad, rngDummy )
    Set rngActCell = Nothing
End Sub

Private Sub UserForm_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, _
                               ByVal X As Single, ByVal Y As Single)
Dim rngDummy As Range
    'マウスパッド用ラベルから外に出たのでリセットする
    Call ktCellMovePad(False, 0, 0, 0, Before_X, Before_Y, lblMousePad, rngDummy )
End Sub

Private Sub lblMousePad_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, _
                                  ByVal X As Single, ByVal Y As Single)
    Call ktCellMovePad(True, X, Y, Shift, Before_X, Before_Y, lblMousePad, _
                       rngActCell, txtBook.Value, txtSheet.Value )
    If (rngActCell Is Nothing ) Then
        txtCell.Value = ""
    Else
        If (Application.ReferenceStyle = xlA1) Then
            txtCell.Value = rngActCell.Address(False, False, xlA1)    'A1形式
        Else
            txtCell.Value = rngActCell.Address(True, True, xlR1C1)    'R1C1形式
        End If
    End If
End Sub



'----------- 複数のセル指定(Book/Sheet 切り換えが無い場合) ---------------
' Active なセルアドレスを txtCell1 に表示(lblMousePad1 )
' 同様に、txtCell2/lblMousePad2 で処理する

Private Before_X1 As Single
Private Before_Y1 As Single
Private rngActCell1 As Range
Private Before_X2 As Single
Private Before_Y2 As Single
Private rngActCell2 As Range

Private Sub UserForm_Initialize()
Dim rngDummy As Range
    '初期化
    Call ktCellMovePad(False, 0, 0, 0, Before_X1, Before_Y1, lblMousePad1, rngDummy )
    Call ktCellMovePad(False, 0, 0, 0, Before_X2, Before_Y2, lblMousePad2, rngDummy )
    Set rngActCell1 = Nothing
    Set rngActCell2 = Nothing
End Sub

Private Sub UserForm_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, _
                               ByVal X As Single, ByVal Y As Single)
Dim rngDummy As Range
    'マウスパッド用ラベルから外に出たのでリセットする
    Call ktCellMovePad(False, 0, 0, 0, Before_X1, Before_Y1, lblMousePad1, rngDummy )
    Call ktCellMovePad(False, 0, 0, 0, Before_X2, Before_Y2, lblMousePad2, rngDummy )
End Sub

Private Sub lblMousePad1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, _
                                   ByVal X As Single, ByVal Y As Single)
Dim rngActTemp As Range
    Call ktCellMovePad(True, X, Y, Shift, Before_X1, Before_Y1, lblMousePad1, rngActTemp )
    If ((Shift And 1) = 1) Then
        '[Shift]押下中のみセル表示を変更
        If (Application.ReferenceStyle = xlA1) Then
            txtCell1.Value = rngActTemp.Address(False, False, xlA1)    'A1形式
        Else
            txtCell1.Value = rngActTemp.Address(True, True, xlR1C1)    'R1C1形式
        End If
        Set rngActCell1 = rngActTemp
    Else
        '何もしない(セル表示/セル参照は、そのまま)
    End If
End Sub

Private Sub lblMousePad2_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, _
                                   ByVal X As Single, ByVal Y As Single)
Dim rngActTemp As Range
    Call ktCellMovePad(True, X, Y, Shift, Before_X2, Before_Y2, lblMousePad2, rngActTemp )
    If ((Shift And 1) = 1) Then
        '[Shift]押下中のみセル表示を変更
        If (Application.ReferenceStyle = xlA1) Then
            txtCell2.Value = rngActTemp.Address(False, False, xlA1)    'A1形式
        Else
            txtCell2.Value = rngActTemp.Address(True, True, xlR1C1)    'R1C1形式
        End If
        Set rngActCell2 = rngActTemp
    Else
        '何もしない(セル表示/セル参照は、そのまま)
    End If
End Sub



'----------- 複数のセル指定(Book/Sheet 切り換えが有る場合) ---------------
' txtBook1/txtSheet1 に選択したブック名/シート名が入っているとする
' Active なセルアドレスを txtCell1 に表示(lblMousePad1 )
' 同様に、txtBook2/txtSheet2/txtCell2/lblMousePad2 で処理する

Private Before_X1 As Single
Private Before_Y1 As Single
Private rngActCell1 As Range
Private Before_X2 As Single
Private Before_Y2 As Single
Private rngActCell2 As Range

Private Sub UserForm_Initialize()
Dim rngDummy As Range
    '初期化
    Call ktCellMovePad(False, 0, 0, 0, Before_X1, Before_Y1, lblMousePad1, rngDummy )
    Call ktCellMovePad(False, 0, 0, 0, Before_X2, Before_Y2, lblMousePad2, rngDummy )
    Set rngActCell1 = Nothing
    Set rngActCell2 = Nothing
End Sub

Private Sub UserForm_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, _
                               ByVal X As Single, ByVal Y As Single)
Dim rngDummy As Range
    'マウスパッド用ラベルから外に出たのでリセットする
    Call ktCellMovePad(False, 0, 0, 0, Before_X1, Before_Y1, lblMousePad1, rngDummy )
    Call ktCellMovePad(False, 0, 0, 0, Before_X2, Before_Y2, lblMousePad2, rngDummy )
End Sub

Private Sub lblMousePad1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, _
                                   ByVal X As Single, ByVal Y As Single)
Dim rngActTemp As Range
    Call ktCellMovePad(True, X, Y, Shift, Before_X1, Before_Y1, lblMousePad1, rngActTemp, _
                       txtBook1.Value, txtSheet1.Value )
    If (rngActTemp Is Nothing ) Then
        txtCell1.Value = ""    'Book/Sheet 指定エラー
        Set rngActCell1 = Nothing
    Else
        If ((Shift And 1) = 1) Then
            '[Shift]押下中のみセル表示を変更
            If (Application.ReferenceStyle = xlA1) Then
                txtCell1.Value = rngActTemp.Address(False, False, xlA1)    'A1形式
            Else
                txtCell1.Value = rngActTemp.Address(True, True, xlR1C1)    'R1C1形式
            End If
            Set rngActCell1 = rngActTemp
        Else
            '何もしな(セル表示/セル参照は、そのまま)
        End If
    End If
End Sub

Private Sub lblMousePad2_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, _
                                   ByVal X As Single, ByVal Y As Single)
Dim rngActTemp As Range
    Call ktCellMovePad(True, X, Y, Shift, Before_X2, Before_Y2, lblMousePad2, rngActTemp, _
                       txtBook2.Value, txtSheet2.Value )
    If (rngActTemp Is Nothing ) Then
        txtCell2.Value = ""    'Book/Sheet 指定エラー
        Set rngActCell2 = Nothing
    Else
        If ((Shift And 1) = 1) Then
            '[Shift]押下中のみセル表示を変更
            If (Application.ReferenceStyle = xlA1) Then
                txtCell2.Value = rngActTemp.Address(False, False, xlA1)    'A1形式
            Else
                txtCell2.Value = rngActTemp.Address(True, True, xlR1C1)    'R1C1形式
            End If
            Set rngActCell2 = rngActTemp
        Else
            '何もしない(セル表示/セル参照は、そのまま)
        End If
    End If
End Sub



Home  kt関数 Top  kt関数 Ref  Back Page  Next Page


角田 桂一 Mail:addinbox@h4.dion.ne.jp CopyRight(C) 2001 Allrights Reserved.