2007年6月30日土曜日

第16回目 データ処理マクロの基礎2-4

○第16回目 データ処理マクロの基礎2-4

 もう大体のテクニックは網羅していると思いますが、多少付録として続けます。
 いま、M、O、Q列にそれぞれ、列、行、3*3ブロックの中を検査し結果が入っています。
 9は、すでにそのブロックの中には該当する数字が入っていて、もういれられない。
 1は、入れることが出来る、
 ということを表しています。
 
 1行目(物理的には15行目)は、1という数値について、1列目と、1行目と1番目の3*3ブロックでの検査結果です。
 2行目は、2という数値について、1列目と、1行目と1番目の3*3ブロックでの検査結果です。
 9行目は、9という数値について、1列目と、1行目と1番目の3*3ブロックでの検査結果です。
 10行目は、
 今度は変わりまして、1という数値について、2列目と、2行目と2番目の3*3ブロックでの検査結果です。
 
 これが、81行目まで続いて、最後は、9という数値について、9列目と、9行目と9番目の3*3ブロックでの検査結果となります。
 
 ですから、56行目はといいますと、9で割ると、商6、余り2となります。
 これは、2という数値について、7番目ブロックに対してのものになります。
 
 では、81行目は…。9で割ると、9余り0だから、0という数値について、10番目ブロックに対してのもの? あれあれということになります。
 
 もう少しいい理解のしかたはないのでしょうか。
 1を引いて考えるのです。
 81は1を引くと80。9で割ると、8余り8となります。
 ここから、8+1という数値について、8+1のブロックに対してのものと理解できます。こちらのほうがスマートでしょう。

 つまり、最初の行を1行目ではなく、0行目と見るのです。
 このへんのあやが、配列変数の添え字が通常は0から始まっていることと繋がっているのではないかと思われます。
 
 さて、解読はこのくらいにして処理のほうに入ります。
 今回の処理は、数値を与えて、その数値がはいらない場所(すでに数値が入っている場所を含む)を色で塗りつぶすということにします。
 
 色の種類を3つもうけます。まずは、列単位でみてここには入らない。次に、行単位でみてここには入らない。最後に、3*3ブロック単位でみてここには入らない、という3種類です。
 
【流れ】
 1.数値を入力する
 2.列単位でみて、入れられないセルに色1をぬる。
 3.行単位でみて、入れられないセルに色2をぬる。
 4.3*3ブロック単位でみて、入れられないセルに色3をぬる。
 5.終了するか、別の数値で調べるかを指定します。
 6.どちらにしても、今ぬった色を消しておく必要があります。
  その上で、1へ戻るか、終了するかです。


 簡単ですので、やって見ましょう。
 
 色の設定は、
 
Cells(a, b).Interior.ColorIndex = xlNone 'クリア
Cells(a, b).Interior.ColorIndex = 13   '1-56のカラーコード

 他の方法としては、
Cells(a, b).Interior.Color = RGB(255,0,0)  '赤明度、緑明度、青明度
 があります。

 後の注意点は、次のブロックに行くところでしょうか。
 最初は、"14+入れた数値"の行です。
 次は、これに9をたし、8回繰り返しますので
i = 0 To 8として
 "14+入れた数値+i*9"の行となります。
 
 表の部分は、Cells(4, 3)からはじまっていますので、(4, 3)にそれなりの数値を足していき、必要な時に色をぬっていけばいいでしょう。

 列の処理のマクロを以下に示します。

 今日はここまで。

【マクロ例】
Sub a19入れられない場所に色をぬる()
'数値を与え、その数値を入れられない場所に色をぬる

Do
suuti = InputBox("1-9までの値を入れてください。", , 1)
If suuti >= 1 And suuti <= 9 Then Exit Do
Loop While 1 = 1

'列の部分
For i = 0 To 8 '横に動かす
If Cells(14 + suuti + i * 9, 13) = 9 Then
For j = 0 To 8 '下に動かす
Cells(4 + j, 3 + i).Interior.ColorIndex = 3
Next j
End If
Next i


MsgBox ("終了します")

Range(Cells(4, 3), Cells(12, 11)).Select
Selection.Interior.ColorIndex = xlNone

End Sub

第15回目 データ処理マクロの基礎2-3

○第15回目 データ処理マクロの基礎2-3

 続きです。
 今回は3*3のブロックで検査を行なう部分です。
 これはホネがあります。
 
 9個のコマを動かすのに今までのものが使えません。
 最初の3つはは、
 (4,3)、(5,3)、(6,3)
 次の3つは、
 (4,4)、(5,4)、(6,4)
 最後の3つは、
 (4,5)、(5,5)、(6,5)
 
 (4,3)を基準にすると
 (0,0)、(1,0)、(2,0)
 (0,1)、(1,1)、(2,1)
 (0,2)、(1,2)、(2,2)
 となります。
 1-9の数字でこれを表すには、少々工夫が必要です。
 毎回ごと、0,1,2の繰り返し
 3回ごとに0,1,2に固定する。
 
 
 この仕組みを表すには、
 コマの数(0-8)を、3で割り、余りと商にするのです。
 商はj ¥ 3、余りはj mod 3となります。

 数値1で考えてみると
 ii=1
 flag=1
  for j=0 to 8
 if cells(4+(j mod 3),3+(j \ 3)) = ii then  
  flag=9
  exit for
 end if
  next j
 
検査結果を入れる場所は、U17なのでcells(15,17)=cells(14+ii,17)となります。
if flag=9 then
cells(14+ii,17)=9
else
cells(14+ii,17)=1
end if


iiを動かすと
 
for i=0 to 8
 ii=i+1
 flag=1
  for j=0 to 8
 if cells(4+(j mod 3),3+(j \ 3)) = ii then  
  flag=9
  exit for
 end if
  next j
 
検査結果を入れる場所は、U17なのでcells(15,17)=cells(14+ii,17)となります。
if flag=9 then
cells(14+ii,17)=9
else
cells(14+ii,17)=1
end if
 
 next i
 
 となります。
 それほど複雑ではないのですが、余りと商を使うという点が新しいことです。
 
 そして、ブロックを動かすということを追加すると、出来上がりです。
 ただ、ブロックを追加した時、検査する範囲が3個の単位で、横に3つづれるので、その分を考慮します。
 基本位置から、0-2は下に3つづつ動かし、3-5は3つ横に下に3つづつ動かし、6-8は6つ横に下に3つづつ動かし、ということになります。

 これを表すと、+(k mod 3)*3、+(k \ 3)*3となります。
 
 該当する所は、次のようになります。
 

For k = 0 To 8

For i = 0 To 8
ii = i + 1
flag = 1
For j = 0 To 8
If Cells(4 + (j Mod 3) + (k Mod 3) * 3, 3 + (j \ 3) + (k \ 3) * 3) = ii Then
flag = 9
Exit For
End If

Next j

' 検査結果を入れる場所は、U17なのでcells(15,17)=cells(14+ii,17)となります。
If flag = 9 Then
Cells(14 + ii + k * 9, 17) = 9
Else
Cells(14 + ii + k * 9, 17) = 1
End If

Next i
Next k
 
 
 これを今までのプログラムの最後の追加すると出来上がりです。
 
 
Sub a19数独数値の有無のチェック()
'ある数値が、ブロックごとに入れるかどうかをチェックする

'列単位の検査
For k = 0 To 8

For i = 0 To 8
ii = i + 1
flag = 1 '=⇒フラッグの初期化はここでいいのか
For j = 0 To 8
If Cells(4 + j, 3 + k) = ii Then '=⇒3を動かす必要がある。
flag = 9
Exit For
End If
Next j

If flag = 9 Then
Cells(14 + ii + k * 9, 13) = 9
Else
Cells(14 + ii + k * 9, 13) = 1
End If

Next i
Next k


'行単位の検査

For k = 0 To 8
For i = 0 To 8
ii = i + 1
flag = 1
For j = 0 To 8
If Cells(4 + k, 3 + j) = ii Then
flag = 9
Exit For
End If
Next j

If flag = 9 Then
Cells(14 + ii + k * 9, 15) = 9
Else
Cells(14 + ii + k * 9, 15) = 1
End If

Next i
Next k


'3*3ブロックの検査

For k = 0 To 8

For i = 0 To 8
ii = i + 1
flag = 1
For j = 0 To 8
If Cells(4 + (j Mod 3) + (k Mod 3) * 3, 3 + (j \ 3) + (k \ 3) * 3) = ii Then
flag = 9
Exit For
End If

Next j

' 検査結果を入れる場所は、U17なのでcells(15,17)=cells(14+ii,17)となります。
If flag = 9 Then
Cells(14 + ii + k * 9, 17) = 9
Else
Cells(14 + ii + k * 9, 17) = 1
End If

Next i
Next k

End Sub

 

第14回目 データ処理マクロの基礎2-2

○第14回目 データ処理マクロの基礎2-2
 続きです。
 今回は行単位で検査を行なう部分です。
 大体のところは変わらないのですが、最小単位の検査で、行でなく列を動かして探すということです。
 ですから本体は変わりません。

 まず最初は、1が一行目にあるかどうかを見ればいいのです。
 ii=1
 flag=1
  for j=0 to 8
 if cells(4,3+j) = ii then  
  flag=9
  exit for
 end if
  next j

検査結果を入れる場所は、O15なのでcells(15,15)=cells(14+ii,15)となります。
if flag=9 then
cells(15,15)=9
else
cells(15,15)=1
end if

 ここに、数値が1-9まで動くことから、for文で包み込みます。
 
for i=0 to 8
 ii=i+1
 flag=1
  for j=0 to 8
 if cells(4,3+j) = ii then
  flag=9
  exit for
 end if
  next j

' 検査結果を入れる場所は、15からなのでcells(14+ii,15)となります。
if flag=9 then
cells(14+ii,15)=9
else
cells(14+ii,15)=1
end if
 
 next i
 
 これで、次に、行を動かしていくのです。
 前回と同様に、kのfor文で包み込みます。
  
for k=0 to 8
for i=0 to 8
 ii=i+1
 flag=1
  for j=0 to 8
 if cells(4,3+j) = ii then  '=⇒4を動かす必要がある⇒4+k
  flag=9
  exit for
 end if
  next j

'検査結果を入れる場所は、O15なのでcells(15,15)=cells(14+ii,15)となります。
if flag=9 then
cells(14+ii,15)=9   '=⇒14+iiを工夫する必要がある⇒14+ii+k*9
else
cells(14+ii,15)=1   '=⇒14+iiを工夫する必要がある⇒14+ii+k*9
end if
 
 next i
 next k
 
 この文を前回のものに追加すると、列、行での検査が終わります。
 
※ご注意
 これは数独の解法の解説ではありません。あくまでもセルのコントロールの仕方を説明しているのですので、誤解なきように。

2007年6月27日水曜日

第13回目 データ処理マクロの基礎2

○第13回目 データ処理マクロの基礎2
 マクロの実物を掲載するようになりましたので、こういう際のお決まりを申し述べておきます。
[免責事項]
 このブログに掲載するマクロを使用した際に不具合が生じても、筆者がその責任を負うことはありません。
 また、紹介するマクロ等に関しても同様です。
 あくまで自己責任でご利用ください。
 この旨は、第1回目にも追記しました。

 数独表などの形式(罫線などの見てくれ)は、通常のエクセル操作でしてください。
 今回は、数独表の分析を例にとって見ましょう。
 具体的には、
 あるブロックを決めた時、ある数値がそのブロックに入る可能性があるのかないのかを求めます。
 ブロックの種類としては、縦列ブロック、横列ブロック、3×3のブロックの3種類でそれぞれ9ブロックあり、全部で27ブロックとなります。
 ここに数値(1-9)が絡んでくるので、9×27=243の判定をしようということになります。
 1は入る可能性がある、9はそのブロックの中にあるのでもう入れないという意味とします。
 さて243も必要ですので、縦に長くなったり横に長くなったりしますので、工夫をします。
 前回でE15から81行を使っていますので、その横に、列ブロック、横ブロック、3×3ブロックの、三つに分けて展開します。列としては、M列、O列、Q列とします。
 最初の9行は、第一ブロックについて、1-9までを表します。
 ですから、15行は、数値"1"について、第1列、第1行、第1の3×3ブロックで入るのか、入れないのかを表します。
 20行目は、数値"6"についてです。
 24行目からは第2ブロックに移ります。
 30行目は数値"7"について、第2ブロックについてとなります。(7=30-(15-1)-9)
 
 表のイメージはよろしいでしょうか。
 
 列と行は簡単なのでまずはそこまで。
 一行目に、エクセル操作で"=column()"といれて、後ろまでコピーしてください。列番号がわかりますので、指をおらずに考えることが出来ます。
 
 数独ですの、ある数値がブロックに入るのは1個だけです。ですからすでにそのブロックに数値が入っていればもうは入れません。原理は簡単です。
 
 まず最初は、1が一列目にあるかどうかを見ればいいのです。
 ii=1
 flag=1
  for j=0 to 8
 if cells(4+j,3) = ii then
  flag=9
  exit for
 end if
  next j
'flagが1の時、何もないのではいる可能性あり。9の時、すでに入っている。
検査結果を入れる場所は、M15なのでcells(15,13)=cells(14+ii,13)となります。
15は、"14+ii"と考えることが出来ます。
if flag=9 then
cells(14+ii,13)=9
else
cells(14+ii,13)=1
end if

 ここでiiが1-9まで動くので、for文で包みます。
 

