趣味のエクセルマクロ

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

マクロ勉強法とは?

<< マクロ勉強法? >>


 私のマクロ作成スキルのレベルは?多分初級の上位なのか、それとも中級の下位なのか?
自分自身でも良く分かりません。本当に良い加減ですがw マクロ関係資格も持ってないし、あくまでも独学なので、正しいスキルなのかも私にはよく分かりません。



(Excel VBA スタンダードの問題集がほとんど解けないレベルでした orz)
  ----- 結局、動けば良いだろうのイージーさですが(かなり問題?)w



まあ、マクロの作り方は人それぞれでレベルの差がありますが、中々レベルが上がらないのは問題なのでしょうか? 仕事でなく趣味でなら多分全然良いでしょうねww
それで、ブログ名は「趣味のエクセルマクロ」です。



エクセルの手入力作業では、時間が掛かる、ミスがあるとか問題が絶対発生します。


マクロにミスが無ければ?時間掛からない出力結果にミスが無いのが長所です。
(もし、暫くしてミスが出たなら直すのも勉強になりますね。結構多いですw)
それを考えたならマクロを趣味として勉強するのも良いかも知れないですね。


そして、エクセルのメニュー操作からの作業を止めて、マクロと自分自身の頭を使ってより簡単に処理をして欲しいデータを手に入れる手段に出来ますね。




あるブログにプログラミングを勉強するのは目的ではなくて、やりたいことを実現するためのスキルを身に付けるためだと書いてました。(やりたいことを見つけましょうw)



マクロを勉強する目的のひとつは、エクセルでの面倒な処理を簡単にするためですね!
これを考えないで勉強しても続かないでしょうね?ナンバーズやロトの分析をしていると
いくらでも欲しいデータが浮かんで来ます。それを簡単にするためにマクロの勉強が、そこに目的があって、マクロという手段があるのですね。


未熟な私が思うには、やはり、人に教えて貰うのが良いですね。参考書をいくら読んでも多分完璧には書いてないです。(経験済)と言うか書いてあっても初心者には理解できない書き方ですw 


なんで、分かるように書けないのか分かりませんがwもっとも、今はネットで勉強するのが?情報も一杯ですね!(薬師寺さんの Excelマクロ/VBAで始める業務自動化プログラミング入門ブログは参考になりますね。自分も勉強しようと思います!)


  それと「go go エクセルマクロをはじめよう!」は凄く良いですね。
  
  私も最初に Option Explicit とかの変数の宣言とかしないですw
  文章の書き方を覚えても、考え方が出来てないと駄目でしょうね?
  自分の考えをプログラムするわけですから、文章もプログラムかも?



エクセルマクロはマクロ専用命令とVB(ビジュアルベーシック)で出来ています。
それぞれに分けて勉強したのが良いかなと思います。
実際には両方を合わせて作るわけですが?



プログラムの考え方が、人間の考え方と違うのでしょうか?コンピュータに理解させる様に論理的な考えが必要ですね。まあ、でも人間もプログラムで動いているとも言えまね。


前提条件があやふやでも何とかカバーしてしまう。凄い柔軟性と言うか、一定の枠組みがあって無意識に守っている?(大多数の同じ考え方がプログラムと言えるかも知れません)



・私のマクロの作り方ですが、取りあえず、自動記録でマクロを作っています。それをもとに、変化する範囲などを入力して修正しています。どうしても自動記録で出来ない部分を手入力するわけですね。(マクロ関数、変数、条件文、計算式などのVB専有部分等ですが、これらは少しづつ覚えて行くものだと思います)


 自動記録でマクロを作成し、出来たマクロの内容をチェックしても良いですね。
全部分からなくても何となく分かる部分が有りますね。


・ただ単にマクロを勉強したいでは無くて、それで何がしたいかが?最初にはっきりとした目的があれば良いですね。自分は、こうしたいけど、マクロではどうしたら良いかと考えます。(まあ、簡単では無いですが?)


プログラム言語としたなら、言葉の使い方を覚えるのと同じですね。パターン化されてますね。基本はそれを覚えて行くのでしょう。効率的なものを作るのは、アイデアを考える事と同じなんでしょうね?(多分SE的考えで経験も必要でしょうね。)


・コンピュータは論理的な条件しか受け付けないので、その条件を探す作業かも知れない
でしょうね?私は論理が苦手なのですが、この辺はポイントだと思います。
色々と考えて行かなければならないです。


・マクロなどのプログラムの構造は、記憶する部分、計算する部分、入出力部分などで
出来ているのだと思います。人間も同じですね!記憶してないと判断出来ないです。
記憶は変数と言う考えが用意されていて、凄く大事な部分です。



・人の作ったマクロを見て真似る、パクルのも必要でしょうね?習うより慣れろの世界かも知れませんね。最初は易しいマクロを作って見て、次は段々難しのをと言うのが何でも言える事ですね。

