2025/06/18

Excel / 使用VBA執行ffmpeg合併圖檔與音檔成為影音檔 3

「Excel / 使用VBA執行ffmpeg合併圖檔與音檔成為影音檔 」系列的第3篇

這次說明讓流程更加自動化的另一個方式是利用Excel VBA表單功能

表單的功能介面如下

 

主要流程為透過2個按鈕,分別觸發選取圖檔與音檔的程式

選取之後將檔案路徑寫入對應的文字方塊,也可以用標籤

目的是顯示檔案路徑

選完檔案之後,再透過「合併」按鈕觸發合併圖檔與音檔的程式

當檔案成果轉檔之後,在將相關資料寫入工作表之中

選取檔案的程式碼跟之前的大同小異

差別只有在寫入的地方不同


程式碼如下

1.選取圖檔的按鈕

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22


Sub cb1_Click()
Dim fd As FileDialog
Set fd = Application.FileDialog(msoFileDialogFilePicker)

With fd
.AllowMultiSelect = False
.Filters.Clear
.Filters.Add "Images", "*.jpg; *.jpeg"
.Title = "選取圖檔"
End With

Dim filePath As Variant

If fd.Show = -1 Then
filePath = fd.SelectedItems(1)
Debug.Print filePath
podcast.tb1.Text = filePath

End If

Set fd = Nothing
End Sub





 

2.選取音檔的程式碼

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22


Sub cb2_Click()
Dim fd2 As FileDialog
Set fd2 = Application.FileDialog(msoFileDialogFilePicker)

With fd2
.AllowMultiSelect = False
.Filters.Clear
.Filters.Add "Wav", "*.wav"
.Title = "選取音檔"
End With

Dim filePath As Variant

If fd2.Show = -1 Then
filePath = fd2.SelectedItems(1)
Debug.Print filePath
podcast.tb2.Text = filePath

End If

Set fd2 = Nothing
End Sub





 

3.合併圖檔與音檔

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50


Sub cb3_Click()
r = Sheets(1).Range("B1").End(xlDown).Row
If r = 1048576 Then
r = 2
Else
r = r + 1
End If

If podcast.tb1.Text <> "" And podcast.tb2.Text <> "" Then

Dim wsh As Object
Set wsh = VBA.CreateObject("WScript.Shell")
Dim waitOnReturn As Boolean: waitOnReturn = True
Dim windowStyle As Integer: windowStyle = 3
Dim errorCode As Long

' 如果用環境參數在WScript.Shell會無法執行
ffmpegFile = "C:\Users\trico\Desktop\ffmpeg\bin\ffmpeg.exe"
' ffmpegFile = "C:\Users\edu\Desktop\yt-dlp\ffmpeg\bin\ffmpeg.exe"

imgPath = podcast.tb1.Text
wavName = podcast.tb2.Text

n = InStr(1, podcast.tb2.Text, ".", vbTextCompare)
mp4Name = Mid(podcast.tb2.Text, 1, n - 1) & ".mp4"

s = ffmpegFile & " -framerate 1 -i " & imgPath & " -i " & Chr(34) & wavName & Chr(34) & " -f mp4 -c:v libx264 -pix_fmt yuv420p " & Chr(34) & mp4Name & Chr(34)
Debug.Print s

' Shell
' Shell s, windowStyle

' WScript.Shell
errorCode = wsh.Run(s, windowStyle, waitOnReturn)

If errorCode = 0 Then
' MsgBox "Done! No error to report."
Debug.Print "輸出:" & mp4Name
Sheets(1).Range("A" & r).Value = "◎"
Sheets(1).Range("B" & r).Value = podcast.tb1.Text
Sheets(1).Range("C" & r).Value = podcast.tb2.Text
Sheets(1).Range("D" & r).Value = mp4Name
Else
MsgBox "Program exited with error code " & errorCode
End If
End If

Unload podcast

End Sub





 

需要注意的地方是cb1_Click 、cb2_Click跟 cb3_Click

cb1、cb2、cb3是按鈕的名稱,也就是按鈕的Name屬性,可以設定成自己想要的名稱

順帶一提,按鈕內的文字可以在Caption屬性設定

 

Click則是按鈕的行為,直接在表單設計的介面點按鈕

就會自動產生物件的Click程序

也可以在程式碼介面的下拉選單選定

 

我的印象是不能直接用文字輸入,只能從表單設計界面或者程式設計介面下拉選單讓VBA自動產生

這樣就可以完成一個簡易的表單來達成自動化流程

0 comments:

張貼留言