for i =0 to 8
 ii=i+1
 flag=1
  for j=0 to 8
 if cells(4+j,3) = ii then
  flag=9
  exit for
 end if
  next j

if flag=9 then
cells(14+ii,13)=9
else
cells(14+ii,13)=1
end if

next i

 さらに、列が1-9と動くので、for文で包みます。

Sub a19数独数値の有無のチェック()
'ある数値が、ブロックごとに入れるかどうかをチェックする

for k =0 to 8

for i =0 to 8
 ii=i+1
 flag=1   '=⇒フラッグの初期化はここでいいのか
  for j=0 to 8
 if cells(4+j,3) = ii then  '=⇒3を動かす必要がある。
  flag=9
  exit for
 end if
  next j

if flag=9 then
cells(14+ii,13)=9  '=⇒14+iiを工夫する必要がある
else
cells(14+ii,13)=1  '=⇒14+iiを工夫する必要がある
end if

next i
next k

end sub
 上の状態はただ単にfor文で包み、必要なところに、コメントをおいたものです。
 列が動くということと、検査結果を入れる場所が変わるということ大切なところです。
 列は3列目が順番に動くので、3の代わりに、3+kでいいでしょう。
 結果を入れる場所は、列が進むと下に移動します。正確には列が一つ進むと、次のブロックにいくので下に9つ動きます。すなわち、13の代わりに、13+k*9とすればいいということです。
 フラッグの初期化の場所は、最小単位の検査が始まる直前なので、現在のままで大丈夫です。

 上に述べた置き換えをして実行してください。
 チェックもお忘れなく。
 横にあるE列にある数値とはまったく関係がありませんので、かなりこんがります。ゆっくりと進んでください。
 
 かなり長くなりましたので、ここで一区切りとします。
 

2007年6月24日日曜日

第12回目 データ処理マクロの基礎

○第12回目 データ処理マクロの基礎
 データを処理するマクロの基本は、セルから数値を取得し、数値を加工し、またセルに加工した数値を書き込む、ということになります。
 これから更にエッセンスを取り出して、配列変数の使い方とセルの座標の使い方を考えていきます。
 "数独"を知っているかと思いますので、数独を材料に使います。
 
 数独の表を、C4(セル座標のこと)からK12にまで展開します。これは適当に用意してください。新聞の週末版に数独のクイズが載っているものがありが、それを使うのが便利でしょう。なければ適当に数値を入れてもいいです。

 テーマは、
 表にある数値を配列変数に格納し、それを別の場所に書き出す、です。(加工部分は省略した)。
 【前提】
  数独の表の列の順番で連番を振るとします。一列目が0-8、三列目が18-26、九列目が72-80などとなります。
  書き出す場所は、E15から下に展開し、数値は81個あるのでE95までとなります。
  D列にE列に対応した連番を振りましょう。0-80まで。
  配列変数は二次元とし、変数名等はmm(8,8)とします。
 

 Sub a19数独数値の縦展開()
' 数独の表の数値を縦に展開する。
 dim mm(8,8)

《表の数値を変数に格納する》

《変数の数値を縦一列に展開する》

《あわせて、手前の列に連番を振っておく》

End Sub

 大きなブロックでみると上のようになります。


【解説1】
 配列の定義
 Dim mm(8,8) で定義。
 内容は、0-8 かける 0-8 の変数を意味します。
 最初の添え字は列、次の添え字は行を表すとします。
 添え字は0から始まります。
 以上は前提です。
 
【解説2】《表の数値を変数に格納する》
 mm(i,j) = cells(l,m)
 変数の(i,j)にセル(l行,m列)の値を入れます。
 i=0(1列目)のとき、j=0-8まで動きますので
 for next を使って次のように書きます。
 i=0
 for j=0 to 8
  mm(0,j) =cells()
 next j
 
 さて、cells()の添え字はどうなるでしょうか。
 表はC4からはいっているので、最初の一列目はC12までです。
 ですから、cells(4+j,3)となります。
 jの始まりは0で、それに対応するセルの行番号は4ですので、"4+j"となります。
 列ば一定でC列なので3のままです。
 
 よろしいですか。
 つぎにいきます。今度は列が動くことを考えると、さらにfor nextで包むことになります。
 i=0のところを次のように変えます。
 for i=0 to 8
 cells()の中は(4+j,3+i)になります。
 i=0の時は、C列
 i=1の時は、D列となるわけです。(最後にnext iを忘れずに)

 ここまでで次のようになります。
 
 Sub a19数独数値の縦展開()
' 数独の表の数値を縦に展開する。
 dim mm(8,8)

'《表の数値を変数に格納する》
 for i=0 to 8
  for j=0 to 8
    mm(i,j) =cells(4+j,3+i)
  next j
 next i
 
《変数の数値を縦一列に展開する》

《あわせて、手前の列に連番を振っておく》

End Sub
 
 
【解説3】
《変数の数値を縦一列に展開する》は前ところの"mm(i,j) =cells(4+j,3+i)"
を逆にすればいいのです。
  cells(l,m)= mm(i,j)
 mは条件でE列ですので"5"となります。
 lは15から95までです。
 このところを、15+lとすると、lは0から80となります。
 変数はi,jで管理されているので、i,jをつかって0-80までを作り出す必要があります。
 (i=0,j=0)⇒0
 (i=0,j=1)⇒1
 (i=0,j=8)⇒8
 (i=1,j=0)⇒9
 (i=1,j=1)⇒10
 (i=1,j=2)⇒11 となります。
 この規則性から、
 l=i*9+jとなります。
 
 したがって、マクロは次のようになります。
 for i=0 to 8
  for j=0 to 8
    cells(20+i*9+j,5)=mm(i,j)
  next j
 next i
 
【解説4】
 最後にD列に、0からの連番を振るのは
 for i=0 to 80
   cells(15+i,4)=i
 next i
 
これをまとめると

Sub a19数独数値の縦展開()
' 数独の表の数値を縦に展開する。
Dim mm(8, 8)

'表の数値を変数に格納する》
For i = 0 To 8
For j = 0 To 8
mm(i, j) = Cells(4 + j, 3 + i)
Next j
Next i

'《変数の数値を縦一列に展開する》
For i = 0 To 8
For j = 0 To 8
Cells(15 + i * 9 + j, 5) = mm(i, j)
Next j
Next i

'《あわせて、手前の列に連番を振っておく》
For i = 0 To 80
Cells(15 + i, 4) = i
Next i

End Sub

今回は 以上です。

2007年6月23日土曜日

第11回目 便利マクロの事例