イメージとして小さな部品を作って、それをつないで行くような?苦労して、自分が作ったマクロが上手く動いた時は嬉しいですね!オタク感覚かも知れませんね。上手い人はゲームも作れますからw





 ・ゲームと言えば?パチンコみたいなのを作った事があります。 実際の様には行きませんが、内部で抽選して当たりが出たなら色々と処理をする仕様ですww数字が2つ揃ったらリーチをかけて当たるか外れるかですね。



当たったなら、画面がピカピカ光り、グラフに当たった時の回転数が出てくる。最初に画面設計、次に、マクロを作るわけですが、大体のシナリオを考えて行けば良いでしょうね。(私の場合は一気には、中々作れないのでコツコツ修正しながら作りますw)


大当たり判定部分、リーチの当たり判定部分、二つの判定があります。もし、リーチが外れたなら番号を合わせないで止める。リーチが当たったならリーチになるが、3つの数字は当たらないようにする。


大当たりが来たならリーチかけて3つの数字をそろえる。これを、リーチの判定だけで大当たりするマクロで作ります。


最初から全然理解出来なくても、問題は無いと思います。そこしづつ覚えて行く事が大事だと思います。私も記事を書くことで、いろいろ調べて勉強になっています。



上の様に作るために、下のようなマクロを作って見ました。問題はありますが、昔のはもっと複雑なマクロでしたが? 忘れてしまいましたねww(リーチから大当たり判定する)数字部は奇数の場合赤色、偶数の場合は黒色とMOD関数とセルの条件式で設定すると良いでしょうね?



----------------------------------------------------------------------------------------------
Sub pachinko() ’パチンコもどきマクロ 緑文字はマクロ行のコメント(説明)です。
’変数(整数)の設定(出目抽選用、リーチ抽選用、回転数用など)
Dim deme_1, deme_2, deme_3, reachi, reachi_f, kaiten  As Integer
Dim 指定時刻 As Date  

Randomize 'ランダムに乱数を発生させる。

reachi = Int(7 * Rnd) + 1 'リーチの抽選(乱数発生させ Intで1から8までの整数にする)
deme_1 = Int(9 * Rnd) + 1 '出目1の抽選(乱数発生させ Intで1から10までの整数にする)
deme_2 = Int(9 * Rnd) + 1 '出目2の抽選(同上)
deme_3 = Int(9 * Rnd) + 1 '出目3の抽選(同上)

   Cells(5, 3) = deme_1 '出目1を表示     :セル3列目の5行目に
   Cells(5, 4) = deme_2 '出目2を表示   :セル4列目の5行目に
   Cells(5, 5) = deme_3 '出目3を表示     :セル5列目の5行目に  
  Cells(7, 4) = ""  ' 最初、リーチ、残念、大当たりの表示部を消しておく

   If reachi = 7 Then reachi_f = 1 Else reachi_f = 0 '条件式(もし---ならば---する)

 If reachi_f = 1 Then 'リーチの抽選で当たった場合  
    deme_3 = deme_1 '出目3と出目1を同じにする  
    Cells(5, 5) = deme_3 '出目3を表示  
    kaiten = Int(11 * Rnd) + 3 '出目2を何回転させるか決める    

  For i = 1 To kaiten    ’ForからNextの間を1から kaiten回まで繰り返し処理する                       If i = 1 And deme_1 = deme_2 Then Exit For  '最初に出目が揃えば当たり
      If i > 1 Then deme_2 = deme_2 + 1  '出目2を+1づつ変化させる        
      If deme_2 > 9 Then deme_2 = 1  '出目2が9の時次は1にする        
       Cells(7, 4) = "リーチ" ’リーチ中に表示する  
     Cells(5, 4) = deme_2 '変化する出目2を表示    
      指定時刻 = Now + TimeValue("00:00:01")  '現在時刻より1秒後    
      Application.Wait (指定時刻)      'マクロ実行を指定時刻まで中断する    
   Next i      

  If deme_1 = deme_2 Then '出目1出目2出目2同じになったら   
    Cells(7, 4) = "大当たり"
  Else    
   Cells(7, 4) = "残 念"
  End If
Else 'リーチの抽選で外れた場合  
If deme_3 = deme_1 Then  '偶然リーチの状態になったら修正する   
   deme_3 = deme_3 + Int(8 * Rnd) + 1   
    If deme_3 > 9 Then deme_3 = 1  
    Cells(5, 5) = deme_3   
End If
End If
End Sub


図形のテキストボックスにマクロ登録をしてマクロを起動させます。もし、マクロが止まらなくなったらEscキーを押して中止させます。


変数のデータを別のセルに出力することによってミスの発見などが容易になる。
  Cells(5, 4) = deme_2 '変化する出目2を別のセルに全部表示する場合は?   
For i = 1 To kaiten              
 Cells(5+i, 15) = deme_2  ’この部分を追加   
Next i        
15列の6行から下にデータを出力する。


エクセルのマクロ専用命令文は Cells(3,5)と指定時刻 = Now + TimeValue("00:00:01")   Application.Wait (指定時刻)     などだけで、のこりはVBの命令文だけですね。VB部分のほうが簡単な気もします。



