見出し画像

時間割マクロ完成

 この間の時間割マクロの話を読まれたかたは、お読みにならなくてもだいじょうぶですよ。あれには不備があったので、あらためて書くだけですから。

 学校の時間割を作成するマクロ、ついに完成しました。先日のものは、不具合があることに気づいたのです。きのう、就労移行で必死に考えました。

 ついに原因をつきとめました。ForからNextという繰り返しのなかで、変わってはいけない文字列の変数が、途中で変わっていました。そこだけ変数の名前を変えることで解決しました。なさけない間違いというか「よくそんな根源的な間違いをしているのに、いままで何事もなく走っていたな」と思うような間違いでした。気がついてよかったです。

 そして、年度末のきのう、実際に使用する人と打ち合わせて、少し仕様を作り変えました。また、年度始めの本日、もう一度、問い合わせがあって、もう少し仕様を変えてリリースしました。おそらくこれでだいじょうぶであるはず…。

 自分の作ったマクロが、ほんとうに誰かの役に立つのは初めてではないでしょうか。うれしいです。

 以下にコードをさらしますね。律儀に読み解かなくてだいじょうぶですよ(笑)。

Sub 時間割()
Dim i As Integer
Dim j As Integer
Dim HRyoubimoji(6) As String
Dim HRyoubi(6) As Integer

Dim HR(6) As Integer

Dim hrc As Integer


Dim tantoushanokazu, classnokazu As Integer
Dim gakunenmoji As String
Dim nenkumi As String

Dim nenkumitanclass As String


Dim classonly As String
Dim classsentakuonly As String
Dim tanclass As String


Dim nagasa As Integer
Dim jigen As String
Dim namae As String
Dim tanjigen As String
Dim taiiku As String
Dim ninzuu As String




Dim s As Integer
Dim t As Integer
Dim p, pp As Integer
Dim n As Integer


Dim myrange As Range
Dim myobj As Range

Dim myrangehr As Range
Dim myobjhr As Range
Dim mycellhr As Range
Dim HRstr As String
Dim mycellhrretu As Integer

Dim myrangesentaku As Range
Dim myobjsentaku As Range
Dim sentakustr As String
Dim senpstr(10) As String
Dim senqstr(10) As String
Dim banti As String

Dim sentaku(10) As Integer
Dim sentakugyou As Integer
Dim q, r, ss, sss, x, nn As Integer
Dim hajimarisentaku, owarisentaku As String

Dim sentakukyouka As String
Dim gijututaiiku As String

gijututaiiku = "体育"


Dim iro1(3), iro2(3), iro3(3), iro4(3), iro5(3), iro6(3), iroHR(3), iropink(3), iroHS(3), irokuuran(3), irokaigi(3) As Integer
Dim irosen(3), irokyoukakan(3), iros(3), iroh(3), iroj(3) As Integer


iropink(1) = 255
iropink(2) = 192
iropink(3) = 203

iro1(1) = 248
iro1(2) = 198
iro1(3) = 32

iro2(1) = 152
iro2(2) = 251
iro2(3) = 152

iro3(1) = 0
iro3(2) = 255
iro3(3) = 255

iro4(1) = 230
iro4(2) = 230
iro4(3) = 250

iro5(1) = 245
iro5(2) = 245
iro5(3) = 220

iro6(1) = 216
iro6(2) = 191
iro6(3) = 216

iroHS(1) = 0
iroHS(2) = 128
iroHS(3) = 0

iroHR(1) = 255
iroHR(2) = 250
iroHR(3) = 250

irokaigi(1) = 255
irokaigi(2) = 255
irokaigi(3) = 0

irokuuran(1) = 255
irokuuran(2) = 255
irokuuran(3) = 255

iros(1) = 255
iros(2) = 255
iros(3) = 255

iroh(1) = 255
iroh(2) = 255
iroh(3) = 255

iroj(1) = 255
iroj(2) = 255
iroj(3) = 255

irosen(1) = 255
irosen(2) = 255
irosen(3) = 255

irokyoukakan(1) = 255
irokyoukakan(2) = 0
irokyoukakan(3) = 0


Dim iro As String
Dim irogakunen As Integer



Sheets("全担当者").Select
tantoushanokazu = WorksheetFunction.CountIf(Range("B2:B500"), "<>")
Sheets("全組").Select
classnokazu = WorksheetFunction.CountIf(Range("A2:A100"), "<>")

Worksheets("全組").Range("B2:AN" & classnokazu + 1).ClearContents

Worksheets("全担当者").Range("A1:A" & tantoushanokazu + 1).HorizontalAlignment = xlCenter
Worksheets("全組").Range("B2:AN" & classnokazu + 1).HorizontalAlignment = xlCenter

Worksheets("全組").Range("B2:AN" & classnokazu + 1).ShrinkToFit = True

'ホームルームをつくる

For hrc = 1 To 6
' Do
' HRyoubimoji(hrc) = InputBox(hrc & "年生のホームルームは何曜日ですか。" & vbCrLf & "1.月、2.火、3.水、4.木、5.金、6.土")
' HRyoubi(hrc) = Val(HRyoubimoji(hrc))
' Loop While HRyoubi(hrc) < 1 Or HRyoubi(hrc) > 6
HRyoubi(1) = 3
HRyoubi(2) = 3
HRyoubi(3) = 3
HRyoubi(4) = 5
HRyoubi(5) = 2
HRyoubi(6) = 1

HR(hrc) = 7 * HRyoubi(hrc) - 5

Set myrangehr = Worksheets("全組").Range("A1:AN" & classnokazu + 1)
Set myobjhr = myrangehr.Find(hrc, LookAt:=xlPart)

If myobjhr Is Nothing Then
MsgBox "「全組」シートの学年に間違いがあります"
Exit Sub
End If

Set mycellhr = myobjhr

Do
mycellhrretu = mycellhr.Row
' MsgBox mycellhrretu
' MsgBox HR(hrc)
HRstr = Worksheets("全組").Cells(mycellhrretu, HR(hrc)).Address(False, False)
' MsgBox HRstr
Worksheets("全組").Range(HRstr).Value = "HR"
Set mycellhr = myrangehr.FindNext(mycellhr)
Loop While mycellhr.Row <> myobjhr.Row
Next

'とりあえず従来型のようにつくる

Set myrange = Worksheets("全組").Range("A1:A" & classnokazu + 1)

For i = 2 To tantoushanokazu + 1
For j = 3 To 41



nenkumi = Worksheets("全担当者").Cells(i, j).Value

If nenkumi <> "" Then
' gakunenmoji = Left(nenkumi, 1)
' If IsNumeric(gakunenmoji) = False Then
' If nenkumi = "HR" Then


If IsNumeric(Left(nenkumi, 1)) = True Then

gakunenmoji = Left(nenkumi, 1)
gakunen = Val(gakunenmoji)

classonly = Mid(nenkumi, 2)
nagasa = Len(classonly)


If Right(classonly, 1) = "s" Or Right(classonly, 1) = "h" Or Right(classonly, 1) = "j" Or Right(classonly, 1) = "i" Then
' classsentakuonly = Left(classonly, nagasa - 1)
nagasa = nagasa - 1
Select Case Right(classonly, 1)
Case "s"
taiiku = "(水)"
Case "h"
taiiku = "(保)"
Case "j"
taiiku = "(柔)"
Case "i"
taiiku = "(情)"
End Select
classonly = Left(classonly, nagasa)
ElseIf UCase(Right(classonly, 1)) <> Right(classonly, 1) Then
taiiku = ""
nagasa = nagasa - 1
classonly = Left(classonly, nagasa)
Else


taiiku = ""
End If



' If nagasa = 1 Then
' jigen = Worksheets("全担当者").Cells(1, j).Value
' namae = Worksheets("全担当者").Cells(i, 2).Value
' t = j - 1
' Set myobj = myrange.Find(nenkumi)

' s = myobj.Row
' MsgBox s & t & namae
' Worksheets("全組").Cells(s, t) = namae
' Else


jigen = Worksheets("全担当者").Cells(1, j).Value
namae = Worksheets("全担当者").Cells(i, 2).Value
t = j - 1

For p = 1 To nagasa

tanclass = Mid(classonly, p, 1)
nenkumi = gakunenmoji & tanclass
Set myobj = myrange.Find(nenkumi, , , xlPart)
If myobj Is Nothing Then
MsgBox "存在しないクラスが書いてあります"
Exit Sub
End If


s = myobj.Row
Worksheets("全組").Cells(s, t) = namae & taiiku
Next
' jigen = Worksheets("全担当者").Cells(1, j).Value
' namae = Worksheets("全担当者").Cells(i, 2).Value
' t = j - 1
' Set myobj = myrange.Find(nenkumi)

' s = myobj.Row
' Worksheets("全組").Cells(s, t) = namae & taiiku
' Else
' jigen = Worksheets("全担当者").Cells(1, j).Value
' namae = "選択" & Worksheets("全担当者").Cells(i, 1).MergeArea(1, 1).Value
' t = j - 1

' For p = 1 To nagasa

' tanclass = Mid(classsentakuonly, p, 1)
' nenkumi = gakunenmoji & tanclass
' Set myobj = myrange.Find(nenkumi)

' s = myobj.Row
' Worksheets("全組").Cells(s, t) = namae & taiiku
' Next


End If
End If


Next
Next

'従来型マクロはできた。ここから選択社会や教科間選択

For i = 1 To 10
sentaku(i) = 0
Next


For j = 3 To 41
hajimarisentaku = Cells(2, j).Address
owarisentaku = Cells(tantoushanokazu + 1, j).Address
' Set myrangesentaku = Worksheets("全担当者").Range(Cells(2, 3), Cells(200, 3))
Set myrangesentaku = Worksheets("全担当者").Range(hajimarisentaku & ":" & owarisentaku)

For i = 2 To tantoushanokazu + 1
L1:
If i > tantoushanokazu + 1 Then
Exit For
End If


For nn = 1 To 10
sentaku(nn) = 0
Next

nenkumi = Worksheets("全担当者").Cells(i, j).Value

If nenkumi = "HR" Or nenkumi = "*" Or nenkumi = "*" Or nenkumi = "" Or nenkumi = "HS" Then
i = i + 1
GoTo L1
End If
If Val(Left(nenkumi, 1)) <> 1 And Val(Left(nenkumi, 1)) <> 2 And Val(Left(nenkumi, 1)) <> 3 And Val(Left(nenkumi, 1)) <> 4 And Val(Left(nenkumi, 1)) <> 5 And Val(Left(nenkumi, 1)) <> 6 Then
i = i + 1
GoTo L1
End If

Set myobjsentaku = myrangesentaku.Find(nenkumi, , , xlPart)

If Not myobjsentaku Is Nothing Then
' If myobjswentaku.Address(False, False) = Range(Cells(i, j), Cells(i, j)).Value Then
' i = i + 1
' GoTo L1
' End If
sentaku(1) = myobjsentaku.Row
If sentaku(1) = i Then
i = i + 1
GoTo L1
End If

n = 2
banti = myobjsentaku.Address

Do

Set myobjsentaku = myrangesentaku.FindNext(myobjsentaku)
If myobjsentaku Is Nothing Then
Exit Do
End If
sentaku(n) = myobjsentaku.Row
n = n + 1
Loop While myobjsentaku.Address <> banti
n = n - 1
For q = 1 To n
If sentaku(q) = 0 Then
Exit For
End If

senpstr(q) = Worksheets("全担当者").Cells(sentaku(q), 1).MergeArea(1, 1).Value
If InStr(senpstr(q), "技") <> 0 Then
senpstr(q) = gijututaiiku
End If


Next
x = 0
For ss = 1 To n
For sss = 1 To n
If senpstr(ss) <> senpstr(sss) Then
x = x + 1
End If
Next
Next


If x = 0 Then
jigen = Worksheets("全担当者").Cells(1, j).Value
sentakukyouka = Worksheets("全担当者").Cells(i, 1).MergeArea(1, 1).Value
If InStr(sentakukyouka, "技") <> 0 Then
sentakukyouka = gijututaiiku
End If

namae = "選択" & sentakukyouka


t = j - 1

For p = 1 To n

' 昼休み。nenkumiは4Aとか4ABとかなので、全組シートにsとtで表さねばならない。

If Right(nenkumi, 1) = "s" Or Right(nenkumi, 1) = "h" Or Right(nenkumi, 1) = "j" Or Right(nenkumi, 1) = "i" Then
' classsentakuonly = Left(classonly, nagasa - 1)
' nagasa = nagasa - 1
Select Case Right(nenkumi, 1)
Case "s"
taiiku = "(水)"
Case "h"
taiiku = "(保)"
Case "j"
taiiku = "(柔)"
Case "i"
taiiku = "(情)"
End Select
' classonly = Left(classonly, nagasa - 1)

End If
' gakunenmoji = Left(nenkumi, 1)
' If IsNumeric(gakunenmoji) = False Then
' If nenkumi = "HR" Then