○第11回目 便利マクロの事例
 単純な操作マクロから。

 操作マクロで一番大切なのは、どんな操作が自分にとって一番有効なのかということです。この洗い出しなしに操作マクロを作ったりしても、数が多くなってかえって管理が難しくなります。
 
 よく使っているマクロから。

【例1】セルを結合させる。同時に文字中央にする。
 1.結合するセルを選択する。セルの選択は自由です。
 2.マクロ記録のはじめ。Alt、T,M,R。このときのマクロ名の頭に"a90"なりを付加しておく。通常は"macro"で始まるので、"a90macro…"とかなる
 3.Ctrl+1でセル変種のダイアログのセルタブを出して、
  横位置=⇒中央揃え
  "セルの結合する"をオン
 ダイアログを閉じる。
 4.マクロ記録の終了。Alt、T,M,R。
 これでおしまいです。
 
 ためしに実行してみましょう。
 まず、結合したいセルの範囲を設定します。
 Alt+F8でマクロのダイアログが出るの、その中から"a90macro…"を選択し実行する。"a90"を付加してのは、マクロ一覧の先頭のほうにくるからです。
 これだけで、セルが結合され、その中の文字が中央揃えになります
 
 マクロは次の通りとなります。
 自分でコーディングするのではなく自然にできてしまうのです。

 Sub a19Macro5()
' Macro5 Macro
' マクロ記録日 :
With Selection
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlBottom
.WrapText = False
.Orientation = 0
.AddIndent = False
.IndentLevel = 0
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = True
End With
End Sub

 この操作は、中央揃えとセル結合ですので、次のように無用部分を削除してもいいです。記述していないものは、それまでのものがそのまま適用されるということです。
 
 Sub a19Macro5()
' Macro5 Macro
' マクロ記録日 :
With Selection
.HorizontalAlignment = xlCenter
.MergeCells = True
End With
End Sub
 
【例2】格子状に罫線を引く
 これも簡単で、範囲を選択したあとで、マクロの記録を動かし、通常の操作をすれば出来てしまいます。
 このマクロの場合、一列のもの、一行のもの、セルが一つのものはエラーになってしまいます。あまり気にしないでマクロを終了させてください。一列のもの以外は予定どおりに線が引けると思います。
 ですので、一列の場合は、複数列を指定し動かし、不要な列を削除するというやり方で対応できます。
 マクロの例を掲げて見ます。複雑ですね。これを自分でコーディングするのはかなり大変ですが、マクロの記録を使えば簡単です。
《マクロの例》
Sub a19Macro6()
' a19Macro6 Macro
' マクロ記録日
'
Selection.Borders(xlDiagonalDown).LineStyle = xlNone
Selection.Borders(xlDiagonalUp).LineStyle = xlNone
With Selection.Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeTop)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeBottom)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeRight)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlInsideVertical)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlInsideHorizontal)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
End Sub

 あくまでの自分の操作で有益なものという選択眼になりますが、筆者が使っている機能を上げてみますと、
 
【例3】標準的なヘッダー、フッターの設定
【例4】そのシートの内容をノンストップで印刷。(シートの全ページが印刷されます。通常は印刷ダイアログが出て、手間が一つ余計にかかります)
【例5】指定範囲だけを印刷
【例6】文字を縦位置で中央揃えに

※マクロにはショートカットキーをつけ、それで起動、がとても便利です。ショートカットキーは有限なので、機能を絞り込む必要が出てきます。

2007年6月22日金曜日

第10回目 マクロをショートカットで動かす

○第10回目 マクロをショートカットで動かす
 ショートカットの設定の仕方としては、二つあります。
 一つは、ショートカットマクロを作り、それを実行させておくことです。
 もう一つは、マクロの一つ一つにショートカットを設定しておくことです。

 前者は、Auto_Openというマクロを作って、その中で記述するのです。
 例えば、
 Sub Auto_Open()
'一般-------------------------------
'表示-------------------------------
Application.OnKey "^{g}", "フォントアップ"
Application.OnKey "+^{g}", "フォントダウン"
'書式-------------------------------
Application.OnKey "+^{;}", "上中下寄せ"
Application.OnKey "+^{l}", "左中右寄せ"
Application.OnKey "^{t}", "インデント増"
Application.OnKey "+^{t}", "インデント減"
Application.OnKey "+^{F11}", "セル書式数字減らす" '"UserSubDec" '
Application.OnKey "^{F11}", "セル書式数字増やす" '"UserSubInc" '
'列幅------------------------------
Application.OnKey "^{,}", "列幅縮小"
Application.OnKey "^{.}", "列幅拡大"
End Sub

 というものです。これが便利なのは、エクセルを開くときに自動的にこの設定がされるということです。
 例えば、フォントを大きくするには、Ctrl+Gを押すことによって実行されます。
 このように操作マクロをショートカットに入れておくと便利です。
 
 後者は、Alt+F8でマクロ一覧を表示し、マクロを指定した後に、オプションでショートカットキーを設定するのです。Ctrl+xのもの、Ctrl+Shift+xのものが設定できます。
 他のショートカットと競合しないように自分操作マクロのショートカットをを設定してみましょう。
 
 操作マクロ関係の参考のために、CellFormats.xls、
 http://www.geocities.jp/dgscs970/downLoadCorner.html
 を紹介します。
 この、セル・行・列編集マクロを仕込んでおくとかなり便利です。
 (上のAuto_Openもここから取りました。一部のみ参照しています)

2007年6月19日火曜日