---------------------------------------------------------------------------------------------------------
ナンバーズ3の当選番号から

(上のように左右下隣を黄色に塗りつぶすセルが分かっている場合)


  Sub スライド塗布() '斜め(左右下隣)の●を黄色でセルを2ヶ所を塗りつぶす  
  Dim c, l, r As Range’オブジェクト変数(RangeをObject にしても同じセルの設定)  
  Dim  retu ,  gyou  As Integer

 Sheets("すとれ-と").Select '複数のシートがある場合必ず処理シートを選択する。 
retu = ActiveCell.Column '現在選択した列 
gyou = ActiveCell.Row    '現在選択した行   
  
   Set c = Application.Cells(gyou, retu) '現在のセルをオブジェクトcとする
   Set l = Application.Cells(gyou + 1, retu - 1) '次回左のセルをオブジェクトlとする
   Set r = Application.Cells(gyou + 1, retu + 1) '次回右のセルをオブジェクトrとする

If Cells(gyou, retu) = "●" Then  '塗りつぶす処理  
  If Cells(gyou + 1, retu - 1) = "●" Then '次回が左のセルの時    
    c.Interior.Color = 65535 ’セルの状態(黄色に塗りつぶした)    
     l.Interior.Color = 65535    
  ElseIf Cells(gyou + 1, retu + 1) = "●" Then '次回が右のセルの時   
    c.Interior.Color = 65535     
    r.Interior.Color = 65535  
 Else '次回の両脇のどちらかのデータが無ければ塗りつぶしの処理をしない。           End ’マクロ終了させる  
End If   
End If
End Sub


上のマクロを作りましたが、まだ完成では無いです。たとえば出目が0から9に、9から0になった場合も塗りつぶしますが?この場合は複雑ですが、セルの列位置から判断するのでしょうかね?
このような場合、必要なのは仕組づくりの力ですね!いくら、VBAの知識を身につけも、仕組作りの方法を身に付けないと、出来ないと思います。


どんな仕組みを作るか?そのためには、どんな条件が必要か?すべての条件(成立条件、制約条件)を考えて行けば良いのだと思います。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

出目が0から9に、9から0になった場合も考えて下のマクロを作って見ましたが?
(ここで両隣の出目9と0はスライドとして考えず、跨って塗りつぶさないとします。)


ちょっとおかしいですが、これで良いのかは分かりませんが、テストして問題なく動けばw、今までは、1個づつ塗りつぶしてましたが、これからは2個づつです。そして、間違って塗りつぶすことも無くなります。(本当に人間は間違いをしますがw)


Sub スライド塗布2() '斜めの●を黄色で塗りつぶす(最初のセル指定後2ヶ所)
  Dim c, l, r As Range’オブジェクト変数(RangeをObject にしても同じセルの設定)
   Dim deme, retu_iti As Integer
    Sheets("すとれ-と").Select
     retu = ActiveCell.Column '現在の列
     gyou = ActiveCell.Row    '現在の行
     deme = Cells(3, retu)  '現在の出目(3行目にデータがあるとします)
 If Cells(gyou, retu) = "●" Then
      Set c = Application.Cells(gyou, retu) '現在のセルをオブジェクトcとする
 Else
      End
 End If  
If deme = 0 Then '最初の出目が0の時
If Cells(gyou + 1, retu + 1) = "●" Then '次回出目1
Set r = Application.Cells(gyou + 1, retu + 1)
c.Interior.Color = 65535
r.Interior.Color = 65535
ElseIf Cells(gyou + 1, retu + 9) = "●" Then '次回出目9
Set r = Application.Cells(gyou + 1, retu + 9)
c.Interior.Color = 65535
r.Interior.Color = 65535      
End If  
ElseIf deme = 9 Then '最初の出目が9の時  
If Cells(gyou + 1, retu - 1) = "●" Then '次回出目8
      Set l = Application.Cells(gyou + 1, retu - 1)
     c.Interior.Color = 65535
     l.Interior.Color = 65535   
ElseIf Cells(gyou + 1, retu - 9) = "●" Then '次回出目0    
     Set l = Application.Cells(gyou + 1, retu - 9)  '次回左のセルをオブジェクトlとする
       c.Interior.Color = 65535
       l.Interior.Color = 65535
End If
Else  '出目が0や9でない時
If Cells(gyou + 1, retu - 1) = "●" Then
       Set l = Application.Cells(gyou + 1, retu - 1)
       c.Interior.Color = 65535
        l.Interior.Color = 65535    
ElseIf Cells(gyou + 1, retu + 1) = "●" Then
     Set r = Application.Cells(gyou + 1, retu + 1)
       c.Interior.Color = 65535
        r.Interior.Color = 65535
Else '次回の両脇のどちらかのデータが無ければ塗りつぶしの処理をしない。
       End    
End If
End If
End Sub
テスト結果おかしい箇所がありました。よくよく条件を考えたなら?1.最初のセルは●であること、数字は受け付けないこと。(ミス防止の為)2.次行の左右セルも●であること、ただし、出目09の場合は都度変わる場合もある。


これらを整理して条件を作成してマクロを作ります。私の場合は、取りあえず適当に作って動かして直して行くので、問題がありますがw
(動かさないと、逆に問題が分からないと言うこともあるので仕方無い面もある。)

マクロ作成前の仕組づくり(ミス防止、条件把握)が大事なんだと言うことでしょうね?  この辺は経験が必要で失敗しないと分からない部分ですね。


      c.Interior.Color = 65535        
      r.Interior.Color = 65535等の共通部はサブプログラムとしてスッキリさせたのが良いかも知れませんね?(この場合はオブジェクト変数の扱いに注意が必要になると思います。)


4400行の30列のデータを最初から処理する場合には?上記の式をさらに改造します。
Do Until----Loop と   For----Nextを組み合わせてですが?作って見たいですね。

 Sub 最初から処理()   
 Do Until 最初から最後のデータまで (行で動かして)     
 For i=1 to 30  (1列から30列で動かして)                   
    上記の式(行と列を変化するように改造して)    
   Next i   
Loop  
End sub

まあ、簡単には作れない感じがしますが?作れるようになればマクロの凄さは感じられると思います。
----------------------------------------------------------------------------------------------------------- 
For---Next と Do Until---Loop を使ってのマクロ自動処理 (塗りつぶすセルが分かって無い時---マクロで判断させる)

                                        ↓

悪戦苦闘して、何とか作って見ましたw マクロを見ると非常に簡単ですが?
 
  sg = dg  データ行を処理行とするのがポイントでしょうね?( 30列4400行のスライド塗りつぶし処理が以下のマクロ実行後10秒で出来ました。)


Sub 全スライド塗布() '斜めの●を上の様に全部(データの最初から最後まで)塗りつぶす      Dim c, l, r As Range’オブジェクト変数(RangeをObject にしても同じセルの設定)
 Dim deme, dg, sg, i As Integer
 Sheets("すとれ-と").Select 
For i = 16 To 45 '16列~45列迄を下の処理を繰り返す。(p列からAS列まで)               dg = 4: sg = 0 ’4行目から処理をするため dg = 4とした。
 Do Until Cells(dg, i) = ""  'データの最後まで---""はデータが無い状態   
  If Cells(dg, i) = "●" Then ’i列のdg行が●の時   
    sg = dg  'データ行を処理行とする。  
 deme = Cells(3, i)   '現在の出目を設定する  
 Set c = Application.Cells(sg, i)   '現在のセルをオブジェクトcとする 
 End If     
If deme = 0 Then '最初の出目が0の時  
   If Cells(sg + 1, i + 1) = "●" Then '次回出目1  
      Set r = Application.Cells(sg + 1, i + 1)  
   c.Interior.Color = 65535  
   r.Interior.Color = 65535 
 ElseIf Cells(sg + 1, i + 9) = "●" Then '次回出目9  
 Set r = Application.Cells(sg + 1, i + 9)  
 c.Interior.Color = 65535  
   r.Interior.Color = 65535  
End If
ElseIf deme = 9 Then '最初の出目が9の時 
 If Cells(sg + 1, i - 1) = "●" Then  '次回出目8   
  Set l = Application.Cells(sg + 1, i - 1)  
 c.Interior.Color = 65535  
 l.Interior.Color = 65535  
ElseIf Cells(sg + 1, i - 9) = "●" Then  '次回出目0  
 Set l = Application.Cells(sg + 1, i - 9)   '次回左のセルをオブジェクトlとする            c.Interior.Color = 65535  
 l.Interior.Color = 65535  
End If 
Else  '出目が0や9でない時 
  If Cells(sg + 1, i - 1) = "●" Then   
   Set l = Application.Cells(sg + 1, i - 1)  
 c.Interior.Color = 65535  
 l.Interior.Color = 65535  
ElseIf Cells(sg + 1, i + 1) = "●" Then   
 Set r = Application.Cells(sg + 1, i + 1)   
  c.Interior.Color = 65535  
 r.Interior.Color = 65535  
End If 
End If    
dg = dg + 1 'データを+1行づつ処理する為のカウンター。   
If dg > 5000 Then Exit Do ’マクロのストッパー 
Loop
Next i
End Sub

最初に全データの塗りつぶしを、塗りつぶし無しにしてからマクロ実行すればミスは0になりますね。マクロに塗りつぶし無しの命令を自動記録で追加で入れても良いですね。

間違って塗りつぶしを全部消してしまった時を考えたなら、このマクロも意味がありますねw(マクロ処理なら時間は関係ないのに、手での操作処理は溜息出ます)


<自動記録マクロについて>

自動記録で黄色で塗りつぶすと色々と複雑なマクロが出来て来ますが?


Option ExplicitSub Macro1()
With Selection.Interior
 .Pattern = xlSolid 
.PatternColorIndex = xlAutomatic
 .Color = 65535 .TintAndShade = 0 
.PatternTintAndShade = 0End With
End Sub 

