SSブログ

エクセル保育園:選択範囲へスクロール [コンピューター]

6/12の記事で、選択された複数のセルに今日の日付(例:2012/6/12) を代入するマクロを紹介しました。

その中で、今日の日付(例:2012/6/12) を代入する前に、選択されたセル範囲にスクロールして、本当にそのセルで良いか、ユーザーに確認してもらう機能を作りましたので、説明します。

なぜ、このような機能を作ったかといいますと、マクロを起動するボタンと、選択されたセル範囲が離れている場合、ボタンを押したとき、日付が代入されるセルが見えず、不安になるから、であります。

001.jpg

上の図のようにセルを選択した場合、赤線で囲ったセル範囲の左上にスクロールすることを考えます。

赤線で囲ったセル範囲の左上のセルは、行番号、列番号も一番小さいので、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

ヤバイぜ!(13)  コメント(3)  トラックバック(0) 
共通テーマ:日記・雑感

ヤバイぜ! 13

コメント 3

cheese999

nice! ありがとうございましゅ。
(*_*)ノ
by cheese999 (2012-07-02 04:45) 

Loby

エクセルをよく使用する人には
貴重なアドバイスですね♪

by Loby (2012-07-02 22:44) 

cheese999

Lobyさん、
そう言っていただき、うれしゅうございます。
(*_*)ノ
by cheese999 (2012-07-03 21:50) 

Facebook コメント

トラックバック 0

トラックバックの受付は締め切りました

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。