○第9回目 ロジックを伴うマクロと操作マクロ
 用語としては、確立したものはありませんが、気分的には、マクロをロジックを伴うマクロと操作マクロに分けたくなります。マクロをロジックを伴うマクロ(ロジックマクロ)は、普通、頭に浮かぶようなプログラムのことで、操作マクロは、操作手順を単純に記録したマクロのことです。ロジックマクロの中に操作マクロの部分は入っているのが普通ですが、主にという感じで使っています。なお、完全な操作マクロというのもありますがそれはかなり限定されてしまいます。有益なマクロは、二つの連合のもので、操作の機能を中心にしたものがいってみれば操作マクロでしょうか。

 マクロを作る着眼点としては、この機能または操作が自動化されたら便利だなあ、とか、この機能または操作が簡単に指示できれば、便利だなあ、というようなことを洗い出すことです。よく、大きなことを洗い出そうとしますが、それは作るのが大変で、どこかで挫折しがちになります。小さな機能でも十分便利です。小さな機能を多く集める、という考えがいいのではないでしょうか。
 そこで一例。
 エクセルの操作で、一番多いのが、コピー関係、印刷関係、セルの編集関係でしょうか。その中で、印刷を取り上げて見ましょう。
 必ず印刷という操作は必要になります。印刷条件がきまった後で、どんな内容の印刷をしますか。
 シート中に何ページ分かあると、いつも全部印刷ではないですよね。今回は3ページから後、今回は2ページだけとか、ページの範囲を与えて印刷するというのも結構便利な操作マクロです。
 また別の例として、部分印刷、つまり指定された範囲のみ印刷があります。
 範囲を指定した後でマクロを動かすということだけで印刷できるとなると便利です。
 このへんのニーズの洗い出しが、そのマクロをつくろうという、気持ちを作り出すのです。人から与えられた場合は、そのマクロの生命は短いケースが多いのではないでしょうか。
 基本的な考えは、事務の効率化はヒットでもいいということです。ホームランを狙う必要がないのです。かえって、逆にデメリットになります。
 少しずつでも積み上げることこそ、事務屋の資質の向上につながるのです。スタンドプレー的ではなく、コツコツとヒットを繰り返すことが大事なのです。

 また、マクロは作れなくても、便利と思われる機能はないかの洗い出しも必要なのだと思います。
 まずはニーズの洗い出しから。
 
 ※操作マクロで操作しても、マウスでやってもほとんど変わりないのではないかという疑問がわくと思います。
 マウスはどうかわかりませんが、単純な操作マクロの場合は、キーボードでの操作と、操作回数はほとんど変わりがないのが普通です。特にマウスの場合は、ツールバーに専用のアイコンがあるのでそれを使っての操作などかえってめんどくさいのではないか、と思うと思います。
 へんな言い方をすると、それはそのとおりなのです。
 じゃあ、操作マクロの効率的なところは何なのか?
 それはショートカットが効くということです。ですからつくられたマクロは、例えば、Ctrl+Shift+bなどで起動が可能なのです。これはキーボード操作ではメリット大です。
 通常でも、エクセルのショートカットにはいろいろなものがあります。それに更に追加できるということなのです。マウス操作の場合は、ショートカットという機能がありませんので、このへんの状況がわからないかもしれません。
 
 例えば、よく使う機能で、セルの結合があります。キーボードでは、範囲を指定した後に、Ctrl+1で書式ダイアログを開き、その中の配置タブを開き、セルを結合をクリックします。
 それが、範囲を指定した後、Ctrl+Mで出来るとしたら、かなり効率的になるのではないでしょうか。筆者もよく使っています(文字横中央配置もあわせて入れています)。この逆の処理をマクロにし、Ctrl+Shift+Mとしたらどうでしょうか。(Mはマージ(結合)するからとった)
 この二つのマクロは操作マクロから簡単に作成できます。あとはこれにショートカットをつけるだけです。
 
 筆者は、マウス操作は遅くなるので、キーボード操作にしなさいと機会あるごとにいっているのですが、残念ながら10人中10人はマウス操作のままです。それほど居心地がいいのです。効率性を正確に比較して説明すると、かえって反発を受けます。大きな壁を感じます。
 マクロの機能を生かすためには、キーボード操作が必須です、が、強制はできないという思いをもっています。その部分だけキーボード操作にするだけでもメリットはあると思います。

2007年6月18日月曜日

第8回目 マウス操作とキーボード操作

○第8回目 マウス操作とキーボード操作
 筆者はキーボード操作優先なので、マウス操作での記述が少なくなります。
 そこでいままでの操作をマウスでやった場合をまとめてみます。

・エクセル世界からマクロの世界へ
 上にあるコマンドバー(ファイル(F)とか編集(E)かがあるバー)のツール(T)をクリック、さらにその下のメニューからマクロ(M)をクリックし、"visual basic editer"をクリックします。(キーボード操作の場合…Alt+F11またはAlt、T、M、V)
・モジュールの追加
 マクロの世界で、コマンドバーの挿入(I)をクリック、さらにその下のメニューから標準モジュール(M)をクリックします。(キーボード操作の場合…Alt、I、M)
・マクロの実行
 コマンドバーのツール(T)をクリック、さらにその下のメニューからマクロ(M)をクリックし、さらにマクロ(M)をクリックします。(キーボード操作の場合…Alt+F8)
・記録マクロの開始と終了
 コマンドバーのツール(T)をクリック、さらにその下のメニューからマクロ(M)をクリックし、さらに記録(R)をクリックします。(キーボード操作の場合…Alt、T、M、R)
・マクロの世界からエクセルの世界へ
 コマンドバーのファイル(F)をクリック、さらにその下のメニューから終了してエクセルに戻る(C)をクリックします。(キーボード操作の場合…Alt+F11またはAlt+F4)
・エクセルの世界でセルの範囲指定し全部コピー
 これは操作マクロを記録する一例としてのせています。
 範囲にしたいセルの左端上をクリックし、ドラッグし右下端までマウスを移動。右クリックをしてメニューの中からコピーを選択し、コピーしたい場所までマウスで移動し、右クリックから貼り付けを選択します。
 (キーボード操作では、範囲にしたいセルの左端上にカーソルを合わせて、Shiftキーを押しながら矢印キーで右端までカーソルを移動させ、Ctrl+C。コピーしたい場所まで矢印キーで移動し、Ctrl+V)
・モジュールでの画面上下の移動
 右端のスライダーを動かして、画面を移動します。
 (キーボード操作では、矢印キーまたはPageUpキーまたはPageDownキーで移動)
・エクセルの終了
 ×ボタンをクリックします。
 または、コマンドバーのファイル(F)をクリック、さらにその下のメニューから閉じる(C)をクリックします。
 (キーボード操作の場合…Alt+F4、または、Alt、F、C)
 
※操作は自分のやりやすい方法でやってください。ただし、ここからの記述は、上のことを理解すれば、キーボード操作の記述で十分と思いますので、マウスでの操作記述は必要がある場合を除き省略します。
 例えば、Alt+F11の操作は、AltキーとF11キーの同時押しとなりますが、ウィンドウズの設定で、逐次押しで可能となります。その場合は、Alt、F11という操作になります。

 そのためには、コントロールパネルのユーザー補助のオプションから、キーボードタブの固定キー機能を使うを指定してください。
 『固定キー機能を使うと、キーを同時に押さなくても、Shift、Ctrl、Alt、または Windows ロゴ キーの機能が使えます。』

第7回目 マクロの作成環境など