ここでは   With Selection.Interiorの.Interiorと  .Color = 65535だけを取り出して使っています。   c.Interior.Color = 65535などですね。
取りあえず自動記録で作って、いらない部分を省いて、動くまで修正して行くわけです。



<変数について>


プログラムには変数が出て来ますが、人間で言えば多分、記憶に近いものでしょうね?
(記憶を忘れない様に書いていくメモ帳みたいなものが変数?)


記憶があるから人間生活が送れるので、コンピュータも同じような事をしているのかも知れないです?(記憶も思い出せないと問題ですが、人間は忘れてしまいますw)


マクロでは記憶装置として、変数を使いますが人間の様にあやふやでは無くて規則があって、その規則を覚えて行けば良いわけですね。面倒ですがw
(変数の型(タイプ)、有効範囲(スコープーー変数の適用範囲、時間)、配列変数etc)


変数と言う記憶装置に記憶させる。そして、記憶を加工したり、取り出したりして利用する。最初に、コンピュータや人間に分からせるために名前や条件を付けて判別して行くのでしょうか?(人間が使ったものですから色々あるのでしょうね?)

変数が無かったなら複雑なマクロも作れず、面倒になってしまいますね。私も変数については完璧では無いですが、絶対的にマスターすべきスキルですね!


エクセルではセルも変数の代りとして使えるでしょうが?複雑になると参照するのが大変ですね。私は、簡単な場合で数字だけの場合使っています。


・変数の有効範囲でサブプログラムに値を渡す場合は、先頭に変数を宣言します。
---------------------------------------------------------------------------
Dim c, l, r As  Range’オブジェクト変数(RangeをObject にしても同じセルの設定)
Dim c_frg As Integer  'フラグ用変数
Option Explicit
----------------------------------------------------------------------------
Sub スライド塗布2k() '斜めの●を塗りつぶす
   Dim retu, gyou, deme As Integer  
Sheets("すとれ-と").Select
 retu = ActiveCell.Column '現在の列
 gyou = ActiveCell.Row    '現在の行
 deme = Cells(3, retu)  '現在の出目
 If Cells(gyou, retu) = "●" Then
   Set c = Application.Cells(gyou, retu) '現在のセルをオブジェクトcとする
 Else
   End
 End If
If deme = 0 Then '最初の出目が0の時
 If Cells(gyou + 1, retu + 1) = "●" Then '次回出目1
  Set r = Application.Cells(gyou + 1, retu + 1)
  c_frg = 1  '色付け用フラグを1にする
  Call irotuke 'サブプログラム irotuke 呼び出す
 ElseIf Cells(gyou + 1, retu + 9) = "●" Then '次回出目9
  Set r = Application.Cells(gyou + 1, retu + 9)
  c_frg = 1  '色付け用フラグを1にする。
  Call irotuke 'サブプログラム irotuke 呼び出す
 End If
ElseIf deme = 9 Then '最初の出目が9の時
 If Cells(gyou + 1, retu - 1) = "●" Then '次回出目8
     Set l = Application.Cells(gyou + 1, retu - 1)
    c_frg = 2 '色付け用フラグを2にする。
    Call irotuke 'サブプログラム irotuke 呼び出す
 ElseIf Cells(gyou + 1, retu - 9) = "●" Then '次回出目0
    Set l = Application.Cells(gyou + 1, retu - 9)  '次回左のセルをオブジェクトlとする
    c_frg = 2 '色付け用フラグを2にする。
    Call irotuke 'サブプログラム irotuke 呼び出す
 End If
Else  '出目が0や9でない時
 If Cells(gyou + 1, retu - 1) = "●" Then
    Set l = Application.Cells(gyou + 1, retu - 1)
    c_frg = 2 '色付け用フラグを2にする。
   Call irotuke 'サブプログラム irotuke 呼び出す
 ElseIf Cells(gyou + 1, retu + 1) = "●" Then
    Set r = Application.Cells(gyou + 1, retu + 1)
    c_frg = 1  '色付け用フラグを1にする。
    Call irotuke 'サブプログラム irotuke 呼び出す     
 Else '次回の両脇のどちらかのデータが無ければ塗りつぶしの処理をしない。
    End    
 End If 
End If
End Sub
----------------------------------------------------------------------------------------------
Sub irotuke() '色付けサブプログラム
 c.Interior.Color = 65535  '共通部分の処理
 If c_frg = 1 Then r.Interior.Color = 65535 '色付け用フラグを1の時の処理
 If c_frg = 2 Then l.Interior.Color = 65535 '色付け用フラグを2の時の処理
End Sub
-------------------------------------------------------------------------------------------------
c_frg = 2 '色付け用フラグを2にする。
Call irotuke 'サブプログラム irotuke 呼び出す
上の 式を
  c_frg = 2: Call irotuke と:を入れて繋いで書いてもOKですね。
-------------------------------------------------------------------------------------------------
サブプログラムを2つ作って処理する場合は変数 c_frg  はいらない。
Sub irotuke_r() '色付けサブプログラム1
 c.Interior.Color = 65535  '共通部分の処理
  r.Interior.Color = 65535    
