▎具體需求
手裡面有上千個文件夾,每個文件夾裡面包含2張照片,我們需要把這些圖片插入到word文檔的表格中。每3個文件夾作為一頁。
文件夾示意
文件夾内部圖片
最終效果
▎思路分析
首先需要獲取文件夾的個數,根據文件夾個數确定一下word文檔的表格總行數。接着插入空的表格,向表格裡面寫内容,并且插入圖片。
▎源代碼
實現功能的源代碼在下方,由于文件隐私,不再推送原始附件。可以從下面的源代碼中獲取思路。
Sub 執行()
If ActiveDocument.Tables.Count = 1 Then '删除上次數據
ActiveDocument.Tables(1).Delete
End If
'//獲取文件夾,存入數組
Dim kr()
Set fso = CreateObject("scripting.filesystemobject")
With Application.FileDialog(msoFileDialogFolderPicker)
If .Show Then PathSht = .SelectedItems(1) Else Exit Sub
End With
Set f_num = fso.getfolder(PathSht)
For Each fl In f_num.subfolders
i = i + 1
ReDim Preserve kr(1 To i)
kr(i) = fl.Path
Next
'//開始新建表格
tbl_rowcount = UBound(kr) + Int(UBound(kr) / 3) + 1
Dim tbl As Table
Set tbl = ActiveDocument.Tables.Add(Range:=Selection.Range, NumRows:=tbl_rowcount, NumColumns:=4)
'新建表格
tbl.Style = "網格型"
Set tbl = ActiveDocument.Tables(1)
tbl.Columns(1).Width = 1.27 * 28.35 '設置表格各列的列寬
tbl.Columns(2).Width = 2.13 * 28.35
tbl.Columns(3).Width = 3.3 * 28.35
tbl.Columns(4).Width = 11.58 * 28.35
tbl.Rows.Alignment = wdAlignRowCenter '居中對齊
tbl.Range.Cells.VerticalAlignment = wdCellAlignVerticalCenter '文字垂直居中
'//開始插入圖片
For i = 1 To tbl_rowcount
'對Word中的表格中的行進行循環。
If i Mod 4 = 1 Then '當表格的行号除以4的餘數是1的時候,就是标題行。
tbl.Rows(i).Range.Font.Bold = True '字體加粗
tbl.Cell(i, 1).Range.Text = "序号"
tbl.Cell(i, 2).Range.Text = "發布形式"
tbl.Cell(i, 3).Range.Text = "線路/車牌号"
tbl.Cell(i, 4).Range.Text = "驗收照片"
tbl.Rows(i).Height = 1.9 * 28.35 '設置标題行行高
Else
p = p + 1
fod_index = fod_index + 1
tbl.Cell(i, 1).Range.Text = p
tbl.Cell(i, 2).Range.Text = "司機背闆"
srr = Split(kr(fod_index), "\")
tbl.Cell(i, 3).Range.Text = srr(UBound(srr))
tbl.Rows(i).Height = 6.4 * 28.35
Dim shp As InlineShape
pic = Dir(kr(fod_index) & "\*.JPG")
tbl.Cell(i, 4).Range.Select
Do While pic <> "" 'Do While循環插入圖片
Set shp = Selection.Range.InlineShapes.AddPicture(FileName:=kr(fod_index) & "\" & pic)
shp.Height = 6 * 28.35
shp.Width = (10 / 2) * 28.35
pic = Dir
tbl.Cell(i, 4).Range.Select '選中該單元格,為了下一步光标定位到單元格内部
Selection.EndKey wdLine
Selection.TypeText " " '設置圖片間隔
Loop
End If
Next
MsgBox "完成!"
End Sub
Function getfol()
'該函數的作用:彈出對話框提示用戶選擇文件夾,并且返回該文件夾路徑。
'如果用戶選擇了取消,則返回空值
Dim PathSht As String
With Application.FileDialog(msoFileDialogFolderPicker)
If .Show Then
PathSht = .SelectedItems(1)
Else
PathSht = ""
Exit Function
End With
getfol = PathSht & IIf(Right(PathSht, 1) = "\", "", "\")
End Function
▎知識點
獲取子文件夾
利用FSO對象,獲取子文件夾,這個代碼很常用。
Set fso = CreateObject("scripting.filesystemobject")
Setf_num=fso.getfolder(PathSht)
ForEachflInf_num.subfolders
msgboxfl.name
Next
Word VBA新建表格
Word VBA中很大一部分代碼,都可以通過錄制宏獲取。比如下方的代碼。
Sub Add_table()
'新建一個3行4列的表格
Set tbl = ActiveDocument.Tables.Add(Range:=Selection.Range, NumRows:=3, NumColumns:=4)
tbl.Style = "網格型"
End Sub
Word中的單位
行高列寬默認是磅。如果是厘米,需要轉化一下。轉化關系如下:
有話要說...