這個是在Line Excel VBA社群的問題
發問者提供了操作影片跟檔案,所以可以很好理解所遇到的問題
原始檔案利用VBA寫了兩個程序
檔案一開始就存在的圖檔可以刪除
後來新增的圖檔卻不能刪除
研究了一下
發現這是圖檔類型(MsoShapeType)的問題
程式碼是利用 Sheet.Pictures.Insert()方法插入的圖片
圖檔類型是msoLinkedPicture
但是檔案一開始就存在的圖片應該是在工作表透過插入/圖片的方式
這樣圖檔類型會是msoPicture
從名稱就可以看出差別
前者是連結圖檔而已,所以當圖檔改變名稱或位置時
工作表就會讀不到圖檔
單就無法刪除圖檔的問題,只需要多一個條件就可以了
原始程式碼只有判別 msoPicture
1 2 3 |
For Each a In ActiveSheet.Shapes If a.Type = msoPicture Then a.Delete Next |
增加另一個 msoLinkedPicture的條件
1 2 3 |
For Each a In ActiveSheet.Shapes If a.Type = msoPicture Or a.Type = msoLinkedPicture Then a.Delete Next |
但是比較好的方式是將匯入程式碼改為利用 Sheet.Shapes.AddPicture()
AddPicture (FileName、 LinkToFile、 SaveWithDocument、 Left、 Top、 Width、 Height)
而且這個方式也可以在參數設定時,設定成以連結方式讀取圖檔
原始程式碼
工作表的B欄儲存檔案名稱,而圖檔跟工作簿是放在同一個資料夾內
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
With Sheets("清冊") lRow = .[b65536].End(xlUp).Row For I = 2 To lRow On Error Resume Next 'strFile = ThisWorkbook.Path & "\" & .Cells(i, 4) & ".jpg" strFile = ActiveWorkbook.Path & "\" & .Cells(I, 2) & ".jpg" Set oPic = .Pictures.Insert(strFile) With .Cells(I, 3) oPic.Top = .Top oPic.Left = .Left oPic.Width = 60 oPic.Height = 70 End With Set oPic = Nothing Next I End With |
修改後的程式碼
1 2 3 4 5 6 7 8 9 10 11 |
With Sheets("清冊") lRow = .[b65536].End(xlUp).Row For I = 2 To lRow On Error Resume Next 'strFile = ThisWorkbook.Path & "\" & .Cells(i, 4) & ".jpg" ' strFile = "C:\Users\trico\Pictures" & "\" & .Cells(I, 2) & ".jpg" strFile = ActiveWorkbook.Path & "\" & .Cells(I, 2) & ".jpg" Set oPic = .Shapes.AddPicture(strFile, msoFalse, msoTrue, Cells(I, 3).Left + 2, Cells(I, 3).Top + 1, 120, 70) Set oPic = Nothing Next I End With |
補充
當 LinkToFile 為msoFalse時, SaveWithDocument必須為msoTrue,插入的圖檔類型為 msoPicture
但是LinkToFile 為msoTrue時, SaveWithDocument無論是msoTrue或msoFalse,插入的圖檔類型都是 msoLinkedPicture
備註1
比較奇怪的點,同樣的圖片寬度設定,使用Shapes.AddPicture()插入的圖檔大小只有Pictures.Insert()的一半
所以在 Shapes.AddPicture()的寬度設定為Pictures.Insert()的2倍 (60→120)
不過後來發現在 Pictures.Insert()的寬度跟高度只要擇一設定就好了
現在的圖檔是會以高度等比例調整寬度,所以最終寬度其實不是60
備註2
Pictures.Insert()找不到官方的說明資料
找到的都是教學類或者論壇的使用範例