End Sub
 --------------------------------------------------------------------------------------
Sub irotuke_l() '色付けサブプログラム2
 c.Interior.Color = 65535  '共通部分の処理
 l.Interior.Color = 65535
End Sub
-------------------------------------------------------------------------------------------------


マクロは出来るだけ分かりやすく、処理が早くなるようにシンプルさが大事ですね。
まあ、最初は動けば良いと言う感じが大事らしいです。
ミスはつきものなので、ミスが直ぐ分かる様にするのも大事ですね。

これまで書いてきたマクロは100%正しいかは分かりませんが、一応動くので私なりには正解と思ってますがw(エラーが出たら直せれば良いですw)


プロ的な人から見たならおかしいところがあると思います。取りあえず、手動で操作するより、趣味でのマクロで操作出来れば良いわけですね。


・配列変数
変数が100個も必要な時に、100個も宣言するのは大変です。 と言うか管理が出来ないでしょうね?私の場合ですがw 配列変数を使うことで何とかなりそうです。


Sub pachinko2()
Dim deme(3) As Integer  ' deme(3)の様に表示されるのが配列変数0~3の4個の値が入る
Dim reachi, reachi_f, kaiten, i As Integer
Dim 指定時刻 As Date
 Randomize
 reachi = Int(7 * Rnd) + 1 'リーチの抽選(1から8までの乱数発生させる)
For i = 1 To 3 ’deme(i) にはdeme(1)、deme(2)、deme(3)
 deme(i) = Int(9 * Rnd) + 1 '出目1の抽選(1から10までの乱数発生させる)
 Cells(5, i + 2) = deme(i) '出目1,2,3を表示
Next i
 Cells(10, 4) = ""
 Cells(7, 4) = ""  
 If reachi = 7 Then reachi_f = 1 Else reachi_f = 0
 Cells(10, 4) = reachi_f
If reachi_f = 1 Then 'リーチの抽選で当たった場合
 deme(3) = deme(1) '出目3と出目1を同じにする
 Cells(5, 5) = deme(3) '出目3を表示
 kaiten = Int(11 * Rnd) + 3 '出目2を何回転させるか決める    
For i = 1 To kaiten          
If i = 1 And deme(1) = deme(2) Then Cells(5, 15) = deme(2): Exit For  '最初に出目が揃えば当たり     
If i > 1 Then deme(2) = deme(2) + 1 '出目2を+1づつ変化させる      
If deme(2) > 9 Then deme(2) = 1 '出目2が9の時次は1にする      
Cells(7, 4) = "リーチ"
Cells(5, 4) = deme(2) '変化する出目2を表示
指定時刻 = Now + TimeValue("00:00:01")  '現在時刻より1秒後
Application.Wait (指定時刻) 'マクロ実行を指定時刻まで中断する
Cells(10, 12) = kaiten      
Next i      
If deme(1) = deme(2) Then '出目1出目2出目2同じになったら
Cells(7, 4) = "大当たり"
Else
Cells(7, 4) = "残 念"
End If
Else 'リーチの抽選で外れた場合
If deme(3) = deme(1) Then  'リーチの状態になったら修正する
 deme(3) = deme(3) + Int(8 * Rnd) + 1
 If deme(3) > 9 Then deme(3) = 1
 Cells(5, 5) = deme(3)
End If
End If
End Sub

配列変数は6段階まで設定出来る様ですが、複雑ですね。deme(3,3,3,3,3,3)?
私は2段階までしか使った事が無いですが、deme(3,3)なら分かりやすいですね。

・配列変数の使い方(変数へ入出力)------変数A(4,4)
下の表のデータを上から右に向かって16個を変数に入れる場合(例)
Sub データ入力()
 Dim A(4,4),i,j As Integer 
 For i=1 to 4
     For j=1 to 4
        A(i,j)=cells(i,j) ----- 最初はcells(1,1)-----最後はcells(4,4)
    Next j
Next i
End
   配列変数に入る値
    A(1,1)=10    A(1,2)=20    A(1,3)=30   A(1,4)=40
       ---------------------------------------------------------------
        A(2,1)=11    A(2,2)=21    A(2,3)=31   A(2,4)=41
   ----------------------------------------------------------------
        A(3,1)=12    A(3,2)=22   A(3,3)=32    A(3,4)=42
    ---------------------------------------------------------------
        A(4,1)=13    A(4,2)=23    A(4,3)=33   A(4,4)=43
       ---------------------------------------------------------------
       但し、A(0,0)は使わないとした時

データの入った変数から順番に取り出す場合もFor~ Nextを使うこともあります。


・マクロミスについて
 今まで問題も無く動いていたマクロがエラーを出しました。何とか問題点と解決策を思いつきましたが?見えない問題点を最初から把握するのは中々厄介ですね!


たとえばあるセルにデータがあるとしてマクロを作って動かした場合、何等かのことで、そのデータが無い場合、多分ミスになります。マクロではデータが無い場合何らかのメッセージを出すようにすればミスが出てあわてることは無くなります。

 マクロにミスが無くても、計算で出した答えにミスがあることがあります。気づかなければそのままですw この場合マクロでチェックするように考えておけば良いですね。