○第7回目 マクロの作成環境など
 マクロは文字列の塊であり、それを作るためにはワードは必要ではありません。かえって動作が遅いため効率が悪くなります。
 通常の人は、テキストエディタを使っています。その中でも秀丸など有名だと思います。
 テキストなのでメモ帳でもいいのですが、使い勝手が落ちます。
 相性がいいテキストエディタを見つけてください。
 その条件として、そのテキストエディタの中でマクロが組めるとなおさらいいと思います。秀丸もマクロが使えますが、筆者は入り口で落ちこぼれてしまって秀丸は使えません。ソフト紹介でテキストエディタを調べてみてください。相性がいいのがきっとあると思います。
 http://kaden.yahoo.co.jp/download/dlsoft/?type=search&d=463&soft_kind0=&soft_kind1=&soft_kind2=&soft_kind3=&soft_kind4=&p=&tag=
 を参照してみてください。左端に主なテキストエディタが表示されています。
【例】
テキストエディタ
akira
dana
EmEditor
Emacs
秀丸エディタ
MIFES
MMエディタ
QXエディタ
TeraPad
vi
WZ用マクロ
 これらをクリックすると、関連するソフト(マクロを含む)が表示されます。数が多いのが充実しているということでしょうか。

 窓の杜も参照
 http://www.forest.impress.co.jp/lib/offc/document/txteditor/


 何事も研究です。今はメモ帳でも処理時間的にはほとんど変わりがないと思います。少し探してみてください。今の時間はそれほど無駄にはなりません。

 マクロ作成の手順としては、
 テキストエディタでの作成
 =⇒エクセルのモジュールに貼り付け、テスト。
 =⇒そこで修正または、テキストエディタに貼り付けて修正。
 =⇒テスト
 というような流れになります。

2007年6月17日日曜日

2007年6月16日土曜日

第6回目 今までの整理など

○第6回目 今までの整理など

□if構文
 【例1】
If h0 = "0" Then
p1 = ii + 1   'if文が満足するとき
p9 = Worksheets.Count
Else        'if文が満足しないとき
p1 = ii + 1
p9 = ii + h0
End If
 【例2】
If h0 = "0" Then p1 = ii + 1  'if文が満足したときいったん横道に行き、下の命令に行く。満足しない場合は、すぐに下の命令にいく。
 【例3】
For i = 1 To Len(cll)  'Len()関数は文字列の長さを求めるもの
If Mid(cll, i, 1) = ":" Then
wk1(j) = i: j = j + 1
  ElseIf Mid(cll, i, 1) = "," Then  '更にif文で場合わけをしている
wk1(j) = i: j = j + 1
  End If
Next i
 【例4】
For i = 3 To 15
If IsNumeric(Cells(i, 1)) = True Then
Cells(i, 4) = "数字です"
Else
Cells(i, 4) = "数字でないので、計算できません"
End If
Next i
 【例5】 ある条件に合致したときFor文を抜けています。
For ii = 0 To cc
If ActiveSheet.Name = WW(ii) Then Exit For 'シート名と同じ番号を取得する
Next ii

○第5回目 シートの選択とシート内でのセル座標の使い方
□シート名の取得 sh_name = ActiveSheet.Name
□シート名を指定し、そのシートに移動 Sheets(sh_name).Select
                  Sheets("sheet1").Select
□セルの選択  Range("$b$1:$h$5").Select
□セルの選択  Range(Cells(1,2), Cells(5,8)).Select
□セルの行番号を取得 Range("$b$1").Select
            r1= ActiveCell.Row
□セルの列番号を取得  Range("$h$1").Select
           c1= ActiveCell.Column
□範囲を指定した場合の行番号、列番号の取得
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
□セル座標の使い方
 for i=1 to 7
for k=1 to 19
   cells((6+k),(3+i))=cells((6+k-1),(13+i))/cells((6+k),(13+i))
  next k
 next i

○第4回目 セルの範囲を取得する
□セルの範囲を入力し、利用可能なように分解します。
hanni = InputBox("列の範囲、よこ見出し行の範囲、データ部の行範囲を入れてください。例えば  ", ,"b:h,1:5,6:25")
    p1=InStr(hanni,":")
  retu1 = Left(hanni,p1-1)
   hanni = Mid(hanni,p1+1)
□文字列の左端からnn個の文字を切り取る left(文字列,nn)
□文字列の右端からnn個の文字を切り取る right(文字列,nn)
□文字列のnn個目からmm個の文字を切り取る mid(文字列,nn,mm)
□文字列のnn個目から最後までの文字を切り取る mid(文字列,nn)
□座標の作成、文字列の作成
 yoko_midashi = "$" & retu1 &amp; "$" & gyo11 & ":$" & retu9 & "$" & gyo19  '$b$1:$h$5 のようになります。
 retu1、gyo11、retu9、gyo19には、それぞれ、b、1、h、5が入っています。
□新しいシートを作りシート名をチェックシートとします。
 Dim sh As Worksheet
Set sh = Worksheets.Add
sh.Name = "チェックシート"
□操作マクロの記録
 Alt、T、M、Rでマクロの記録を始めます。
 『処理』
 Alt、T、M、Rでマクロの記録を終わりにします。
□コピペ;すべて。できれば記録マクロで作ってください
Range("C16:F20").Select
Selection.Copy
Range("H16").Select
Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=False

○第3回目 マクロの解説及び補足
□参考にしたいホームページ
http://members.at.infoseek.co.jp/t_shun/My_Page/Excel-VBA/vba_menu.htm
□処理内容を画面に出力します。
MsgBox ("初めてのマクロです。是非マスターしたいです") 
 《他の例》
 YY=2007
 MM=6
DD=13
MsgBox ("今日は" & str(YY) & "年" & str(MM)" & "月" _
& str(MM) & "日です" )
□数字を文字に変換する関数 str()
□文字に数字に変換する関数 val()
□キーボードから入力をする
j = InputBox("整数値を入れてください。例えば  ", , 10)
□与えられた回数だけ処理を繰り返す。
For i = 1 To j  'j回、forからnextまでを繰り返します。
【処理】
Next i
 《他の例》
For i = 1 To j  'j回、forからnextまでを繰り返します。
k = k + i
Next i
MsgBox ("1から" & Str(j) & " までの答えは " & Str(k) & " です")
□配列定義 
  dim data(10)

○第2回目 始まり及び終了そして簡単な例
□エクセルの世界からマクロの世界へ Alt+F11 
□モジュールの追加 マクロの世界で、Alt、i、m
 (この記述は、順番に押すことを意味します)
□マクロの世界からエクセルの世界の戻る 
  Alt+F11 または Alt+F4
 
 第1回目 はじめに及び事例1
□マクロとは
 マクロとは、おもに、エクセル上のVBAをもとにして作成したプログラムをいいます。 マクロとは、エクセルでの作業を効率的に行なうための業務専用のプログラムのこと。
□マクロの効用
 通常のエクセルでも、さまざまな機能があり、マクロを使わなくても処理が出来ることは事実です。
 マクロを使えるようになると、同じ業務を短時間でできます。疲れは少なく、残業時間も少なく、自分の自由時間も多く使えることになります。
