エクセル保育園:選択範囲へスクロール [コンピューター]
6/12の記事で、選択された複数のセルに今日の日付(例:2012/6/12) を代入するマクロを紹介しました。
その中で、今日の日付(例:2012/6/12) を代入する前に、選択されたセル範囲にスクロールして、本当にそのセルで良いか、ユーザーに確認してもらう機能を作りましたので、説明します。
なぜ、このような機能を作ったかといいますと、マクロを起動するボタンと、選択されたセル範囲が離れている場合、ボタンを押したとき、日付が代入されるセルが見えず、不安になるから、であります。
上の図のようにセルを選択した場合、赤線で囲ったセル範囲の左上にスクロールすることを考えます。
赤線で囲ったセル範囲の左上のセルは、行番号、列番号も一番小さいので、Selectionに含まれる選択されたセルの行番号、列番号を1つずつ調べて、1番小さいものを選べばいいことが分かります。次のような関数を作りました。
01:Function UFLftUp1(mode As Integer) As Integer
02: ' 選択されたセル範囲の左上のセルを探す。
03: ' mode : モード
04: ' mode=0 : 左上のセルの行を探す。
05: ' mode=1 : 左上のセルの列を探す。
06: ' Selection(1)は、最初に選択したセルを示す
07: ' MsgBox "Selection(1).address=" & Selection(1).Address
08: Select Case mode
09: Case 0
10: Row1 = Selection(1).Row ' 行番号の初期値
11: For Each objRANGE In Selection.Cells
12: ' 一番上の行番号を探す
13: If objRANGE.Row < Row1 Then
14: Row1 = objRANGE.Row
15: End If
16: Next
17: UFLftUp1 = Row1
18: Exit Function
19: Case 1
20: column1 = Selection(1).column '列番号の初期値
21: For Each objRANGE In Selection.Cells
22: ' 一番左の列番号を探す
23: If objRANGE.column < column1 Then
24: column1 = objRANGE.column
25: End If
26: Next
27: UFLftUp1 = column1
28: Exit Function
29: Case Else
30: UFLftUp1 = 999999 ' Error
31: End Select
32:End Function
UFLftUp1関数は、mode引数が0の場合は、左上のセルの行番号を返し、mode引数が1の場合は、左上のセルの列番号を返します。
mode引数が0の場合、10行目から、18行目までを実行します。
10行目で、Row1変数を初期化します。
Selection(1).Rowは、選択されたセルのうち、1番目に選択されたセル『Selection(1)』の行番号を表します。
11行目から16行目のFor Each - Nextループで、選択されたセルを1つずつ取り出して、その行番号がRow1より小さかったら、その行番号をRow1に代入します。
ループを終了したら、17行目でRow1の値を戻り値として返し、関数を終了します。
mode引数が1の場合、20行目から、28行目までを実行します。
20行目で、column1変数を初期化します。
Selection(1).columnは、選択されたセルのうち、1番目に選択されたセル『Selection(1)』の列番号を表します。
21行目から26行目のFor Each - Nextループで、選択されたセルを1つずつ取り出して、その列番号がcolumn1より小さかったら、その列番号をcolumn1に代入します。
ループを終了したら、27行目でcolumn1の値を戻り値として返し、関数を終了します。
なぜ、このような関数が必要なのでしょうか?
それは、『Selection(1)』が、選択されたセル範囲の左上のセルを指さない場合があるからです。たとえば、D40セルを選択し、Ctrlキーを押しながら、B36をクリックしたとします。
この場合、『Selection(1)』は、最初に選択した右下のD40セルとなり、左上のB36セルではありません。
次に、UFLftUp1関数を使用して、選択されたセル範囲の左上のセルにスクロールするマクロを説明します。
1:Sub abc()
2: ' 選択されているセル範囲の左上へスクロールする
3: With ActiveWindow
4: ' MsgBox "selection(1)=" & Selection(1).Address
5: .ScrollRow = UFLftUp1(0) ' 一番上の行番号
6: .ScrollColumn = UFLftUp1(1) ' 一番左の列番号
7: ' MsgBox .VisibleRange.Address ' 現在表示されている(見えている)セル範囲
8: End With
9:End Sub
3行目のWith ActiveWindowから、8行目のEnd Withまでの間について、アクティブなウィンドウに対して実行します。アクティブなウィンドウって何でしょうね? エクセルのウィンドウが複数開いていたら、1番手前に来ている操作対象となっているウィンドウでしょうか。
4行目は、デバッグ用の命令なので、通常は(')を付けて、コメント化しておきます。
最初に選択されたセルの行列番号を表示します。
5行目で、選択されたセル範囲の1番上の行にスクロールします。UFLftUp1関数をmode=0で呼び出します。
6行目で、選択されたセル範囲の1番左の列にスクロールします。UFLftUp1関数をmode=1で呼び出します。
7行目も、デバッグ用の命令なので、通常は半角アポストロフィー(')を行頭に付けて、コメント化しておきます。
現在表示されている(見えている)セル範囲を表示します。
今回は以上となります。最後まで読んでいただき、ありがとうございます。
(追伸)
この記事を作成するにあたり、Office TANAKAさんの『ワークシートをスクロールする』を参考にさせていただきました。
Nirvana - Nirvana (2002) - Full Album
その中で、今日の日付(例:2012/6/12) を代入する前に、選択されたセル範囲にスクロールして、本当にそのセルで良いか、ユーザーに確認してもらう機能を作りましたので、説明します。
なぜ、このような機能を作ったかといいますと、マクロを起動するボタンと、選択されたセル範囲が離れている場合、ボタンを押したとき、日付が代入されるセルが見えず、不安になるから、であります。
上の図のようにセルを選択した場合、赤線で囲ったセル範囲の左上にスクロールすることを考えます。
赤線で囲ったセル範囲の左上のセルは、行番号、列番号も一番小さいので、Selectionに含まれる選択されたセルの行番号、列番号を1つずつ調べて、1番小さいものを選べばいいことが分かります。次のような関数を作りました。
01:Function UFLftUp1(mode As Integer) As Integer
02: ' 選択されたセル範囲の左上のセルを探す。
03: ' mode : モード
04: ' mode=0 : 左上のセルの行を探す。
05: ' mode=1 : 左上のセルの列を探す。
06: ' Selection(1)は、最初に選択したセルを示す
07: ' MsgBox "Selection(1).address=" & Selection(1).Address
08: Select Case mode
09: Case 0
10: Row1 = Selection(1).Row ' 行番号の初期値
11: For Each objRANGE In Selection.Cells
12: ' 一番上の行番号を探す
13: If objRANGE.Row < Row1 Then
14: Row1 = objRANGE.Row
15: End If
16: Next
17: UFLftUp1 = Row1
18: Exit Function
19: Case 1
20: column1 = Selection(1).column '列番号の初期値
21: For Each objRANGE In Selection.Cells
22: ' 一番左の列番号を探す
23: If objRANGE.column < column1 Then
24: column1 = objRANGE.column
25: End If
26: Next
27: UFLftUp1 = column1
28: Exit Function
29: Case Else
30: UFLftUp1 = 999999 ' Error
31: End Select
32:End Function
UFLftUp1関数は、mode引数が0の場合は、左上のセルの行番号を返し、mode引数が1の場合は、左上のセルの列番号を返します。
mode引数が0の場合、10行目から、18行目までを実行します。
10行目で、Row1変数を初期化します。
Selection(1).Rowは、選択されたセルのうち、1番目に選択されたセル『Selection(1)』の行番号を表します。
11行目から16行目のFor Each - Nextループで、選択されたセルを1つずつ取り出して、その行番号がRow1より小さかったら、その行番号をRow1に代入します。
ループを終了したら、17行目でRow1の値を戻り値として返し、関数を終了します。
mode引数が1の場合、20行目から、28行目までを実行します。
20行目で、column1変数を初期化します。
Selection(1).columnは、選択されたセルのうち、1番目に選択されたセル『Selection(1)』の列番号を表します。
21行目から26行目のFor Each - Nextループで、選択されたセルを1つずつ取り出して、その列番号がcolumn1より小さかったら、その列番号をcolumn1に代入します。
ループを終了したら、27行目でcolumn1の値を戻り値として返し、関数を終了します。
なぜ、このような関数が必要なのでしょうか?
それは、『Selection(1)』が、選択されたセル範囲の左上のセルを指さない場合があるからです。たとえば、D40セルを選択し、Ctrlキーを押しながら、B36をクリックしたとします。
この場合、『Selection(1)』は、最初に選択した右下のD40セルとなり、左上のB36セルではありません。
次に、UFLftUp1関数を使用して、選択されたセル範囲の左上のセルにスクロールするマクロを説明します。
1:Sub abc()
2: ' 選択されているセル範囲の左上へスクロールする
3: With ActiveWindow
4: ' MsgBox "selection(1)=" & Selection(1).Address
5: .ScrollRow = UFLftUp1(0) ' 一番上の行番号
6: .ScrollColumn = UFLftUp1(1) ' 一番左の列番号
7: ' MsgBox .VisibleRange.Address ' 現在表示されている(見えている)セル範囲
8: End With
9:End Sub
3行目のWith ActiveWindowから、8行目のEnd Withまでの間について、アクティブなウィンドウに対して実行します。アクティブなウィンドウって何でしょうね? エクセルのウィンドウが複数開いていたら、1番手前に来ている操作対象となっているウィンドウでしょうか。
4行目は、デバッグ用の命令なので、通常は(')を付けて、コメント化しておきます。
最初に選択されたセルの行列番号を表示します。
5行目で、選択されたセル範囲の1番上の行にスクロールします。UFLftUp1関数をmode=0で呼び出します。
6行目で、選択されたセル範囲の1番左の列にスクロールします。UFLftUp1関数をmode=1で呼び出します。
7行目も、デバッグ用の命令なので、通常は半角アポストロフィー(')を行頭に付けて、コメント化しておきます。
現在表示されている(見えている)セル範囲を表示します。
今回は以上となります。最後まで読んでいただき、ありがとうございます。
(追伸)
この記事を作成するにあたり、Office TANAKAさんの『ワークシートをスクロールする』を参考にさせていただきました。
Nirvana - Nirvana (2002) - Full Album
nice! ありがとうございましゅ。
(*_*)ノ
by cheese999 (2012-07-02 04:45)
エクセルをよく使用する人には
貴重なアドバイスですね♪
by Loby (2012-07-02 22:44)
Lobyさん、
そう言っていただき、うれしゅうございます。
(*_*)ノ
by cheese999 (2012-07-03 21:50)