EXCEL基礎講座(8)
シフト管理表の作成
さて、一通りの関数やマクロを学んだ事と思います。ここで、それらを総合的に利用してシフト管理表を作成してみましょう。
作成するのは上のようなシフト管理表です。
@時間テーブルをドラックして「予定記録」ボタンを押下すれば、テーブルに「■」でグラフが表示されて、自動的に時間が集計されます。
Aスタッフのセルはリストで登録が可能です。
このようなシートを関数とマクロとで作成してみましょう。
■シートのレイアウトの作成■
まずは、シート1(Sheet1)の名称を「prn」(半角小文字)に変更しましょう。
シート1の見出しをダブルクリックして選択した状態とします。
ここで、「prn」と半角小文字で入力して、シート名称を変更しておきます。
左のように、半角小文字でシート名称が設定されました。
マクロを利用しようと考えているので、シート名称は正確に記述する必要があります。下手に全角文字の英数字を利用してしまうと、マクロ中で全角や半角の判別がつかない場合がありますので、基本的に英数字は半角を利用する・・・という姿勢を推奨します。
次に、シートのセル全体を選択します。
セル全体の選択は列を示す「A」と行を示す「1」の間のボタン(左図の部分)を押下します。
メニューから「書式」→「セル」→「配置」と選択し、縦横両方向で中央揃えとなるように設定しておきます。
つづいて、セル全体の文字(フォント)を「MS明朝」「9ポイント」に設定します。
(ちなみに、ここまでは作者のフォントの好みです(笑)ご自分の好きな文字を利用されて一向にかまいません)
「A4」セルに「スタッフ」
「B4」セルに「開始」、「C4」セルに「終了
「D4」セルに「時間」と入力してください。
次に、B、C列をドラックして、列の全選択を行います。
左の図のようにB・C列の間にカーソールを移動させて、サイズ変更のカーソール形状になったらドラックして、B、C列を幅4.25に設定します。
D列は幅4.00に設定しましょう。
■時刻テーブルの作成■
ここで、表に24時間分を15分刻みで表現する時刻テーブルを作成しようと思います。
見やすくする為に、時間表示と分表示のセルを別に表現しようと思います。行3には時間、行4には分・・・と言った具合にです。そして、最終的に、行2の時間表示は必要なくなりますので、表が完成したら、非表示にしてしまいます。
E2セルに「0:00」と時刻を入力 します。
F2セルに次の関数を入力します。
=+E2+TIME(0,15,0)
つまり、「E2セルに15分を足しなさい」という意味です。
この関数を入力したF2セルを右へ任意の幅(24時間になる程度)ドラックします。
CV2のセルまでドラックする事になると思います。
さて、次に、E3セルに関数を入れて、時刻のみ表示 させましょう。
関数は=Hour(E2) となります。セル表示は「0」となったと思います。
ひきつづき、E4セルに次の関数を入れて、分のみ表示 させましょう。
関数は=MINUTE(E2) となります。
E4セルの関数をE4:H4の範囲でオートフィルをかけます。
このようにしてできた、1時間分のテーブルの時間表示を24時間分複写してゆきます。
セル範囲E3:H4をドラックします。
コピーボタンを押下し、セル範囲をクリップボードに複写します(記憶させます)。
セルI3をクリックし、貼り付けボタンを押下します。
次は、セルM3をクリックし、貼りつけボタンを押下します。次々と複写し、CV2までの時刻テーブルをすべて満たして行きます。
さて、時刻テーブルの幅を調整しましょう。CVからEまでの列を全選択して、幅の調整を行います。
ここでは、仮に幅2.00となるように調整します。
これにより、E2:CV2のセル範囲の表示が「##」となってしまいますが、気にしないでください。後に非表示としますので、問題ありません。
■表の修正■
だんだん表が完成に近づいてきました。
ここで、スタッフの項目の前に「No」を挿入したいと思います。
セルA4をクリックして選択します。
メニューから、「挿入」→「列」をクリックしますと、画面は右へシフトし、1列挿入されます。関数の参照セル式の内容も同時にシフトされるので問題はありません。
A4に「No」と入力し、セル幅を2.00に設定しましょう。
次に、A5:A24までを1からの連番で満たしておきましょう。(1〜20まで)
■画面の分割■
さて、結構、大きな表になっているので、画面枠固定を行い、左と上部の表題部が常に画面に表示されるように設定を変更しましょう。
セルF5をクリックして、メニューから「ウィンドウ」→「ウィンドウ枠の固定」をクリックすれば、表題部が固定されて画面が使いやすくなります。
■マクロの記録■
ドラックされた範囲を「■」の文字で埋めるマクロを記録しましょう。
まず、表の、P6:W6の範囲をドラックしてください。ここからマクロの記録を開始します。
メニューから「ツール」→「マクロ」→「新しいマクロの記録」とクリックすればマクロの記録が開始されます。
マクロの記録を開始してからドラックをしますと、ドラックする(範囲指定する)と行為自体が記録されてしまいます。それでは、別の範囲を■で埋める事ができなくなりますので、必ず、範囲を指定した後に(=ドラックした後に)マクロの記録を開始します。
マクロの記録を開始しますと、マクロ名を尋ねてきます。左のダイアログBOX表示がそれです。
ここではマクロ名に「予定記録」と入力して「OK」を押しましょう。マクロの記録がスタートします。
そのまま「■」を入力します。
キーボードから「しかく」と入力し、[変換]キーで漢字変換しますと、「■」が表示されます。表示された漢字は[Enter]を押して確定させます。
そのまま[Ctrl]+[Enter]を押します。([Ctrl]キーを押しながら[Enter]キーを押す)
この操作で、選択された複数のセル範囲に対して、一度に「■」をすべて埋めることができます。
マクロの記録を終了させましょう。
ボタンに「記録終了」のボタンがあるはずですので、押下します。
これで、選択された範囲を「■」で満たす・・・というマクロが記録されました。
■マクロのテスト■
記録されたマクロが期待通りのものであるかどうかを確かめるためにテストを行ってみます。
今度はセル範囲I8:P8をドラックします。
メニューから「ツール」→「マクロ」→「マクロ」をクリックします。
マクロの選択ダイアログが表示されますので、そのまま「実行」ボタンを押下します。
この状態では、マクロは1つしか記録されていません。その為1つしか記録されていないマクロは選択状態となっていますから、「実行」ボタンを押下するだけです。複数のマクロが記録されている場合は、リスト内のマクロを選択してから、「実行」ボタンを押下します。
ちゃんと、次に指定した範囲も「■」で埋められた筈です。
■マクロボタンの作成■
さて、ここで、マクロ実行のボタンを作成しましょう。
マクロ実行ボタンにマクロの動作を設定すると、マクロボタンを押下するだけで、設定されたマクロが実行されるようになります。ここでは、シートのA1:E4までのセル範囲がウィンドウ枠の固定により常時表示されている形となりますので、そこにマクロボタンを作成します。
マクロボタンを作成するには、準備として「フォーム」というツールバーの表示を行う必要があります。
メニューから「表示」→「ツールバー」→「フォーム」をクリックします。
左のように「フォーム」という名のツールバーが表示されますので、そこから[ボタン]をクリックします。
そして、シートのA1:E4の範囲内の適当な所をドラックして、ボタンの大きさを決めます。
ドラックを終了させますと、左のように、「ボタン1」と書かれたボタンが表示されます。
かつ「マクロの登録」ダイアログBOXが現れます。
『このボタンに登録するのはどのマクロですか?』と尋ねてきた訳です。
マクロの一覧の中から「予定記録」をクリックして選択し、[OK]ボタンを押下します。
これで、マクロのボタンへの登録は終了しました。でも、「ボタン1」という名では何を行うマクロであるかよく分かりません。
マクロボタンは選択された状態であると思いますので、そのまま「ボタン1」とかかれている文字をドラックし[DEL]ボタンで削除してしまいます。(※マクロボタンが選択されていない状態であれば、マクロボタン上で右クリックを行います。右クリックメニューが表示されますが、無視して、マクロボタンの文字のところをクリックしますと文字編集モードとなります。)
文字の入力の前に[DEL]キーを押した直後に、フォントサイズの設定を変更して「8」ポイントにしておきましょう。
「予定記録」と入力してください。
8ポイント、MSPゴシックの文字でボタンが作成されました。
どこか、他のセルをクリックしてから、マクロボタンの上にマウスカーソールを置きますと、カーソールの形状は指の形に変わります。
「押せる」マクロボタンが設定された事がこれで判断できます。
さて、試しに、セル範囲M7:R7をドラックしてから、このボタンを押下してみましょう。ちゃんと「■」で埋められた筈です。
■作成されたマクロの内容の確認■
マクロがどのような形で記録されたかを確認することができます。
EXCELのシートを選択状態にしておいて、[Alt]を押しながらファンクション[F11]キーを押下します。
左の図のように「MicrosoftVisualBasic」とタイトルのあるウィンドウが開きます。
そのメニューから「表示」→「プロジェクトエクスプローラー」をクリックします。
プロジェクトウィンドウが開きます。
「モジュール」をダブルクリックし、下位フォルダを表示させます。
「Module1」をダブルクリックしますと、右の余地に、コードウィンドウが開きます。
コードウィンドウの最大化ボタンで最大化します。
左の図のように記録されたコードが表示されます。
記録されたマクロを確認してみましょう。
Option Explicit
Sub 予定記録()
'
' 予定記録 Macro
' マクロ記録日 : 2003/3/15 ユーザー名 : XXX
'
'
Selection.FormulaR1C1 = "■"
End Sub
上のようなマクロが記録されています。
「Option Explicit」これは、まじないのようなものです。(笑)今回は説明しません。
「Sub 予定記録() 」はマクロのプログラムスタートの宣言の記述です。
「
'
' 予定記録 Macro
' マクロ記録日 : 2003/3/15 ユーザー名 : XXX
'
' 」までは、EXCELが自動的に付加した作成ユーザーの情報などです。
「Selection.FormulaR1C1 = "■" 」この、僅か1行が今回のマクロの記録であるプログラムの本体の記述です。
「End Sub 」これは、マクロプログラムの終了の宣言の記述です。
マクロの記録後は、このように常に内容を確認するようにしましょう。なんとなく、だんだん、マクロの中身が分かってくるはずです。
今回のマクロ記録でも、記録した動作と照合すれば、なんとなく分かる筈です。
記録した動作は
「選択範囲に■をすべて入力する」です。
「Selection」おそらくこの記述が選択範囲を表している・・・とは思いませんか?
「.FormulaR1C1 = "■" 」そこにすべて■を入力する動作は、これで記述されている・・・とは思いませんか?
■削除のボタンの作成■
さて、練習です。ここで、予定記録を削除するボタンである「予定消去」のマクロボタンも作成しておきましょう。
今度は、簡単だと思いますので、手順のみ記載します。
1)範囲をドラックしておく。
2)メニューから「ツール」→「マクロ」→「新しいマクロの記録」を選択する。
3)マクロ名を「予定削除」と入力し[OK]ボタンを押下。
4)[DEL]キーを押下。(範囲の「■」が削除されたのを確認します)
5)マクロ記録停止のボタンを押下。
6)フォームから「ボタン」を選択し、先ほどと同様にして「予定削除」マクロの登録を行う。
7)ボタンのタイトル等を変更する。
Sub 予定削除()
'
' 予定削除 Macro
' マクロ記録日 : 2003/3/15 ユーザー名 :
'
'
Selection.ClearContents
End Sub
このようにして、上記のマクロが作成されます。
このように、マクロは一般的に、自動記録を使って利用します。マクロの自動記録を行う場合は次のように配慮します。
1)あらかじめ、マクロで記録する操作を練習しておきましょう。(ミスなく記録する為です)
2)その後にマクロの記録をスタートさせます。
・セルのクリックやシートあるいはウィンドウの移動も当然記録されるので、余計なクリックは行わないようにしましょう。
・操作手順によっては複数の記録が発生する場合があります。たとえば、セルの書式設定等で数回に渡って書式設定のダイアログを呼び出せば、セットで記録されてしまいます。(文字の中央揃えで1度ダイアログを呼出、再度フォントサイズ設定でダイアログを呼び出したりすると、1つの設定が数回記録されます。ダイアログの呼出設定などは1度で全てを設定するように配慮しましょう。)
3)必ず、VBAのプロジェクトを表示させて、コードを確認しておきましょう。(マクロの上達につながります)
■時間の計算■
では、ここで、シートのE5:E24に適用させる時間を関数で計算してみましょう。
■1個が15分を示していますでの、
1)■の個数を数える。
2)15分を乗算して、時間の合計を「分」の単位で計算する。
3)分の単位から「時間」と「分」を計算する
このような形で計算できそうです。
実際に■のある、E6セルを選択します。
■を数えましょう。
関数を検索してみますと「Countif」という関数が利用できそうです。
『指定した<範囲>に含まれる空白以外のセルのうち、<検索条件>に一致するセルの個数を返す。 』
と説明があります。
記述はこのようにあります『Countif(<範囲>,<検索条件>) 』
これに合わせて数式を入力してみましょう。
まずセルE6をクリックします。
数式バーに直接「=countif( 」と入力します。
次に範囲指定をドラックして行います。この場合は時間テーブルのF6:CW6の範囲です。(大きな表のドラックは、右端から左へと逆にドラックする方が簡単です。逆にドラックしてもちゃんと小大順で数式バーには表示されます。 )
「,」半角のカンマで区切ります。「" 」半角のダブルクォーテーションを入力します。「■」を入力します。もう一度、「" 」半角のダブルクォーテーションでくくり、「) 」閉じカッコでくくります。[Enter]キーで確定します。
E6セルに、「■」が入ったセルの個数が表示された筈です。(また、入力された式は、半角小文字で入力しても自動的に半角大文字に変換されている筈です。 )
■1個は15分を示していますので、この数式に15を乗算すれば、合計時間の分数が求められます。
さて、再度、数式バーの数式の末尾をクリックします。
「*15 」と15の乗算のための式を入力し[Enter]で確定します。
たとえば、■の数が8個ならば「120」という具合に分数が表示された筈です。
次に、これを時間の表示にします。ここでは、int関数とmod関数を利用してみましょう。
『INT関数:数値を指定した数値よりも0に近い整数に丸めた値を返します。 』とあります。つまり切り捨てを行ってくれるという事です。
1時間は60分ですから、計算された分数(ふんすう)を60で割って、これを切り捨てした値とすれば時間が求められます。
つまり時間を導く計算式は「int(<合計した分>/60) 」です。<合計した分>は先ほどの「=countif(f6:cw6,"■")*15」ですから、時間を求める数式は「INT(COUNTIF(F6:CW6,"■")*15/60) 」です。
次に分数(ふんすう)を求めてみましょう。
『MOD関数:数値を除算した剰余を返します。』とあります。つまり、ある数値Aを数値Bで割った余りの値を返す・・・という意味です。
したがって、60分で計算された分数(ふんすう)を割った余りは、端数の分数(ふんすう)に違いないはずです。
時間を処理した後の、余りの分数(ふんすう)を計算するには「mod(<合計した分>,60) 」で求められます。
つまり「MOD(COUNTIF(F6:CW6,"■")*15,60) 」が残りの分数です。
これらを時刻を表現しているように、文字の接続を行って表現します。
※文字の接続は「&」で行います。
「INT(COUNTIF(F7:CW7,"■")*15/60) & ":" & MOD(COUNTIF(F7:CW7,"■")*15,60) 」これで「XX:XX」といった具合で時間と分にセパレーターとして「:」を用いた表現となります。
左の数式が文字として表現された、合計の時間表現です。
ただ、このままではEXCELは、時間としてその値を判断できません。そこで、さらに、時刻表現された文字列を日付シリアル値に変換 する関数を利用します。この処理を行いますと、EXCELはその値を日付や時間として内部的に取り扱ってくれます。
左の図の関数です。「TIMEVALUE」がそれにあたります。
そこで、完成した関数を「TIMEVALUE()」でくくってしまいます。
「TIMEVALUE(INT(COUNTIF(F7:CW7,"■")*15/60) & ":"
&M OD(COUNTIF(F7:CW7,"■")*15,60)) 」が最終の数式となります。
ところが、表示は「0.0833」とか数値になってしまいます。
ご心配なく、これが正しいのです。日付・時刻にシリアル値を表示しているのです。1日を「1」としています。「0.0833」はたぶん2時間程度の値です。
そこで、上の図のように表示形式を設定して、時刻表示にします。
ここでは、ユーザー定義を選択し、<種類>に手入力で「H:MM」(半角小文字)で登録しました。
書式で「H」は時間、「MM」は0を補った2桁での分数(ふんすう)の表示書式です。
ちゃんと、「2:00」といった具合で表示が直ったはずです。
これをE5:E24の範囲に複写します。
このようにして、E列に時間の合計の計算ができるようになりました。
■開始時刻を得る関数■
今度は開始時刻を関数で導きましょう。
セルC5にその関数を登録したいと思います。
数式はちょっと難しいのですが、配列式で「=MIN(IF($F5:$CW5="■",COLUMN($F5:$CW5),"")) 」のようになります。
これは、F5:CW5のセル範囲の中で、もしも「■」があれば、セルの列位置(COLUMN)の値を返しなさい。
かつその内、最小の値(MIN)を返しなさい。という関数です。
セル範囲を配列として扱う必要があるので、数式バーに入力した後に[Ctrl]+[Shift]を押したまま[Enter]を押して確定する必要があります。
実際に入力してみましょう。
左図のように、数式バーに直接入力してください。
入力が終了したら、前述のように、[Ctrl]+[Shift]を押したまま[Enter]を押下します。
数式バーの数式が「{}」で囲まれて、配列式となります。
C5セルには「15」と値が表示されました。これは、指定範囲のなかで先頭の「■」は15列目にあるという事を意味しています。これで開始時刻が計算できます。
0:00が「6」個目のセルです。「15−6」の9個のセルが最初の「■」までにあるはずです。つまり、時刻テーブルの最初の時間+9*15分が開始時刻になるはずです。
ところが、配列式にはそれ以上、数式を追加する事ができません。
そこで、となりのD列全体を選択し、メニューから「挿入」→「セル」をクリックし、C列とD列の間に1列増やしてしまいます。
・1行増やした為にセルC5の関数で指定した範囲$F$5:$CW$5は自動的に1アドレスずれて$G$5:$CX$5に変化します。
あらたに追加されたD5セルに数式として「=TIME(0,+(C5-7)*15,0) 」を入力します。
これは、最初に使った数式で、
1)C5セルで数えた最初の列位置−0:00のセル位置を計算します。
2)その値に15分を乗算した分数(ふんすう)を時間として表現するものです。
そして、これに、0:00の値を絶対番地として登録します。
数式は「=$G$2+TIME(0,+(C5-7)*15,0) 」このようになります。
・G2の値を加算しているのは、時間テーブルの最初の値が午後12:00と変更されても正常に処理可能とする為です。
・7を減算するのは、なぜでしょう。それはC5セルで数えたセルの位置は行見出しであるA4〜F4までの6つのセルを加えた値だからです。たとえば0:00分から■マークがあるとします。このセル位置は、G5ですから、C5には7が表示されている筈です。そこで、0:00であると計算させる為、見出しに値する6に、植木算と等しく始まりを規定するための1を加えた7を減算します。
C4の表題をD4に移動しましょう。
■終了時刻を得る■
終了時刻は、MINの関数に対応したMAXの関数で得られます。
ここでは、関数を複写しながら入力します。
まず、列E全体選択した状態で、メニューから「挿入」→「セル」で1列追加します。
・ここでも、C5の数式を確認すると、1列増やした為に範囲はH5:CY5となって、1列シフトしているのが分かる筈です。
追加したセルE5にセルC5の数式を複写し、修正をかけて利用します。
セルC5を選択してください。
数式バーにはセルC5の数式が表示されます。
その数式バーに表示されている数式をドラックします。
ここで、[Ctrl]+[C]を押下し、クリップボードに数式を複写します。
セルE5を選択します。
数式バーをクリックします。
今度は[CTRL]+[V]で先ほど複写した数式を貼り付けます。
この操作で、セルE5とセルC5の数式は同じになる筈です。
そこで、E5セルの数式を最大値を求めるMAXに変更します。
「=MAX(IF(H5:CY5="■",COLUMN(H5:CY5),"")) 」数式はこのようになります。
そして、これもまた、配列式とする為に、[Ctrl]+[Shift]を押したまま[Enter]を押して確定する必要があります。
ここで、最終セルの(最大値)表示がおかしい場合があります。時刻形式で表示されているからです。その場合は表示形式を標準に戻しましょう。
次に終了時間の算出です。
これは複写で済む筈です。D5セルの数式をF5セルに複写します。
ただしく、終了時間が計算されたはずです。
数式は「=$H$2+TIME(0,+(E5-8)*15,0) 」になります。
これを必要個数、下に複写します。
・今度はE5−8というように、8が減算されています。1列を行見出しとして増やした為、減算する値も7から8へと増加させる必要があります。
・またD列の数式も、先ほどまでは7を減算していました。この7はセル番地を表している訳ではないので、1列増やしたからといって自動的に増えて8になったりしません。D5の数式も訂正して、『=TIME(0,+(C5-7)*15,0) 』とする必要があります。
ところが、下に複写しますと、数式がエラーとなるケースがあります。
未入力のケースで「■」が0個となるケースへの対応が必要です。
簡単ですねIF文で処理してしまいます。
よって、最終的には
D5セルの数式:「=IF(C5=0,"",$H$2+TIME(0,+(C5-8)*15,0))」
F5セルの数式:「=IF(E5=0,"",$H$2+TIME(0,+(E5-8)*15,0))」
となります。
この数式を複写し直してください。
最後に、計算の途中で利用した、列C、Eを非表示にしてしまいましょう。
つづいて、行2も非表示にします。
表はほぼ完成です。
■入力補助■
さて、入力補助として、スタッフ名をリストから入力可能なようにしましょう。
1)リストの作成
セルA30からA49に、1からの一連番号を入力してください。
セルB29に「スタッフ名」と登録します。
セルC39には「TEL」と登録します。
B30:B49の範囲に適当な人名を登録してください。
ここで、Bセルにこの、B30:B49のスタッフのリストから入力が可能なように設定します。
2)ウィンドウ枠固定の解除【EXCEL2000以降は必要ありません】
さて、リストからの登録を行えるようにする場合は、ウィンドウ枠を固定したままでは行えません。(EXCEL97では必要ですが、EXCEL2000以降はウィンドウ枠の固定を行っていても、リスト入力が可能になりました )そこで、まず、ウィンドウ枠の固定を解除します。
メニューから「ウィンドウ」→「ウィンドウ枠固定の解除」を選択します。
これで、ウィンドウの枠の固定は解除されます。
3)入力規則の設定
B5セルを選択します。
メニューから「データ」→「入力規則」を選択しますと、「データの入力規則」ダイアログが表示されます。
「入力値の種類」のリストBOXをクリックして、「リスト」を選択します。
「元の値」をクリックしてから、B30からB49をドラックして、範囲を選択し、「OK」ボタンを押下します。
4)入力規則の複写
「元の値」の範囲をドラックした時に、範囲のアドレス「=$B$30:$B$49」には「$」マークが付加されています。ご存知の通り、絶対番地となっていますので、そのまま必要な範囲、B5:B24へ複写します。
B5セルを選択します。
「コピー」ボタンを押します。
範囲B6:B24を選択します。(ドラックします)
「貼り付け」ボタンを押します。
この操作で、左の図のように、範囲に入力規則が適応された筈です。
簡単にスタッフの登録を行う事が可能になりました。
■スタッフ登録の時のみウィンドウ枠の解除が自動的に行われるようにする■
【EXCEL2000以降は必要ありません】
実は、マクロには便利な機能があります。特定のセルが選択された場合に特定の動作を自動的に行う・・・という機能のマクロが記述できます。
そのマクロを利用すれば、『B5:B24のいづれかのセルが選択された場合、ウィンドウ枠を解除し、他のセルが選択された場合はH5の位置でウィンドウ枠を固定しておく・・・』というような記述ができそうです。
1)ワークシートのセル選択発見マクロの準備
このマクロは、自動記録ができません。その為、手入力で記述して準備します。
@まず、例によって[Alt]+[F11]のキーを押して、マクロのウィンドウを表示させましょう。
A次に、プロジェクト・ウィンドウの中の「Sheet1(prn)」をダブルクリックしましょう。
ダブルクリックしますと、左の図のように白紙のあたらしいコード表示部が右側に表示されます。
B左のように「(General)」と表示されているリストBOXをクリックして、「Worksheet」を選択します。
そうすると、コード部に「Private Sub Worksheet_SelectionChange(ByVal Target
As Excel.Range)」の記述と「End Sub」の記述が表示されます。
これがワークシートの変化を発見するマクロの入り口(?)にあたるものです。
そこで、上手のようにコードを記述します。普通のメモ帳やワープロソフトで入力する手順と同じように、上図でドラックされている範囲を入力します。(コードは「"」で囲まれているメッセージ部を除いて半角で入力してください)(以下の青文字の部分です)
Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
If Target.Row < 5 Or Target.Row > 24 Then
Exit Sub
End If
If Target.Column <> 2 Then
Exit Sub
End If
MsgBox "リスト入力セルが選択されました"
End Sub
これは、ワークシートに何らかの変化があった場合に動作するマクロとなります。
If Target.Row < 5 Or Target.Row > 24 Then
Exit Sub
End If
もしも、選択されたセルの行が5行目未満または25行目以上ならば何もするな(このマクロを抜けなさい)・・・という記述です。
If Target.Column <> 2 Then
Exit Sub
End If
もしも、選択されたセルの列が2列目以外ならば何もするな(このマクロを抜けなさい)・・・という記述です。
その為、該当範囲であれば
MsgBox "リスト入力セルが選択されました"
で、うまく動作するかどうかの確認のためのメッセージBOXが表示されます。
2)マクロのテスト
マクロのテストを行ってみましょう。
シートに戻ってA5セルをクリックします。・・・何も起こりません。
次にB5セルをクリックします。・・・以下のメッセージBOXがシート中央位置に表示される筈です。
これで、このリスト入力範囲の選択発見マクロはうまく動作している事が分かります。
3)ウィンドウ枠固定のマクロの自動記録
さて、このマクロを改造して、入力範囲ならばH5セルでウィンドウ枠を固定し、それ以外ならば、ウィンドウ枠の固定の解除を行うように変更すれば良い訳です。
ウィンドウ枠の固定や解除は通常のマクロの自動記録で、記録されるはずです。ここで、自動記録を利用してその記述を抽出してみます。
1)セルA1を選択しておきましょう。
2)メニューから「ツール」「マクロ」「新しいマクロの記録」を選択します。
3)「マクロの記録」ダイアログが表示されますので、名称に「test」と入力しましょう。
<<ここから先がマクロで記録されるはずです>>
4)セルH5を選択します。
5)メニューから「ウィンドウ」→「ウィンドウ枠の固定」を選択します。
6)セルA1を選択します。
7)メニューから「ウィンドウ」→「ウィンドウ枠固定の解除」を選択します。
<<ここでマクロ記録の終了>>
8)マクロの記録を終了します。(「■」ボタンを押下します)
さて、記録されたマクロをマクロウィンドウの「Module1」をダブルクリックして、表示させて見ますと以下のようになっています。
Sub test()
' test Macro
' マクロ記録日 : 2003/3/19
'
'
Range("H5").Select
ActiveWindow.FreezePanes = True
Range("A1").Select
ActiveWindow.FreezePanes = False
End Sub
どうもウィンドウ枠の固定は、セル指定「Range("H5").Select」の後の、「ActiveWindow.FreezePanes
= True」で設定されるようです。さらに「ActiveWindow.FreezePanes = False」で解除されていうようだと類推できます。
これで、先ほどのマクロの改造ができそうです。
4)ウィンドウ枠固定を解除するマクロの作成
Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
If Target.Row < 5 Or Target.Row > 24 Then
Exit Sub
End If
If Target.Column <> 2 Then
Exit Sub
End If
MsgBox "リスト入力セルが選択されました"
End Sub
青文字の部分で、ウィンドウ枠の解除を行えば良いので、
「ActiveWindow.FreezePanes = False」に置き換えます。
そこで、変更したのが以下のようなマクロです。
@Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
AIf Target.Row < 5 Or Target.Row > 24 Then
BExit Sub
CEnd If
DIf Target.Column <> 2 Then
EExit Sub
FEnd If
GActiveWindow.FreezePanes = False
HEnd Sub
G範囲内であるのでウィンドウ枠の固定を解除しなさい。
と・・・上のような意味に変更します。
5)ウィンドウ枠固定マクロ・ボタンの作成
ひきつづき、ウィンドウ枠固定を行うマクロを作成しましょう。
先ほど自動記録されたマクロを表示します。
マクロウィンドウのモジュール1をダブルクリックしてください。コードが再度表示されます。
左のようにマクロのタイトルである「test」をドラックして、「枠固定」と変更しましょう。
引き続き、先ほどのマクロでは、枠固定の解除を行っていた部分である左の図の記述部をドラックしてから[DEL]ボタンを押して削除してしまいます。
これで、枠を固定するだけのマクロが完成しました。
さて、初めに行ったように、マクロ・ボタンを「枠固定」で作成し、マクロの登録を行ってください。
■表の完成■
さて、後は、タイトルと、日付等を適当に挿入します。
ここでは、タイトルとして、B1セルに「ライン担当スタッフ一覧」を16ポイントで設定しました。
さらにセルK1に、当日の日付を表示させたいのですが、セル幅が小さいので「now関数」で得た現在の日付時刻シリアル値を「TEXT関数」で文字列変換して表示させる事にしました。
セルK1の式は「=TEXT(NOW(),"ggge年m月d日 (aaa)")」のようになります。
このようにして完成したのが、はじめに紹介しました図の予定表です。
自由に罫線や文字修飾を行って、自分らしい表に改造してください♪
■改造のポイント■
24時間のタイムテーブルを用意しましたが、12時間しか必要ない・・・という場合には以下のように改造します。
@行「1:3」をドラックして、メニューから「書式」→「行」→「再表示」で隠されている2行目を表示させます。
AセルH2に先頭の時間を登録します。(午前6時からのテーブルでしたら、「6:00」と入力します。
B6:00からの24時間テーブルに変更されたと思います。必要の無い範囲の列をドラックして、メニューから「編集」→「削除」で削除してしまいましょう。
C行2をクリックして2行目全体を選択します。
Dメニューから「書式」→「行」→「表示しない」を実行し2行目を表示させないようにします。