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

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

マクロ学習法とは 6(変数)

変数(へんすう)はマクロの中に良く出る言葉ですね。値を入れるものです。


一旦、変数に値を入れておき、あとから利用したりもします。何回も利用する時も変数に
入れておけば便利です。



数行の簡単なマクロには変数の設定(Dimで始まる)をしなくても問題は無いようです。
私も設定しない時も結構あります。


もの凄く長いマクロや複雑なマクロでは変数設定は必要かも知れませんが?
私のスキルでは難しいマクロは出来ないので余り考えないですw


でも、一応変数の設定はするようにしています。(矛盾点w)


変数は箱やメモ帳みたいなものですね。メモ帳が一杯ある時に分からなくならないように
メモ帳に名前を付けます。名前が変数名になります。


変数を使っても Dimで始まる変数設定をしなくても問題はないので気楽です。
大体、変数には数字が入るので数字のはいる時に使います。(私の作ったマクロの場合)


Sub 入力へ()
actsheet = ActiveSheet.Name
    If actsheet = "原本" Then
       retu = 12: w = 4: h = 0
    ElseIf actsheet = "すとれ-と" Then
      retu = 47: w = 3: h = 1
    End If
       jp = Cells(1, retu) + 3 + h
      Cells(jp, w).Select
End Sub
 上のマクロで変数はactsheet、retu、 jp 、 w、 h 等ですが変数の設定はしてませんが
問題無いですw



変数のイメージで箱を考えたなら単独とグループがありますね。

たとえば変数(1)が値が1個入る場合で私は一番多いです。


変数gyou   gyou=ActiveCell.Row      gyouに行数を入れる(メモ帳に書く)



変数(1)や(2)は変数をグループにして使うときのイメージですね。


num(8)  numのグループ(0から8までnum変数9個必要なとき)
(num(8) はBINGO5の記事で使っています)


変数については、やはり、習うより慣れろで覚えて行くのが良いです。


変数については.「エクセルメモ」「マクロ学習法とは?」などにも書いております。

マクロ学習法とは 5(関数)

ワークシート関数で出来る事をマクロで作るのは無駄な事らしいです。
いやマクロでは出来ないこともあるようです。


だから、マクロと同時にワークシート関数もマスターして行く事が大事です。


たとえば、IF関数をマスターすれば、マクロで使うIFを理解する上で楽になります。



エクセルの学習順序では下の様に段階を踏んで行くのが良いですね。



私自身、知らない関数の使い方も多いのであらためて学習したいです。





マクロ学習法とは 4 (仕組作り)

マクロを覚えようとして、その前に理解出来なければ覚えられないと言う人がいると思います。でも私の経験で言えば理解するのは困難な気がします。
(ただ単に、マイクロソフトでマクロでの決め事を作っただけですから?)


習うより慣れろ、理解するより覚えろがマクロを学ぶ上で大切な事だと思います。


それと同時に「仕組みを作る」と言うことが凄く大事な気がします。



仕組を作るとは何なのか?


一言で言えばアイデアを考えて行くことだと思います。その為に良く考える。
処理を問題なくするには?どんな処理があってどんな順序でするとか?
自分が望む結果を得るための処理ステップをハッキリさせておきます。



赤に緑の書式コピーする場合、緑を手動選択後 「書式コピー」 マクロ実行をしています。(ツールマクロですが syosikicopy)
でも赤から緑まですごく離れていたら緑に行くのが面倒ですね!


仕組を考えたなら
          赤選択後マクロ実行で良いですね!(マクロ syosikicopy2)


楽に処理出来る様に考える事が仕組作りだと思います。
仕組も論理的に考え矛盾が出ないようにすることが前提になりますね。


もっと複雑なら、自分が望む答えが出るように、答えを導き出す関係を全部パターン化してマクロを作るのが良いと思います。(成立条件や制約条件かも知りませんが?)


上手くマクロが出来ない、動かないのは仕組が間違っていることが多いです。
一歩づつ段階を踏んで、マクロを作って行くのが大事だと思います。


Sub syosikicopy() '下に向かい書式コピー  緑の書式を赤にコピーする。
Dim gyou, retu, i As Integer


 gyou = ActiveCell.Row
 retu = ActiveCell.Column


    Selection.Copy
   
  i = 1
 
 If Cells(gyou + i, retu) <> "" Then '次行にデータある場合
    Cells(gyou + i, retu).Select
  
 Else '次行にデータない場合
 
   Do Until Cells(gyou + i, retu) <> ""
 
       i = i + 1
    Cells(gyou + i, retu).Select
      If i > 30 Then Exit Do
   Loop
   
 End If
    Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
        SkipBlanks:=False, Transpose:=False
    Application.CutCopyMode = False
End Sub



--------------------------------------------------------------------------------



Sub syosikicopy2() ' syosikicopyのマクロを使いやすくした
Dim gyou, retu, i As Integer


 gyou = ActiveCell.Row
 retu = ActiveCell.Column


i = 1
    Do Until Cells(gyou - i, retu) <> ""
 
       i = i + 1
    Cells(gyou - i, retu).Select
      If i < -30 Then Exit Do
   Loop


 Cells(gyou - i, retu).Select
   Selection.Copy
 Cells(gyou, retu).Select
 
  Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
        SkipBlanks:=False, Transpose:=False
    Application.CutCopyMode = False
 
