『無駄な再生時間が追加しない』(福井)
コードで再生時間をファイル名の最後に追加しています。
ABC ----> ABC(01分50秒)
既に再生時間を追加しているファイル名には、2度目の変名は必要ないので処理をスキップするように
コードを改変したのですが上手く処理できずに2回目以降も全て変名されて
無駄な再生時間が追加されます。
以下のコードの不備と思われますが
' ファイル名に既に再生時間が含まれているかチェック If Not file.Name Like "*(*分*秒)" Then
どのように修正すれば良いでしょうか ?
Option Explicit
Sub 再生時間追加() Dim fso As Object Dim folder As Object Dim file As Object Dim shell As Object Dim folderPath As String Dim newName As String Dim duration As String Dim fileExtension As String
' フォルダーパスを指定(ここを変更してください) folderPath = "D:\MOVIE\AtoF\"
' FileSystemObjectとShellの作成 Set fso = CreateObject("Scripting.FileSystemObject") Set shell = CreateObject("Shell.Application")
' 指定されたフォルダーを取得 Set folder = fso.GetFolder(folderPath)
' 処理する拡張子を配列で宣言 Dim validExtensions As Variant validExtensions = Array("mp4", "mkv", "avi", "mov", "ts") ' 必要な拡張子を順次追加可能
' フォルダー内のファイルを処理 For Each file In folder.Files 'ファイルの拡張子を首都ぅ fileExtension = LCase(fso.GetExtensionName(file.Name))
'ファイル名に指定拡張子があるか判断して以下の処理を実施 If IsInArray(fileExtension, validExtensions) Then
' ファイル名に既に再生時間が含まれているかチェック If Not file.Name Like "*(*分*秒)" Then ' 動画の再生時間を取得 duration = GetVideoDuration(shell, file.Path)
' 新しいファイル名を作成 newName = fso.GetBaseName(file.Name) & "(" & duration & ")" & "." & fso.GetExtensionName(file.Name)
' ファイル名を変更 Name file.Path As fso.BuildPath(folderPath, newName) Else 'ファイルには既に再生時間が追加されているので処理は必要なし End If End If Next file
MsgBox "処理が完了しました。", vbInformation End Sub
' 配列内に要素(拡張子)が存在するかチェックする関数
Function IsInArray(stringToBeFound As String, arr As Variant) As Boolean Dim i As Long For i = LBound(arr) To UBound(arr) If arr(i) = stringToBeFound Then IsInArray = True Exit Function End If Next i IsInArray = False End Function
'各ファイルの再生時間を取得
Function GetVideoDuration(shell As Object, filePath As String) As String Dim folder As Object Dim folderItem As Object Dim durationInSeconds As Long Dim minutes As Long Dim seconds As Long Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject") Set folder = shell.Namespace(fso.GetParentFolderName(filePath)) Set folderItem = folder.ParseName(fso.GetFileName(filePath))
' 動画の長さを秒単位で取得 durationInSeconds = CLng(Split(folder.GetDetailsOf(folderItem, 27), ":")(0)) * 3600 + CLng(Split(folder.GetDetailsOf(folderItem, 27), ":")(1)) * 60 + CLng(Split(folder.GetDetailsOf(folderItem, 27), ":")(2))
' 分と秒に変換 minutes = durationInSeconds \ 60 seconds = durationInSeconds Mod 60
' フォーマットした文字列を返す GetVideoDuration = Format(minutes, "00") & "分" & Format(seconds, "00") & "秒" End Function
< 使用 Excel:Excel2021、使用 OS:Windows11 >
If Not file.Name Like "*(*分*秒)*" Then ではないですか?
(xyz) 2024/07/29(月) 14:53:50
アドバイスのように)の後にアスタリスク(*)を追加したら上手く処理されました。
If Not file.Name Like "*(*分*秒)*" Then
教えてもらった点で何で
"*(*分*秒)" ではダメで *(*分*秒)*" ではうまくいくのか?
理由が理解できていません。
(*の位置での違いについて教えてもらえると嬉しいです。)
(福井) 2024/07/29(月) 15:23:34
file.Nameは拡張子がついたファイル名です。 file.Name Like "*(*分*秒)" という判定は 拡張子がなく、 .....秒) で終わるファイル名のときに Trueとなります。 拡張子がついていると Falseを返します。
その結果、Not file.Name Like "*(*分*秒)" は 時間がついたファイル名も常にTrueとなり、新たに時間測定されるのではないですか? (xyz) 2024/07/29(月) 15:43:57
file.Nameは拡張子がついたファイル名である事を忘れていました。
理解が深まりました。
ありがとうございます。
(福井) 2024/07/29(月) 16:11:53
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.