趣味のエクセルマクロ&数字選択式宝くじ

ナンバーズ4などの数字選択式宝くじデータ分析用の自作マクロおよびナンバーズ4などの各種データリストなどをブログにしています。

マクロ学習法とは 11(静的変数)

Staticで変数を宣言するとマクロが終了しても値が保持されます。
(プロシージャのみで宣言する)


日経パソコンさんに載っていた下記のマクロの場合


Sub Sample1()
   Static Number As Long ''静的変数を宣言する
   Number = Number + 1 ''変数の値を1つ増加させる
   MsgBox Number ''変数の値を表示する
End Sub


 上記のマクロは、実行するたびに変数の値が増加していきます。これは、プロシージャが終了しても変数の値が破棄されないからです。

 静的変数は、プロシージャの中で宣言しなければなりません。モジュールレベル変数やパブリック変数を、静的変数として宣言することはできません。


と記述してました。


(マクロを2回起動させたらメッセージボックスに上の様に1から2に変化しました。)


もっとも、セルに入出力させる値を入れて参照すれば良いと言う人もいますね。
複雑な事をさせなければセルも変数がわりになりますね。


わたしは殆ど使ったことはないですが今後は使って見たいと思います。


(昔、縦に並んだデータを元に横に並べる表を作った記憶があります。)






マクロ学習法とは 10(続・変数)

変数(へんすう)には使い方があるようです。ややこしいですが確認して見ました。


以下で簡単に説明してみましたが詳しい内容は色んなサイトを読んでみてください。
(私には office  TANAKAさんのサイトが分かりやすかったです)


モジュール内に書いてあるマクロをプロシジャーと言う。
モジュール内には複数のマクロも書ける。




1・変数の適用範囲(スコープ)


 (1)プロシジャーレベル変数(プロシジャー内でしか使えない)
   ひとつのプロシジャー(マクロ)内で使用する場合


    ・マクロ内で宣言する (変数を使用する前、最初に宣言)


   
 (2)モジュールレベル変数(各プロシジャーで共通して使える)
   色んなマクロが同じモジュールに有る場合、各マクロで使える


    ・モジュールの先頭で宣言する(マクロ内でなく)



 (3)パブリック変数(各モジュール内で共通して使える)
   複数モジュールがある場合、各モジュールのプロシジャーで使える


    ・Public を変数名の前に付ける



  変数の適用範囲によって変数の使用期間があるようです。


  プロシジャーレベル変数はそのマクロが終われば値は無くなる。


  モジュールレベル変数やパブリック変数も使用期間がありますね。
  (パブリック変数は値が残るので注意する必要があるようです)


  実際のマクロを見て覚えるようにしたのが良いようです。
  (変数の値変化を確認するのが良いようです)


パブリック変数はモジュールが複数ある場合らしいですが、ここではモジュールが1つなのでモジュールレベル変数でも良かったようです。
(他のモジュールでパブリック変数を使うようなマクロが無かったw)


変数の適用範囲が広くなるほど変数の値が分かりにくくなるようです。
私はほとんどでプロシジャーレベル変数を使ってます。



マクロ学習法とは 9(継続)

マクロを学習しようとしても難しくて止めたくなる時もあると思います。
私もレベルが高く難しいマクロは作れません。途中で投げ出したりします。


でも、あきらめずに継続して一歩一歩学習して行くのが大事な気がします。
投げ出しても、気が変わったらまた始めるのが良いと思ってます。


「継続」するにも努力が必要ですが、学習は継続が大切ですね。




上の表で左端から右の赤い矢印のデータのある部分に一気に飛ぶマクロを作りました。
手でマウス操作して目的のデータを探すのが苦痛でしたのでw
(実際は巾の長い表でデータが見えないので探すのが面倒)




最初下のマクロ作りましたが46列まで動きましたがそこから先には行かない。
ねらいとしては、最終的に266列位まで行く必要がありました。


 Sub 右進()
  gyou = ActiveCell.Row ’指定行(マウスで選択した行)
  Cells(gyou, 46 ).Select ’指定行の46列選択
  For i = 0 To 220 ’最大220回繰り返す
    If Cells(gyou, 46 + i) <> "" Then Exit For ’データが有れば終了する
   Next i
 End Sub



良く考えたら飛躍してました。セルの位置を変化させないといけないのにセルの位置が変化して行かないマクロでした。(変化させたいセルを変化出来るようにしないとw)




継続して考えて(3分間位w)、下のマクロに直しました。


 Sub 右進()
  gyou = ActiveCell.Row
  For i = 0 To 220
    Cells(gyou, 46 + i).Select
    If Cells(gyou, 46 + i) <> "" Then Exit For
   Next i
 End Sub


上のマクロは簡単でもひとつづつステップを考えて実行しないといけない例でした。
マクロの構成や仕組など考えても直ぐには分からない時も、継続して考えて行けば何とか分かって作れるようになると思います。