マクロ学習法とは 7 (条件分析)
マクロを作る際、条件がハッキリしてないと中々先に進めないと思います。
そこで、自分が知りたい条件の分析が必要になるような気がします。
条件を分析して、分かった色々な事を元にマクロ作成しますが、条件をどうやってマクロ化するか難しいこともありますね。
人間の目で見て判断するのは簡単でも、コンピュータに判断させるのは簡単では無いです。だから出来るだけ条件を単純化させてマクロを作る必要があると思います。
どんなマクロを作るかも経験が必要ですが、その前にどんな事をさせるかを考えられればなんとかマクロは出来ると思います。
条件をすべて明確にして、条件が成立出来る様な考え方をもとにマクロ作成のヒントにするのが良いかも知れませんね。
ここでの数字は●123●で●どうしの間隔3としますが、マクロの計算上は4になる。
上の表で赤丸の部分を判断する条件は(元々は黒丸です)
(1)赤丸と赤丸の間隔3以下で
(2)(1)の条件を満たし、赤丸が最低3個以上あること
この2つの条件を頭に入れて、目で見て判断するのは簡単ですが?
マクロを作って、マクロで判断させ、マクロで赤丸にするのは簡単では無いような気がします。(特に、私の場合ですがw)
取りあえず試行錯誤してマクロが出来れば良いなと思ってます。
考え方のひとつは、3個の間隔がすべて3以下と言う事は1個目と2個目の間を for next で計算して3以下なら、計算して分かった2個目の位置と3個目の間3以下での個数を計算するためにcountifで個数を計算します。2個以上なら赤丸にしても良いとします。
●123●123● や ●12●12● や ●●123● 等で条件成立
●123●1234● や ●1234●123● や ●●1234● 等で条件不成立
1個目と2個目の間隔をcountifで計算する場合も for next を使うので、countifを使わなくても良いと思います。2個目と3個目は定義する間隔にあるなら、位置が分からなくても良いのでcountifで2個目と3個目で最大間隔3で2個以上かを確認するだけですね。
上の考え方で判定マクロで出来れば、そして条件が成立したなら?
下のマクロで赤丸にしても良いと思います。
(今は目で見て判断し下の「入力赤丸」マクロで赤丸にしています)
Sub 入力赤丸() ’黒丸を赤丸にする(下線も引く)
Dim maruiti As Object
Sheets("ストレートパターン").Select
retu = ActiveCell.Column
gyou = ActiveCell.Row
Set maruiti = Application.Cells(gyou, retu)
Cells(gyou + 1, retu).Select
j = 1
If Cells(gyou + j, retu) <> "●" Then
Do Until Cells(gyou + j, retu) = "●"
If j > 3 Then Exit Do ’間隔4以上は中止
j = j + 1
Loop
End If
Cells(gyou + j, retu).Select
maruiti.Font.Underline = xlUnderlineStyleSingle
maruiti.Font.Color = -16776961
If Cells(gyou + j, retu) <> "●" Then ’●が無くなったらマクロ終了させる
End
Else
入力赤丸 ’2個目以上も入力赤丸マクロを再度実行
End If
End Sub
完全では無いですが、取りあえず下の判定マクロを作って見ました。
(上手く動く自信は有りませんが、ミスが出れば修正出来ればですね)
Sub ホットナンバーchk() ’間隔が3以下で個数が3個以上なら赤丸にするマクロ
Sheets("ストレートパターン").Select ’シート「ストレートパターン」で動作させる
retu = ActiveCell.Column
gyou = ActiveCell.Row
gyoupoint = gyou ’最初の行とする
If Cells(gyou - 1, retu) >= 4 And Cells(gyou, retu) = "●" Then
For i = 1 To 4 ’2個目の間隔を調べる。
Cells(gyou + i, retu).Select
j = i
If Cells(gyou + j, retu) = "●" Then Exit For ’1個と2個の間をチェック
Next i
If WorksheetFunction.CountIf(Range(Cells(gyou + j, retu), Cells(gyou + j + 4, retu)), "●")
>= 2 Then ’2個と3個の間をチェック
Cells(gyoupoint, retu).Select
入力赤丸 ’条件があえば 上の入力赤丸マクロを実行する。
Else
End ’条件が合わなければ、このまま終了する。
End If
End If
End Sub
-------------------------------------------------------
If Cells(gyou - 1, retu) >= 4 And Cells(gyou, retu) = "●" Then は
If Cells(gyou, retu) = "●" Then だけでも良いような気がします。
2個と3個の間を1個と2個のように for next で計算しても良いです。その場合は式が少し長くなると思います。