上のデータで4443が全部同じなら良いのですが、もし違ったならマクロでチェックしてメッセージを出すようにします。

kaigot = 0
For k = 1 To 12 Step 2   'Step 2で2個おきに
     kaigot = kaigot + Cells(k + 129, 26)  ’6つの4443のところのデータの合計を出す   
Next k     
   If Cells(130, 26) <> kaigot / 6 Then MsgBox ("入力ミスがあります")    


  <>は左と右の値が違うことを表しています。
    一番上の4443に合わない場合入力ミスと見なします。


ナンバーズなんかの記録をしていると、毎日増えて行くデータなので設定している変数が足りなくなることがあります。足りなくなった時にミス発生しますw


多目に設定しておくか、無くなりそうなタイミングでのメッセージを出すとかですかね?突然のエラーは設定値とデータの関係から多いと思います。もっとも、エラー対応は実力養成に本当は良いかも知れないですw

プロの作ったシステムもエラー起こしますから、エラー起こさないように完璧に作るのは不可能に近いのでしょう。


私はエラー発生時の対応をしていないのですがw以下の式をマクロの中に入れた事があります。もっと実用的な方法もあるようです。

On Error GoTo errorcheck 
マクロのコード(プログラム)
Exit Sub
errorcheck:
MsgBox "エラー番号" & Err & ":" & Error(Err): End


マクロでは、エラーは避けられないものだと思っています。エラーが起きたら対処出来れば良いわけだと思います。案外単純ミスほど気が付かない場合がありますね。


テキストで何十桁から出来ているデータを分解して、目的のデータにして処理する場合に
問題が出ました。数字を処理するさいエラーになりました。


最初からエラーが起きたわけでなくて突然エラーですw テキストから分解した後、見た目は数字ですが文字になっていたわけですね。数字として使用する前に文字を数字に変換する式を入れて直りました。
 
最初からエラーを起こせば、おかしいと分かりますが?まあ、私のスキル不足ですねw
色々と、エラーの経験をすればマクロ作成スキルはアップすると思います。


・難しい処理を覚える前に、とにかく何でも良いから簡単なマクロを作って便利さを体感して行くのが楽しいですね。

自動記録で作ったマクロですが、簡単ですね。最後当選シートを作っておいて選択するだけですから。マクロ名も記録時に変更しています。

 Sub 最後当選へ()
    Sheets("最後当選").Select
 End Sub
 シートが20もあるとしたら、マクロでシート選択するのも効率が良いですね。
   複数のシートが有る場合には、必ずマクロを実行するシート名を設定してない場合、ど  
 のシートでもマクロが実行可能なのでデータが上書きされたりします。
 必ず実行シートをマクロの中に設定する必要がありますね!


・マクロとパソコン性能の関係

パソコンの性能が良かったらマクロの実行速度は少し速くなります。だから、性能の高いパソコンが良いかも知れません。でもエクセル自体にマクロを速く処理する機能は無いようです。


私のパソコンは性能が良くないですw 4400行のデータを処理するのには少し時間が掛かります。
ここで、考えるのはマクロを改良して少しでも実行速度を早く出来ないかと言うことです。最初から性能の高いパソコンでは考えが及びませんね。

マクロの実行速度を早くさせるにはどうしたら良いか?を考えるのも大事な事ですね。


たとえば、再計算をするの状態でマクロ実行した場合、極端な話、動きません。
40行なら良いでしょうが?4000行ではお手上げです。
自動記録マクロで再計算OFFと再計算ONを作っておいて使うようにしています。


・簡単なマクロで
ちょっとした面倒な操作でも簡単なマクロで、エクセル操作が楽になることがありますね。簡単なマクロも馬鹿には出来ないです。

その前に面倒だと気が付かないとマクロを作ろうと思いませんから、まずは面倒な事を探して行くと良いかも知れないですね?


たとえば3つのシートに同じ処理をする場合、マクロで1つのシートで処理をして他の2つのシートにも反映されるようにします。
この場合は関数では無くてマクロで同時に3つのシートに同じ処理をすると言うことですね。具体例としては、ロト6やミニロトのホットナンバーの色付に使っています。


そんなに簡単なマクロでは無いかも知れませんが、考え方は簡単だと思います。そして、簡単なものの積み重ね組み合わせの上に複雑なものがありますから基本は簡単なものからマスターすることが大事だと思います。


・複雑なマクロで
複雑なマクロを組む前に、仕組作りが分からないと結局先に進むのが出来なくなりますね。仕組作りは多分からくり人形と同じで、色んな要素や関連が働いています。


自分が欲しい結果に対して、どんな仕組みを作って行ったなら良いか考えることですね。
そして、その仕組みが出来る様に色んな条件を探して行く作業かもしれません?

隠された条件が見つからなかったら数式は出来ずにマクロも組めないかも知れません。


