[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『SRTファイルへの変換で不具合が』(動画好き)
下記のコードは、テキストファイルをSRTファイルに変換して保存するEXCELのVBAコードですが、
時間部分が「13:28」の場合、「13:28:00」として処理されるように
コードを修正したのですが上手く修正できていません。
Sub SRTへ変換()
Dim inputFile As String Dim outputFile As String Dim fso As Object Dim ts As Object Dim line As String Dim parts() As String Dim title As String Dim startTime As Date Dim endTime As Date Dim counter As Integer Dim i As Long
' ファイル選択ダイアログを表示 inputFile = Application.GetOpenFilename("テキストファイル (*.txt), *.txt", , "テキストファイルを選択してください") If inputFile = "False" Then Exit Sub ' キャンセルされた場合は終了
' 出力ファイル名を生成 Set fso = CreateObject("Scripting.FileSystemObject") outputFile = fso.GetParentFolderName(inputFile) & "\" & fso.GetBaseName(inputFile) & ".srt"
' ファイルを開く Set ts = fso.OpenTextFile(inputFile, 1)
' 出力ファイルを作成 Open outputFile For Output As #1
counter = 1
' ファイルを1行ずつ読み込む Do While Not ts.AtEndOfStream line = ts.ReadLine parts = Split(line, " ")
' タイトルと開始時間を取得 title = "" For i = 0 To UBound(parts) - 1 If IsNumeric(Left(parts(i), 1)) Then startTime = ConvertTime(parts(i)) Exit For Else title = title & parts(i) & " " End If Next i title = Trim(title)
' 終了時間を計算(開始時間 + 15秒) endTime = DateAdd("s", 15, startTime)
' SRT形式で書き出し Print #1, counter Print #1, Format(startTime, "HH:mm:ss,000") & " --> " & Format(endTime, "HH:mm:ss,000") Print #1, title Print #1, ""
counter = counter + 1 Loop
' ファイルを閉じる ts.Close Close #1
MsgBox "変換が完了しました。" & vbNewLine & "保存先: " & outputFile, vbInformation End Sub
Function ConvertTime(timeStr As String) As Date
Dim parts() As String Dim hours As Integer Dim minutes As Integer Dim seconds As Integer
parts = Split(timeStr, ":")
If UBound(parts) = 1 Then ' 「13:28」形式の場合 hours = CInt(parts(0)) minutes = CInt(parts(1)) seconds = 0 ElseIf UBound(parts) = 2 Then ' 「01:17:30」形式の場合 hours = CInt(parts(0)) minutes = CInt(parts(1)) seconds = CInt(parts(2)) Else ' その他の形式の場合はエラーとして00:00:00を返す hours = 0 minutes = 0 seconds = 0 End If
ConvertTime = TimeSerial(hours, minutes, seconds) End Function
上手く修正できていないとは、
コードを実行すると時間部分が下記のように同じ内容の時間にされてしまいます。
正確に変更できるようにコードを再修正したいのですがどこを修正すべきかご指導ください。
1 00:00:00,000 --> 00:00:15,000 Shine On You Crazy Diamond (Parts I-V, VII)
2 00:13:28,000 --> 00:13:43,000 Learning to Fly
3 00:19:03,000 --> 00:19:18,000 High Hopes
4 00:19:03,000 --> 00:19:18,000 Take It Back
5 00:19:03,000 --> 00:19:18,000 Coming Back to Life
6 00:19:03,000 --> 00:19:18,000 Sorrow
(後、割愛)
’-----------------------------
ちなみに、変換前のテキストファイルは以下のような内容です。
Shine On You Crazy Diamond (Parts I-V, VII) 00:00
Learning to Fly 13:28
High Hopes 19:03
Take It Back 27:12
Coming Back to Life 33:12
Sorrow 40:04
Keep Talking 51:18
Another Brick in the Wall (Part 2) 58:52
One of These Days 1:05:50
Speak to Me 1:12:50
Breathe (in the Air) 1:17:30
On the Run 1:17:14
Time 1:20:56
The Great Gig in the Sky 1:27:36
Money 1:33:00
Us and Them 1:41:36
Any Colour You Like 1:48:44
Brain Damage 1:52:03
Eclipse 1:55:50
Wish You Were Here 1:58:50
Comfortably Numb 2:05:00
Run Like Hell 2:14:35
< 使用 Excel:Excel2021、使用 OS:Windows11 >
ミス記載がありました。
以下のように読み替えてください。
時間部分が「13:28」の場合、「13:28:00」として処理されるので
「00:13:28」で処理されるよように
コードを修正したのですが上手く修正できていません。
(動画好き) 2024/09/03(火) 05:53:29
' タイトルと開始時間を取得 title = "" For i = 0 To UBound(parts) - 1 ↑ここはなぜ -1 するんでしょうか? (xyz) 2024/09/03(火) 06:17:54
ああ、そこは修正したということですか?明記して下さい。
If UBound(parts) = 1 Then ' 「13:28」形式の場合 の場合の取り扱いも、ご自分で解決できそうですよ。頑張ってください。 (xyz) 2024/09/03(火) 07:03:34
あれこれ修正して間にあらぬ方向に向かっていました。
沼に迷い込んでドツボにハマった状態です。
自分でどうにもならなくなりアドバイスを受けましたが
コードを修正するのでは無く
大元のテキストファイルを1時間以下でも「00:mm:ss」に変換して
処理させたほうが時間を処理するコードを考えなくて良いので
考えを改める事にしました。
お世話をおかけしました。
(動画好き) 2024/09/03(火) 08:02:37
-1は不要です。
If UBound(parts) = 1 Then ' 「13:28」形式の場合 hours = 0 minutes = CInt(parts(0)) seconds = CInt(parts(1)) ではないんですか? (xyz) 2024/09/03(火) 08:28:05
Another Brick in the Wall (Part 2) 58:52 のところは 2 を時間と認識してしまうので、 経過時間は最後にあるという前提であれば、
' For i = 0 To UBound(parts) '- 1 ' If IsNumeric(Left(parts(i), 1)) Then ' startTime = ConvertTime(parts(i)) ' Exit For ' Else ' title = title & parts(i) & " " ' End If ' Next i のところを Dim myTime As String myTime = parts(UBound(parts)) title = Replace(line, myTime, "") startTime = ConvertTime(myTime) などとすればよいのでは?
(xyz) 2024/09/03(火) 08:49:51
2024/09/03(火) 08:28:05の
修正されたコードで概ね思った処理ができましたが、
以下の場合
Another Brick in the Wall (Part 2) 58:52
正解は、以下のようになるはずでが
8
00:58:52,000 --> 00:59:07,000
Another Brick in the Wall (Part 2)
なぜだか?
以下のように変換されて書き出されました。
8 00:00:00,000 --> 00:00:15,000 Another Brick in the Wall (Part
'-----------------------------------------------
とここで思考停止していて再度サイトに戻ると
2024/09/03(火) 08:49:51 が既に書き込まれていました。
コードをさらにアドバイスを受けて修正すると
思っていたSRT形式が出力されました。
大変お世話になりありがとうございました。
これでスッキリしました。
(動画好き) 2024/09/03(火) 09:07:11
24時間以下なら
Sub test() Dim s As String
s = "13:28" MsgBox TimeValue(Right("00:0" & s, 8))
End Sub (マナ) 2024/09/03(火) 21:52:29
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.