If IsNumeric(Left(nenkumi, 1)) = True Then

gakunenmoji = Left(nenkumi, 1)
gakunen = Val(gakunenmoji)

classonly = Mid(nenkumi, 2)
nagasa = Len(classonly)


If UCase(Right(classonly, 1)) <> Right(classonly, 1) Then
' classsentakuonly = Left(classonly, nagasa - 1)
nagasa = nagasa - 1
' Select Case Right(classonly, 1)
' Case "s"
' taiiku = "(水)"
' Case "h"
' taiiku = "(保)"
' Case "j"
' taiiku = "(柔)"
' End Select
classonly = Left(classonly, nagasa)
Else
taiiku = ""
End If



' If nagasa = 1 Then
' jigen = Worksheets("全担当者").Cells(1, j).Value
' namae = Worksheets("全担当者").Cells(i, 2).Value
' t = j - 1
' Set myobj = myrange.Find(nenkumi)

' s = myobj.Row
' MsgBox s & t & namae
' Worksheets("全組").Cells(s, t) = namae
' Else


jigen = Worksheets("全担当者").Cells(1, j).Value
' namae = Worksheets("全担当者").Cells(i, 2).Value
t = j - 1

For pp = 1 To nagasa

tanclass = Mid(classonly, pp, 1)
nenkumitanclass = gakunenmoji & tanclass
Set myobj = myrange.Find(nenkumitanclass)

s = myobj.Row
Worksheets("全組").Cells(s, t) = namae & taiiku
Next
' jigen = Worksheets("全担当者").Cells(1, j).Value
' namae = Worksheets("全担当者").Cells(i, 2).Value
' t = j - 1
' Set myobj = myrange.Find(nenkumi)

' s = myobj.Row
' Worksheets("全組").Cells(s, t) = namae & taiiku
' Else
' jigen = Worksheets("全担当者").Cells(1, j).Value
' namae = "選択" & Worksheets("全担当者").Cells(i, 1).MergeArea(1, 1).Value
' t = j - 1

' For p = 1 To nagasa

' tanclass = Mid(classsentakuonly, p, 1)
' nenkumi = gakunenmoji & tanclass
' Set myobj = myrange.Find(nenkumi)

' s = myobj.Row
' Worksheets("全組").Cells(s, t) = namae & taiiku
' Next


End If
Next
Else
namae = "教科間選択"
t = j - 1
For p = 1 To n
If IsNumeric(Left(nenkumi, 1)) = True Then

gakunenmoji = Left(nenkumi, 1)
gakunen = Val(gakunenmoji)

classonly = Mid(nenkumi, 2)
nagasa = Len(classonly)


If UCase(Right(classonly, 1)) <> Right(classonly, 1) Then
' classsentakuonly = Left(classonly, nagasa - 1)
nagasa = nagasa - 1
' Select Case Right(classonly, 1)
' Case "s"
' taiiku = "(水)"
' Case "h"
' taiiku = "(保)"
' Case "j"
' taiiku = "(柔)"
' End Select
classonly = Left(classonly, nagasa)
' Else
' taiiku = ""

End If



' If nagasa = 1 Then
' jigen = Worksheets("全担当者").Cells(1, j).Value
' namae = Worksheets("全担当者").Cells(i, 2).Value
' t = j - 1
' Set myobj = myrange.Find(nenkumi)

' s = myobj.Row
' MsgBox s & t & namae
' Worksheets("全組").Cells(s, t) = namae
' Else


jigen = Worksheets("全担当者").Cells(1, j).Value
' namae = Worksheets("全担当者").Cells(i, 2).Value
t = j - 1

For pp = 1 To nagasa

tanclass = Mid(classonly, pp, 1)
nenkumitanclass = gakunenmoji & tanclass
Set myobj = myrange.Find(nenkumitanclass)

s = myobj.Row
Worksheets("全組").Cells(s, t) = "教科間選択"
Next
' jigen = Worksheets("全担当者").Cells(1, j).Value
' namae = Worksheets("全担当者").Cells(i, 2).Value
' t = j - 1
' Set myobj = myrange.Find(nenkumi)

' s = myobj.Row
' Worksheets("全組").Cells(s, t) = namae & taiiku
' Else
' jigen = Worksheets("全担当者").Cells(1, j).Value
' namae = "選択" & Worksheets("全担当者").Cells(i, 1).MergeArea(1, 1).Value
' t = j - 1