シナリオと同じでスタートから次の展開が、そして最後の結末を?マクロを作る前に
文章にして行く作業かも知れません。


文章も前後の関連がおかしかったなら成立しないように、そこには論理があるわけですね。同じようにマクロにも論理的に成立しないのはエラーになります。


私は試行錯誤して作ってますが?完璧を考えたなら前に進めないので、トライアンドエラーを繰り返しています。難しく考えなくても良いのは趣味としてのエクセルマクロだからですねww


マクロの処理は データ入力 → 計算 → 結果出力 でそれぞれ最適を狙いマクロを
考えることですね。まあ、最初から完璧はありませんから簡単に作って後からなおすのが
私の方法です。色々問題も出て来ますが趣味なのでOKですねw




<本当のマクロ勉強法とは>


結構面倒なことを書いて来ましたが、本当はマクロ勉強法でなくてマクロ使用法が知りたいです。(使用するために勉強するのですがw、マクロでどんな事が出来るのかなども)

その為に、こうやれば、こうなって、こうなるから、こうするんだよ!を理解するのではなくて?ただただ、マクロの例文を暗記すれば良いわけだと思います。なぜなら多分最初からは理解不能です。習うより慣れろですねww 


参考書のマクロをパソコンに入力して、動かして見る。まず、習うより慣れろです。
一部を変えたらどうなるのか?関連などをつかむ為の試行錯誤も必要かと思います。
数多く、単純な作業を繰り返してマクロの形を掴むのが大事だと思います。



<自動記録マクロで作成>

自動記録でマクロを作ります。たとえばあるセルの内容を別のセルにコピーするを記録します。この自動記録マクロではいつも同じ事しか出来ません。
そこで、自由に選んだ先のセルにコピーするように変えて行きます。


Sub セルコピー() ’A1セルの内容を任意のセルにコピーするマクロに変更する。
 Dim 行, 列 As Integer ’変数指定(整数)
  行= ActiveCell.Row ’任意に選んだ行位置を変数に入れる。
  列= ActiveCell.Column’任意に選んだ列位置を変数に入れる。
    Range("A1").Select
    Selection.Copy ’A1をコピー元にする
      Cells(行, 列).Select ’任意に選んだセルを指定する。コピー先です。
    ActiveSheet.Paste  ’任意に選んだセルにコピーする。
End Sub


  セルを任意に選択した後にマクロを実行すると、選択セルにコピーされる。





<マクロ---プログラム>

 プログラムとはなんでしょう?マクロでプログラムを作る目的は楽に正しく結果を出す  
 為でしょうね? 楽にするため苦労してマクロを覚えるw

 ある程度は苦労して覚える必要があります。データを加工する作業を考えることが最  
 初のステップですが?作業を具体的に紙に書いて行けば良いと思います。


 どんな出力結果が欲しいのか?その為にはどんな処理をしなければならないのか?
 その処理で必要な知識は何か?等々。
   作業をもとにマクロにする前に作業から計算式見たいなものが見つかれば良いですね。
 

  For j = 1 To 4 '4つの出目の配列変数への入力(4回繰り返す)
   hit(i - 1, j) = Cells(i, j + 17)
  ここでjが0~9の出目に対応してます。計算式 j + 17ですね。

  セルの17列を出目0に、ひとつづつ増えた列( j + 17)に対応してますね。
    計算式の出来ない場合は、作成は面倒ですね。条件を探してそれにあった式を何通りも 
 作らなければならないでしょうね? 単純化するのが良いですね!
   単純化するのは単純では無いですw アイデアとか考えて行く必要があります。


 

 
 エクセルはセルと言う 座標で計算しますから、マクロでもセルの座標が基本でそのセ  
 ル の位置からデータを持って来て、計算し結果を 自分で選んだセルに出します。
 座標は行と列で表しているので簡単ですね。


   マクロの中のVBA部分でA=A+1の式を見ておかしいと言う人が多いと思いますが?
 これは数学的な式では無くて、変数Aに+1をすると言う意味ですね。
 勿論、マクロなどのプログラミングには数学的な考えは必要ですね。
 私は数学が大の苦手なのですが、簡単なマクロなので何とかなってますww


 
<マクロ---参考書> 

 私は、マクロの参考書を一杯買いましたw 作り方全部書いてないですからね。

 ものすごく易しく書いた内容の参考書と少し難しく書いた参考書が有れば?
 両方を読めば良いのかも知れません。挫折しそうになった時は易しい方を?
 でも易しい方をマスターしても複雑なマクロが出来る様にならないですね。

 マクロの本は高いので本屋で立ち読みで良いと思います。きりがないですからw
 その場合は知りたいことは何かを知っておかなければなりませんが?

 
  
  
   


 <パソコンスクール>
 
 アビバでも教室で受講出来ますね。最低でも10万位は掛かりそうです。
 でも、私は独学なので何か抜けているような気がしますので受講してみたいですw


 ネットでの他のスクールもあるので、こちらのが安いようですね。
 以前、問い合わせた事がありますが?スクールのレベルは不明でした。