아래는 모듈 창의 서브루틴, 함수이다. "자막 뽑기 실행 버튼"에는 아래 run() 루틴이 연결 되어 있다.
'자막 뽑기 매크로 실행
Public Sub run()
UserForm1.Show
End Sub
'시분초 문자열을 msec로 바꾸는 함수
Public Function time2msec(a)
h = Left(a, 2)
m = Mid(a, 4, 2)
s = Mid(a, 7, 6) / 1000
time2msec = 1000 * s + 60000 * m + 3600000 * h
End Function
'msec를 시분초 문자열로 바꾸는 함수
Public Function msec2time(msec)
msec2time = Int(msec / 3600000) & ":" & Int((msec Mod 3600000) / 60000) & ":" & Int((msec Mod 60000) / 1000) & "," & (msec Mod 1000)
End Function
'자막 처리 서브루틴
Public Sub subtitles()
'-------------------자막정리=불필요 공백/개행문자 제거 + 소문자화
buff1 = UserForm1.TextBox1.Text
buff2 = ""
Length = Len(buff1)
For i = 1 To Length
c = Mid(buff1, i, 1)
Select Case c
Case Chr(10), Chr(13) 'FF, CR 문자면 무시하라
Case " " '공백이라면
Select Case Right(buff2, 1)
Case " ", "<", "=" '그 이전 문자가 공백, <, = 라면 무시
Case Else
If i < Length Then
Select Case Mid(buff1, i + 1, 1)
Case ">", "=", " " '그 다음 문자가 공백, >, = 라면 무시
Case Else
buff2 = buff2 + c
End Select
End If
End Select
Case Else
buff2 = buff2 + c
End Select
Next i
buff1 = LCase(buff2) '소문자화
UserForm1.TextBox1.Text = buff1
'-------------------시간 자막 분리 추출
r = 1
counter = 0
finish = False
X = 1
Do
counter = counter + 1
X = InStr(X, buff1, "<sync start=", vbTextCompare)
If X = 0 Then
finish = True
Else
X = X + Len("<sync start=")
Y = InStr(X, buff1, ">", vbTextCompare)
If Y > X Then
msec_buff = Mid(buff1, X, Y - X)
Worksheets("자막").Cells(r, 2).Value = "<sync start="
Worksheets("자막").Cells(r, 3).Value = msec_buff
msec = Val(msec_buff)
Worksheets("자막").Cells(r, 1).Value = msec2time(msec)
X = Y + 1
Y = InStr(X, buff1, "<sync start=", vbTextCompare)
If Y > X Then
Worksheets("자막").Cells(r, 4).Value = ">" & Mid(buff2, X, Y - X)
r = r + 1
X = Y
Else
Y = InStr(X, buff1, "</body", vbTextCompare)
If Y > X Then
Worksheets("자막").Cells(r, 4).Value = ">" & Mid(buff2, X, Y - X)
Else
Y = InStr(X, buff1, "</sami", vbTextCompare)
If Y > X Then
Worksheets("자막").Cells(r, 4).Value = ">" & Mid(buff2, X, Y - X)
Else
Worksheets("자막").Cells(r, 4).Value = ">" & Mid(buff2, X, Len(buff2))
End If
End If
finish = True
End If
Else
finish = True
End If
End If
Loop Until counter1 > 10000 Or finish
End Sub
SMI 자막 파일 구조 이해