' For p = 1 To nagasa

' tanclass = Mid(classsentakuonly, p, 1)
' nenkumi = gakunenmoji & tanclass
' Set myobj = myrange.Find(nenkumi)

' s = myobj.Row
' Worksheets("全組").Cells(s, t) = namae & taiiku
' Next


End If
Next
' End If

End If
' tanclass = Mid(classsentakuonly, p, 1)
' nenkumi = gakunenmoji & tanclass
' Set myobj = myrange.Find(nenkumi)

' s = myobj.Row
' Worksheets("全組").Cells(s, t) = namae & taiiku
' Next
End If
Next
Next

'色を染める
Sheets("全担当者").Select

For i = 2 To tantoushanokazu + 1
For j = 3 To 41
iro = Cells(i, j).Value
If iro = "HR" Or iro = "*" Or iro = "*" Or iro = "HS" Then
Select Case iro
Case "HR"
Range(Cells(i, j), Cells(i, j)).Interior.Color = RGB(iroHR(1), iroHR(2), iroHR(3))
Case "HS"
Range(Cells(i, j), Cells(i, j)).Interior.Color = RGB(iroHS(1), iroHS(2), iroHS(3))
Case "*"
Range(Cells(i, j), Cells(i, j)).Interior.Color = RGB(iropink(1), iropink(2), iropink(3))
Case "*"
Range(Cells(i, j), Cells(i, j)).Interior.Color = RGB(iropink(1), iropink(2), iropink(3))
End Select
ElseIf iro <> "" Then
irogakunen = Val(Left(iro, 1))
Select Case irogakunen
Case 1
Range(Cells(i, j), Cells(i, j)).Interior.Color = RGB(iro1(1), iro1(2), iro1(3))
Case 2
Range(Cells(i, j), Cells(i, j)).Interior.Color = RGB(iro2(1), iro2(2), iro2(3))
Case 3
Range(Cells(i, j), Cells(i, j)).Interior.Color = RGB(iro3(1), iro3(2), iro3(3))
Case 4
Range(Cells(i, j), Cells(i, j)).Interior.Color = RGB(iro4(1), iro4(2), iro4(3))
Case 5
Range(Cells(i, j), Cells(i, j)).Interior.Color = RGB(iro5(1), iro5(2), iro5(3))
Case 6
Range(Cells(i, j), Cells(i, j)).Interior.Color = RGB(iro6(1), iro6(2), iro6(3))
Case Else
Range(Cells(i, j), Cells(i, j)).Interior.Color = RGB(irokaigi(1), irokaigi(2), irokaigi(3))

End Select
Else
Range(Cells(i, j), Cells(i, j)).Interior.Color = RGB(255, 255, 255)

End If
Next
Next



Worksheets("全組").Select

For i = 1 To classnokazu + 1
For j = 1 To 40
iro = Cells(i, j).Value

If iro = "HR" Then
Range(Cells(i, j), Cells(i, j)).Interior.Color = RGB(iroHR(1), iroHR(2), iroHR(3))
ElseIf iro = "" Then

Range(Cells(i, j), Cells(i, j)).Interior.Color = RGB(iropink(1), iropink(2), iropink(3))


ElseIf InStr(iro, "(水)") <> 0 Then
Range(Cells(i, j), Cells(i, j)).Interior.Color = RGB(iros(1), iros(2), iros(3))
ElseIf InStr(iro, "(保)") <> 0 Then
Range(Cells(i, j), Cells(i, j)).Interior.Color = RGB(iroh(1), iroh(2), iroh(3))
ElseIf InStr(iro, "(柔)") <> 0 Then
Range(Cells(i, j), Cells(i, j)).Interior.Color = RGB(iroj(1), iroj(2), iroj(3))
ElseIf InStr(iro, "選択") <> 0 Then
Range(Cells(i, j), Cells(i, j)).Interior.Color = RGB(irosen(1), irosen(2), irosen(3))
If iro = "教科間選択" Then
Range(Cells(i, j), Cells(i, j)).Interior.Color = RGB(irokyoukakan(1), irokyoukakan(2), irokyoukakan(3))
End If
Else



Range(Cells(i, j), Cells(i, j)).Interior.Color = RGB(255, 255, 255)
End If

Next
Next
Range("A1").Interior.Color = RGB(255, 255, 255)


End Sub

いいなと思ったら応援しよう!