□【事例1】 時系列的に色々な数値の推移を表した表を作った。同じ形式の表でさらに条件を変えたパターンのものも作っています。(同一シート上にあるとする) 
 そこで業務内容。
 1.一つの表の中にある列をとったとき、時系列的な増減率、増減はどうなっているのか。
 2.別のパターンの表との増減率、増減はどうなっているのか (1、2とも、表の中には、増減率・増減を求めるにはなじまない項目もあると思うが、これまで考慮すると大変なので、表にある全部の項目について増減率・増減を求めてしまうということをします。不要な部分はあとで消せばいい、という気分。) 
□【事例1】でのポイント1
 1.使用するデータの範囲をどのように与えるか。
  たて見出し部分、横見出し部分、データ部分
 2.セル間の計算式が必要となるので、使用するセルをどのように記述するのか。
 3.増減率、増減の表を別シートにすると、新しいシートの作り方、また、データのあるシートとの間の移動をどうするのか。

第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 &amp; "--" & 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文の説明を行ないます。
 

第4回目 セルの範囲を取得する

第4回目 セルの範囲を取得する

 事例に戻り、その中の一つの機能を解説します。
□セルの範囲を入力し、利用可能なように加工します。
 ここでいうセルの範囲は、よこ見出し行の範囲とデータ部の範囲のことです。
 たて見出し列の範囲は、最初の一列と決め付けます。
 入力すべきものは、列の範囲と行の範囲が二つです。つまり、よこ見出しとデータ部の列の範囲は通常は同一となるからです。
 入力形式は、a:h,1:5,6:25 としました。それぞれ、列の範囲、よこ見出し行の範囲、データ部の行範囲です。
 この入力値から、それぞれの要素を分解することになります。
 文字関数が必要となります。
hanni = InputBox("列の範囲、よこ見出し行の範囲、データ部の行範囲を入れてください。例えば  ", ,"b:h,1:5,6:25")
 で、入力値を与えます。
 各要素に分解するためには、:及び,の位置が大事になってきます。
 そのためには、InStr関数をつかいます。
 書き方は、 p1=InStr(hanni,":")とかく。p1は指定した文字の位置で、数値です。
この例では、p1=2となります。
そこで、
  retu1 = Left(hanni,p1-1)で、bが取得できます。
   hanni = Mid(hanni,p1+1) '前を切り、h以降の文字にします。
後は、これらのことの繰り返しになります。
    p1=InStr(hanni,",") 'p1=2
    retu9 = Left(hanni,p1-1)で、hが取得できます。
   hanni = Mid(hanni,p1+1) '前を切り取り、1以降の文字にします。
このようにして、さらに、gyo11、gyo19、gyo21、gyo29を取得します。
よこ見出し、データの範囲は次のようになります。
 yoko_midashi = "$" & retu1 &amp; "$" & gyo11 & ":$" & retu9 & "$" & gyo19
data_bu = "$" & retu1 & "$" & gyo21 & ":$" & retu9 & "$" & gyo29
  二つをあわせたものは
zentai = "$" & retu1 & "$" & gyo11 & ":$" & retu9 & "$" & gyo29
  
Range(yoko_midashi).Select で、よこ見出し部が選択されます。
選択してどうするか。コピーするのです。
 
 次にいきましょう。
 新しいシートを作ります。
  Dim sh As Worksheet 'Worksheetというオブジェクトの変数をshと言う名で宣言します。
Dim Name As String '文字列型の変数 Name を宣言

Set sh = Worksheets.Add 'シートを追加
sh.Name = "チェックシート" 'シート名

 これで、チェックシートという名のシートが追加されます。
Dim文は、変数の定義するものです。
内容はコメントに書いてある通りです。

次にいきましょう。
 このチェックシートに表をコピーします。
 コピーの方式としては、すべてをコピーします。
 この命令は…
 ここでマクロの記録を使います。
 エクセルの操作で、コピペの仕方はわかっていると思います。試しにコピペを行い、そのときのマクロを記録させて、それを使用するのです。
 その仕方は次のようになる。
 エクセルの世界での処理です。
 Alt、T、M、Rでマクロの記録を始めます。
 このときにマクロの名前の指定のボックスが開かれますが、自動的に振られた名前を覚えておいてください
 通常の仕方で、全部を指定したコピペをしてください。
 おわったら、Alt、T、M、Rでマクロの記録を終わりにします。
 Alt+F11でマクロの世界に移り、モジュールの中から先ほどの名前のマクロを探してください。処理部を貼り付ければ、その部分のプログラムはだいたい完成します。
 【例】
 Sub Macro1()
'
' Macro1 Macro
' マクロ記録日
'
Range("C16:F20").Select   '←ここを変える。Range(zentai).Selectとか
Selection.Copy
Range("H16").Select     '←ここを変える
Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=False
End Sub

 同じシート上のコピペになってしまう。
 あれあれ、今どこのシートにいるのだろうか。
 それは次回。

2007年6月13日水曜日

○第3回目 マクロの解説及び補足

 前回の内容に関係する画面については、次のホームページをご覧ください。http://members.at.infoseek.co.jp/t_shun/My_Page/Excel-VBA/vba_menu.htm VBAの編集画面
※いつも参照しているページです。独学には、ちょっと厳しいですがある程度のレベルに達すれば、これで独学できます。
 それはさておき…。 まずは解説です。  ポイント1 処理内容を画面に出力する。 MsgBox ("初めてのマクロです。是非マスターしたいです")  を使います。
マクロをテストする際に、この命令を使って、途中結果を確認するときも使えます。 内容を結合することも出来ます。
 YY=2007
 MM=6
  DD=13
MsgBox ("今日は" & str(YY) & "年" & str(MM)" & "月" _
& str(MM) & "日です" ) 
Sub と End Sub の間に入れて実行してみてください。
  ※str()は数字を文字に変換する関数です。

 ポイント2 キーボードから入力をする。
j = InputBox("整数値を入れてください。例えば  ", , 10)
 ※( )内の'10'はデフォルト値となります。何も変更しない時は便利です。

 ポイント3 与えられた回数だけ処理を繰り返す。
For i = 1  To  j  'j回、forからnextまでを繰り返します。
【処理】
Next  i
 このfor next分はよく使います。 先の例題では、1からその数までを加算するという処理をしています。
 《他の例》
For m = 0 To 80
Cells(lr20 + m, lc42) = ""
Cells(lr20 + m, lc42 + 1) = ""
Cells(lr20 + m, lc42 + 10) = ""
Cells(lr20 + m, lc42 + 11) = ""
Next m
=⇒セルの内容を、ヌルで置き換えている。=クリアしている。

For m = 0 To 20
  MsgBox (str(m) & "番目の値は" & str(data(m)) & "です")
  Next m