End Sub


良く考えたなら、まだまだ改善の余地が有りそうです。手入力は時間が掛かる上にミスの原因になります。マクロでミスはマクロ作成ミスで手入力より少ないような気がします。
(今は数字の自動入力等を追加しました。)





たとえば4994回に0248のどれかの出目が出たら●を赤色にする。
間隔を入れる。(0が出なかったら●を2にする)
これらをマクロで処理する。


マクロ ptn_haritukeは失敗に  マクロ ptn_harituke2に改造 



Sub ptn_harituke() '飛び間隔用での出目を表示する
  Dim gyou, i, c_frg As Integer
  Dim deme(4), ima, mae As Variant
 
 Sheets("box飛").Select
 
 For i = 0 To 9
 Cells(1, 16 + i) = i
 
 Next i
 
 On Error GoTo Erachek 'とりあえずエラーで逃げる
 
 gyou = ActiveCell.Row
 
 For i = 1 To 4
 
   deme(i) = Cells(1, 10 + i) '当選番号の出目をストレート順に格納
   c_frg = Cells(gyou + 1, 16 + deme(i)) '当選出目の下にフラグを立てる。
  
   If c_frg = 0 And Cells(gyou, 16 + deme(i)) = "●" Or c_frg = 0 And Cells(gyou, 16 + deme(i)) = "◎" Then
  
    Cells(gyou, 16 + deme(i)).Font.Color = -16776961
  
    Cells(gyou + 1, 16 + deme(i)) = 1
     
    Else
   
     Cells(gyou, 16 + deme(i)) = "●"
    
     Cells(gyou, 16 + deme(i)).Font.Color = xlThemeColorLight1
   
     Cells(gyou + 1, 16 + deme(i)) = 1
  
   End If


 Next i
 
   For j = 0 To 9
  
   If Cells(gyou + 1, 16 + j) = 0 Then
   
     mae = Cells(gyou - 1, 16 + j) '前行の値入れるns  mae
   
     ima = Cells(gyou, 16 + j) '今行の値いれる ms ima
 
   
     If ima = "●" Or ima = "◎" Then
       If mae >= 0 Then
   
         Cells(gyou, 16 + j) = mae + 1
        
       Else
         If mae = "●" Or mae = "◎" Then
        
             If ima = "●" Or ima = "◎" Then Cells(gyou, 16 + j) = 1
         End If
       End If
     
     End If
    
     End If


  Next j


Erachek:
  Exit Sub
End Sub
---------------------------------------------------------
上のマクロ ptn_haritukeは考え方がまとまらずに上手く行かず。


ひとつづつ処理をして段階的に考えて下のマクロ ptn_harituke2に改造 
(色んな条件を一度に実行しても上手く行かなかった----ミスの原因に成っていたw)


作ったマクロを使って行くうちに、色んな不便な面が分かって来たら仕組作りを見直す時ですね。この辺はマクロを作って直ぐには分からないので、完全なマクロは不便な面を改良して出来るのかも知れません。


Sub ptn_harituke2() '飛び間隔用での出目を表示する 改造  If IsNumeric(Cells(i, 1).Value) = True Then ~ IsNumericで数字か文字を判断


Dim gyou, i, ii, deme(4) As Integer
 Sheets("box飛").Select
  For i = 0 To 9
 Cells(1, 16 + i) = i
 
 Next i
 
 On Error GoTo Erachek 'とりあえずエラーで逃げる
  gyou = ActiveCell.Row
 
 For i = 1 To 4
 
   deme(i) = Cells(1, 10 + i) '当選番号の出目をストレート順に格納
 
   If Cells(gyou + 1, 16 + deme(i)) = 0 Then
   
    Cells(gyou + 1, 16 + deme(i)) = 1 'シングルの時 1


   Else
  
    Cells(gyou + 1, 16 + deme(i)) = Cells(gyou + 1, 16 + deme(i)) + 1  'ダブル以上2以上
 
   End If
  
 Next i
 
 For ii = 0 To 9
 
    If Cells(gyou + 1, 16 + ii) = "" Then
   
       If IsNumeric(Cells(gyou, 16 + ii).Value) = False Then Cells(gyou, 16 + ii) = 1
         If IsNumeric(Cells(gyou - 1, 16 + ii).Value) = True Then Cells(gyou, 16 + ii) = Cells   (gyou - 1, 16 + ii) + 1
       
     ElseIf Cells(gyou + 1, 16 + ii) = 1 Then
    
         If IsNumeric(Cells(gyou, 16 + ii).Value) = False Then
         Cells(gyou, 16 + ii).Select
        
           With Selection.Font
          .Color = -16776961
          .TintAndShade = 0
           End With
    
         End If
        
          Cells(gyou, 16 + ii) = "●"
       ElseIf Cells(gyou + 1, 16 + ii) >= 2 Then
    
    If IsNumeric(Cells(gyou, 16 + ii).Value) = False Then
       Cells(gyou, 16 + ii).Select
        
           With Selection.Font
          .Color = -16776961
          .TintAndShade = 0
           End With
    
         End If
    
        Cells(gyou, 16 + ii) = "◎"
   
      End If
     
 Next ii


Erachek:
  Exit Sub


End Sub