2007年6月16日土曜日

第5回目 シートの選択とシート内でのセル座標の使い方

○第5回目 シートの選択とシート内でのセル座標の使い方
 シートをいろいろ使う場合は、まず今のシート名を取得しておきます。これが案外と簡単で、
sh_name = ActiveSheet.Name
 と書きます。
 そして、シートが追加された後は、
  Sheets(sh_name).Select と書きます。
チェックシートに戻りたいときは、
Sheets("チェックシート").Select と書きます。
とても簡単です。

 次にセルの選択の仕方です。
Range(yoko_midashi).Select でいいのですが、この場合の選択範囲の指定は、AB形式によるものとなっています。(yoko_midashiは$b$1:$h$5となっています)
もう一つの記述の仕方としては、RC形式があります。
これは、列の指定を列記号(a,b,c…)ではなく、列番号(1,2,3,…)で指定するものです。
 具体的には、
  Range(Cells(1,2), Cells(5,8)).Select と書きます。
 ( )内の最初は行番号で、後ろは列番号です。列番号2は、b列を指し、列番号8はh列を指します。順番がAB形式と逆になっていますので注意してください。
 b,hを列番号に変換するのは、それほど複雑ではありません。
Range("$b$1").Select
r1= ActiveCell.Row
  MsgBox ("アクティブセル行番号= " & r1)
 これは行番号でした。
Range("$h$1").Select
c1= ActiveCell.Column
  MsgBox ("アクティブセル行番号= " & c1)
 で、8が取得されているのがわかります。
 
範囲を指定した場合は、
Range("$b$1:$h$5").Select
r1 = Selection.Row
r9 = Selection.Rows.Count + Selection.Row - 1
c1 = Selection.Column
c9 = Selection.Columns.Count + Selection.Column - 1
MsgBox ("指定範囲は行,列の順で @@@@ " & r1 & "--" & r9 & "@@@@" & c1 & "--" & c9)
※必ず、Sub Macro2()    End Sub で括ることを忘れないように。

 『指定範囲は行,列の順で @@@@ 1--5@@@@2--8』 と出たでしょうか。
 同様にデータ部の座標も変換しておきましょう。r21,r29,c21,c29(これはc1,c9と同じ)とします。

 あともう少しです。
 セルの座標の使い方です。
 この処理では、全体の最初の一列がたて見出しとしていますので、正味のデータ部は2列目からとなります。
 チェックシートのチェック表は、c列から始めます。したがって、データ部はd列からとなります。
 基となる表をチェックシートの後ろのほうに元表としてコピペしておきます。

 途中からの流れを表すと、
 チェックシートの追加
 =⇒もとの表に戻り、よこ見出し部をチェックシートにコピペする。これは全部、セル幅及び値と数値の書式の三回行ないます。
 =⇒もとの表に戻り、データ部をチェックシートにコピペする。これは全部及び値と数値の書式の二回行ないます。
 =⇒チェックシートのチェック表を作ります。形式は同じなので、先ほどコピペした表をコピペします。元表には式が入っていないので、コピペは全部でいいでしょう。
 (チェック表のデータ部の一行目は計算対象外のため残ってしまいますので、本当はクリアしておくべきですが、荷が重くなってしまいすぎますので不備は承知で進めます。あとで簡単に修正できます)
 =⇒チェック表に時系列な変化率を表示します。
 (時系列の差は同様の繰り返しなので省略します。含める場合は元表のコピペの場所をもっと後ろにしておいてください)
 
 ここで少し前提を整理します。
 もとの表は、2列目(b列)から8列目(h列)までで、7列あります。
 チェックシートにはチェック表と元データ表を作ります。
 チェック表は3列目(c列)から始まるので9列目まで使います。
 元表は少しあけてコピペします。その場所は3+(8-2+1)+3という計算をして13列目としましょう。(c31=3+(c9-c1+1)+3=13 とします)
 コピペは記録マクロで作ったものを少し直して使いましょう。
 
 今回の心臓部の計算結果の算式です。
 データ部の行番号は6行目から25行目なのですが、6行目は前のデータがないので計算の対象外となります。
 for i=1 to (c9-c1) 'たて見出しを除いた分だけ繰り返す
for k=1 to (r29-r21)   'データ部の行数-1だけ繰り返す
   cells((r21+k),(3+i))=cells((r21+k-1),(c31+i))/cells((r21+k),(c31+i))
  next k
 next i
 
 今回の条件で変数を数値に直してみます。前提は b:h,1:5,6:25 です。
 正味のデータ列は7列。
 データ行は20行ですが、最初の行は計算できませんので、19行となります。
 for i=1 to 7 'たて見出しを除いた分だけ繰り返す
for k=1 to 19   'データ部の行数-1だけ繰り返す
   cells((6+k),(3+i))=cells((6+k-1),(13+i))/cells((6+k),(13+i))
  next k
 next i
 i=1,k=1のときは、次の様になります。
  7行14列の値÷その一つ上の6行14列の値 の計算結果を、7行4列に入れます。
  これを26行目まで19回繰り返します。
  更に、15列目から20列目まで6回(合計では7回)繰り返します。

 これで事例1の一部に関するマクロをつくる基本的な知識はできました。
 
 この連載では、全体のマクロは示しません。それに必要な一部のマクロのみです。それを組み合わせたりするのは、これから取り組もうという人たちの仕事になります。
 これで、事例1の一部に関するマクロがすぐに出来るとは思いませんが、少しづつマスターしてください。ブロックごとに区分けて、msgboxでメッセージを出し確認しながら、マクロをつくり、実行させてみてください。
 一ヶ月くらいはかかると思ったほうがいいと思います。
 また自分で考えた事例(簡単なもの)でもよろしいです。
 マクロの実行は、エクセルの世界からAlt+F8で、マクロ名を指定、となります。
 
 次回は、これまでのマクロ記述などの整理、if文の説明を行ないます。
 

0 件のコメント: