施工照片VBA-常見問題

前言

自從施工照片VBA開始實際投入報表製作過程後,陸陸續續有些使用回饋心得,其中有相當多的常見問題我想要撰寫於這篇文章中,讓各位能有個來源解除這些疑惑,畢竟工具很難完美,肯定是需要經過大量的操作,才會讓他變得更好!

如果使用上還有些什麼更好的建議,請透過左側聯繫我~

一、施工照片長寬比不按正確比例放大導致變形。

解決方法

經查為以下該段程式碼的原因,可以將這段程式碼蓋掉本來的內容就好。

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
51
52
53

'位置:物件類別模組/clsReport/PastePhoto_giveRng

Sub PastePhoto_giveRng(ByVal rng As Object, ByVal photo_path As String, ByVal checkday As String)

'額外接入checkday當作text基底文字

With shtReport

'Set rng = .Range(coll_rng_address(Count))

If rng.MergeCells Then

myMergeArea = rng.MergeArea
dy = UBound(myMergeArea, 1)
dx = UBound(myMergeArea, 2)

End If

Set LastRng = .Cells(rng.Row + dy - 1, rng.Column + dx - 1).Offset(1, 1)

X0 = rng.Left
Y0 = rng.Top

X1 = LastRng.Left
Y1 = LastRng.Top

targetWidth = X1 - X0 - 4
targetHeight = Y1 - Y0 - 4

' 加入圖片,先放大一點
Set pic = .Shapes.AddPicture(photo_path, True, True, X0 + 2, Y0 + 2, -1, -1)

' 鎖定比例不變
pic.LockAspectRatio = msoTrue

' 根據原始比例決定是縮放寬還是高
If (pic.Width / pic.Height) > (targetWidth / targetHeight) Then
' 圖片比較寬,以寬度為主
pic.Width = targetWidth
Else
' 圖片比較高,以高度為主
pic.Height = targetHeight
End If

' 根據調整後寬度重新置中 (optional)
pic.Left = X0 + ((X1 - X0) - pic.Width) / 2

Call AddText(X1 - 100, Y1 - 30, 25, 40, tranDate(checkday), 3) '額外接入之checkday要顯示於照片右下角

End With

End Sub

二、資料夾照片順序與檔案順序不一致

從LINE相簿下載的照片名稱雖然上面有順序,但是匯入施工照片VBA之後卻不會按照原本的順序進行排列?

Fig1. 原本的順序是(1).(2).(3)...(10)...(100)...
Fig2. 當引入之後會變成(1).(10).(100)...

發生原因

對於數字而言,1.2.3...10.11...100.101...這樣排序會正常運作,但是在excel中,名稱所有的數字都會變成文字來處理,所以1的後面是10,再來是100

解決方案

把原本是數字的部分通通變成3碼,001.002.003.....010.011.....100,他就會照這樣排序上去了。

可想而知,如果各位要這樣一筆一筆手動修改也是很累人的一件事,所以此時就可以寫個VBA工具將檔案名稱做關鍵字拆分,取出最後的編號部分,用格式化選項作成三碼的數字,重新併回去產製新的照片名稱。

一般來說,LINE是存放檔案的最大宗,從相簿下載回電腦的名稱為LINE_ALBUN_相簿名稱_相簿日期_流水號.jpg,此時就能透過這個方式先將流水號拆出來,再將流水號修改為固定三位數的流水號。

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
Sub renameFiles()
Dim main_path As String
Dim fileName As String
Dim newFileName As String
Dim pos As Long
Dim posDot As Long
Dim numPart As String
Dim ext As String

' 取得資料夾路徑
main_path = Sheets("Main").Range("B2").Value

If Right(main_path, 1) <> "\" Then
main_path = main_path & "\"
End If

fileName = Dir(main_path & "*.*")

Do While fileName <> ""
pos = InStrRev(fileName, "_") ' 找到最後一個 "_"
posDot = InStrRev(fileName, ".") ' 找到最後一個 "."

If pos > 0 And posDot > pos Then

numPart = mid(fileName, pos + 1, posDot - pos - 1)

If IsNumeric(numPart) Then

numPart = Format(CLng(numPart), "000")

newFileName = Left(fileName, pos) & numPart & mid(fileName, posDot)

Name main_path & fileName As main_path & newFileName

Debug.Print "Rename: " & fileName & " -> " & newFileName
End If
End If

fileName = Dir
Loop

MsgBox "重新編號完成!", vbInformation
End Sub


三、列印報表時出現不正確的檔案名稱或號碼

Fig3. 資料夾的路徑,含有古字

發生原因

Excel VBA在描述檔案過程會用絕對路徑來進行,當絕對路徑上任一個文字出現特殊符號就會跳該錯誤訊息。

即便用戶在電腦上所見名稱都正常顯示,但是當判讀路徑名稱含有古字,Excel會自動轉譯成?,此時就會變成路徑所禁止的特殊符號,導致錯誤發生。

解決方法

不要執著於一定要把古字打出來,當你發現電腦不能打出這個文字必須要去網路作複製貼上的時候,就用別的字來代替,輸出報表後再來修改。


四、列印報表時如何讓前中後照片剛好放置於同一張報表

發生原因

目前的版本在列印的過程,會由使用者先針對工作表("Result")先進行排序及篩選,處理完後顯示於工作表上的內容會由上而下依序列印,如果指定的報表範本為3張照片一頁,則列印過程中每三張就會自動換頁。

解決方法

承問題一,需要先將照片順序於資料夾中確認完畢,爾後再透過分組列印的方式,強制將前中後照片放置於同一張報表中,分組列印的過程可以在工作表("Result")中以備註或者新增一欄位作為分組列印的依據,列印過程會將相同的內容分到同一組別,達成前中後照片於同一張報表的目的。

  1. 於工作表("Main")中勾選分組列印
  2. 於工作表("Result")中設定某一欄作為分組欄位(同一張報表設定為同一個編號)
  3. 列印報表時選擇該欄作為分組依據
Fig4. 分組列印的畫面
Fig5. 設定某一欄作為分組欄位
Fig6. 分組列印的成果,原本應該是2-3-4,因為分組後變成2-3-,就換到下一頁了!

五、施工前中後照片順序無法正確對應

發生原因

貼上照片的過程,他會直接由檔案名稱作為排序的依據,因此即便檔案名稱有註明OOO_施工前、OOO_施工中、OOO_施工後,他仍然會被OOO所影響他的先後順序。

解決方法

以流水號ID作為檔案名稱的前綴文字,1_OOO_施工前、2_OOO_施工中、3_OOO_施工後,每次在匯入的時候如果發現順序有異常,再針對ID做排序一次即可回歸正確順序。


相關連結

施工照片VBA-實作流程