=⇒配列定義をしているdataのm番目の値を表示する。エンターキーを押すと次にいく。

※これ以外で重要なものは、if文です。これだけでだいたいのマクロについて、大筋の構文が構築できます。
※普通のプログラムでは、まっず最初に変数の定義が必要となりますが、VBAでは、特別なものを除き、必要がありません。本式になると変数の定義は必須となるのですが、初級レベルでは、厳密性よりも、持続性を考えてやりやすさを求めたほうがいいと思います。

2007年6月11日月曜日

 第2回目 始まり及び終了そして簡単な例
 進め方はいろいろあるが、自分のやり方で。
 まずは、一からではなく、必要なところからという考え方でいきます。
 まずはどうするんですか? という疑問に対して、
 開始の仕方、終了の仕方をまず覚えてください、ということです。
 エクセルの世界から、そのマクロの世界へはどういったらいいのか、そして、エクセルの世界へ戻るにはどうしたいいのか、からはじめます。
 あなたはエクセルのシートを開いています。まずはここからです。
 Alt+F11を押してください。何かが起こるはずです。 この場合、Alt+F11は、Altキーを押しながらF1キー(キーボード最上部のファンクションキーF11のこと)を押すことを意味します。
 いわゆる、同時押しというやつです。 (私は、キーボード派なので、できるだけマウスは使いません) さらに、Alt、i、mを押してください。この記述では、順番に押すことを意味します。 すると、標準モジュールが追加され、その下にModule1が作られます。 マクロは、このModuleに記載するのです。(番号は連番で作られます) 
 これからエクセルに戻るには、Alt+F11をおします。または、Alt+F4。
 そして、通常の通りエクセルを終了させます。
 これで、始まりと終わりは終了です。簡単です。が、ものたりません。
 次に、閉じたこのエクセルブックを開いてみましょう。
 すると、前とは違います。
 マクロを有効にするかどうか聞いてきます。そんなものは作ったことはないと思ってもしようがありません。モジュールのシートを作っているので、メッセージがでます。
 有効を選択してください。(XP以下の場合。ビスタの場合は、ツールバーにひっそりと出ます) 
ああ、よかった。通常のシートが出てきます。
 本格的な、始まりと終わりはこんなもんです。
 これを、2,3回繰り返してみてください。(モジュールを作るのは最初だけでいいです) これで始まりと終わりは完璧です。
 これだけでは、社会人には面白くないので、プラスワン。
 これをモジュールに貼り付けてください。

  Sub test01()'文字の表示
MsgBox ("初めてのマクロです。是非マスターしたいです")
 end sub
  エクセルを出し、 Alt+F11 画面が変わったら、Module1をクリックして、はりつけてく
ださい。
 モジュールの表示が見つからなければ、左端のウィンドウの下のほうにあります。下にスクロールしてみてください。
 そして、Alt+F11を押し、エクセルに戻す。
 今度は、実行なのでAlt+F8を押し、TABで下に移動し、test01にあわせエンターキーを押す、とメッセージ「初めてのマクロです。是非マスターしたいです」がでます。
エンターキーを押すと終了です。
 以上が、簡単なマクロの作成とその実行です。
 昔、プログラムの勉強をしていたとき、そのプログラム言語の特徴をつかまえるのに、例となるプログラムを組んでどんなものか試してみました。
 それは、ある整数値を与えたとき、1からその数までの和を求めるというものでした。
 マクロでは、次のように記述します。
 Sub test02()
'入力された数値までの和。10の場合は、10*(10+1)/2=55です。
j = InputBox("整数値を入れてください。例えば  ", , 10)
k = 0
For i = 1 to j  'j回、forからnextまでを繰り返します。
k = k + i
Next i
MsgBox ("1から" & Str(j) & " までの答えは " & Str(k) & " です")End Sub

 今回は、ここまで。 

2007年6月10日日曜日

マクロとは

 第1回目 はじめに及び事例1
 マクロとは、おもに、エクセル上のVBAをもとにして作成したプログラムをいう。 いてみればプログラムのことである。それが何ゆえマクロという呼び名になったのかは不明である。ということで、まずこの名前に違和感を抱く。
 それよりもプログラムといったほうが、できるかどうかは関係ないが、ちょっとでも身近に感じられるのではないか。
 そこで、マクロとは、エクセルでの作業を効率的に行なうための業務専用のプログラムのことと考えておけばよい。
 通常のエクセルでも、さまざまな機能があり、マクロを使わなくても処理が出来ることは事実である。改めてめんどくさいことをする必要がないのではないか、という気持ちが起こるが、なかなか簡単には割り切れないものがあり、また、割り切ってはいけないものである。
 つまり、今後、事務屋の資質の中で、エクセルの通常の操作ができるだけではなく、マクロが使える、ということは重要な事項となるということである。自分の事務屋としての評価にもつながるであろう。
 また、個人にとっても、同じ業務を短時間でできるので、疲れは少なく、残業時間も少なく、自分の自由時間も多く使えることになる。これをこつこつと積み上げていけば、1年、2年…となると大きな自分への財産となることは間違いない。
 能書きはこれくらいで。
 という自分も、マクロを始めて1年ほどでまだ中級下のレベルであるので、このブログでの内容もその程度の内容であるということである。
  【事例1】 時系列的に色々な数値の推移を表した表を作った。同じ形式の表でさらに条件を変えたパターンのものも作っている。(同一シート上にあるとする) 
 そこで業務内容。
 1.一つの表の中にある列をとったとき、時系列的な増減率、増減はどうなっているのか。
 2.別のパターンの表との増減率、増減はどうなっているのか (1、2とも、表の中には、増減率・増減を求めるにはなじまない項目もあると思うが、これまで考慮すると大変なので、表にある全部の項目について増減率・増減を求めてしまうということをする。不要な部分はあとで消せばいい、という気分。) 

=⇒これは通常のやり方でも十分可能である。1回限りであれば、通常のやり方のほうが早くできる。何回も同じような処理が必要であれば、マクロの威力がでる。また、マクロの勉強には手ごろ感がある。
 [ポイント1]
 1.使用するデータの範囲をどのように与えるか。
  たて見出し部分、横見出し部分、数値部分
 2.セル間の計算式が必要となるので、使用するセルをどのように記述するか。
 3.増減率、増減の表を別シートにすると、新しいシートの作り方、また、データのあるシートとの間の移動をどうするか。

 この例題は初級レベルにとっては難易度が高いものである。

 ということで、次からは、初歩から始めます。 


[免責事項]
 このブログに掲載するマクロを使用した際に不具合が生じても、筆者がその責任を負うことはありません。 
 また、紹介するマクロ等に関しても同様です。
 あくまで自己責任でご利用ください。