坑你沒商量,EXCEL插入圖片也帶“坑

淩動職場表 2024-04-20 01:46:51

在EXCEL中插入圖片是常規的不能再常規的動作,一般的人無非就是選擇“插入”--“圖片”,就把圖片插入到工作表中去了。

沒錯!但是你想過沒有,要成千上萬張地插入圖片,並按一定的順序排列時,如下圖所示的樣子,難道你還是用手工插入嗎?肯定不是!神奇加萬能的VBA呀!

不是一張,是上千張!排到何時?

很不幸,最近做的一個項目就是用VBA實現批量插圖的案子,但接連踩坑,爲了提醒自己和別人,我把我處理的全過程記錄下來,如果你有緣看到了,不想點個贊再走,謝謝!

第一坑:使用平台內置接口

考慮到客戶不是一個人使用,需要多個人同時協作生成批量的“圖文檔”,馬上想到的是使用平台代碼來實現,于是第一版就寫了如下代碼:

作用:實現插入圖片

參數:帶完整路徑的圖片文件名字

返回值:沒有

示例:

Sub CommandButton1_Click()

‘定義接口變量

Dim sErr As String

Dim sResult As String

Dim obj As Object

‘獲取高士達雲平台的編程接口

Set obj = Application.COMAddIns.Item("prjAddin.Office_Addin").Object

‘通過接口調用InsertRowCol

obj.InsertPic “ D:\Img\user.jpg”

‘釋放編程接口

Set obj = Nothing

End Sub

解說:在當前圖片項目的單元格中插入來自“ D:\Img\user.jpg”的圖片

終于成功了,可是圖片不能緊貼著單元格,且長寬比不能調整。好吧,算我輸。

第二坑:錄制宏獲得插入圖片代碼

一計不成,立馬心生另一計。通過錄制宏的辦法,獲得插入圖片的代碼。考慮到表格和圖片排版的位置還不一樣,把表格搞成了鏈接圖片的樣子。大力出奇迹,寫出了如下代碼:

Sheet4.Cells(圖1, c).Select

當前樹木 = Range("第一行") '用于獲取出錯時樹木編號

mypic = choosefolder & "\" & Range("第一行") & i & ".jpg" '路徑+項目編號+順序號

ActiveSheet.Pictures.Insert(mypic).Select '插圖

Selection.ShapeRange.LockAspectRatio = msoFalse '取消行列限制

Selection.ShapeRange.Height = 113.3858267717 '高4CM

Selection.ShapeRange.Width = 85.0393700787 '寬3CM

終于成功了,挺有自豪感的。

可是高興得太早了,客戶一使用反饋了兩個問題:一是數量太大時,速度很慢;二是生成好的結果複制到另一台電腦時圖片全丟失了。

暈,怎麽會這樣?

第三坑:上網找來神代碼

爲什麽慢,原來是鏈接表格圖片的問題。爲什麽丟圖,原來是這種代碼插入的圖片相當于插入圖片時默認選擇了“鏈接圖片”形式,也就是說圖片沒插入到工作簿中。

幾番搜索,找來一段別的高手代碼,修改使用。

For i = 2 To Cells(Rows.Count, cellcolumn).End(xlUp).Row '數字2是設置開始填充圖片的行號是第2行

For j = 1 To UBound(pictype)

If Dir(picads & Cells(i, cellcolumn) & pictype(j)) <> "" Then

Cells(i, piccolumn) = "MMT" '表格填圖

ActiveSheet.Shapes.AddShape(msoShapeRectangle, (Cells(i, piccolumn).Left + 0.5), (Cells(i, piccolumn).Top + 0.5), (Cells(i, piccolumn).Width - 1), (Cells(i, piccolumn).Height - 1)).Fill.UserPicture picads & Cells(i, cellcolumn) & pictype(j)

Exit For '插入圖片,退出循環

End If

Next j

Next i

天!夠複雜的。原理無非是先插入一個矩形框,再往框中填充圖片。感覺仍不是理想。

終極解決方案:直接插入圖片

幾番摸索,終于找到一個神語句,解決了我的大問題。

Shapes.AddPicture 方法 :從現有文件創建圖片。 返回一個 Shape 對象,該對象表示新的圖片。

語法:AddPicture (FileName、LinkToFile、SaveWithDocument、Left、Top、Width、Height )

這個語句不僅插入圖片,而且還可調整圖片大小,有參數控制是不是鏈接。真是踏破鐵鞋無覓處!

現在剩下的問題就是計算每張圖片的位置問題了。好辦!

當前樹木 = Range("第一行") '用于獲取出錯時樹木編號

mypic = choosefolder & "\" & Range("第一行") & i & ".jpg" '路徑+項目編號+順序號

ActiveSheet.Shapes.AddPicture mypic, True, True, ly, Lx1, 85.0393700787, 113.3858267717 '寬3CM,高4CM

幾乎一句話就搞定了。

總結:

不嘗試難修得正果,不積累難成爲高手。願你看完此文少走彎路。

順利放幾張成品圖供參考。

這是主操作界面。

需要打印幾千張這樣的結果圖片。

0 阅读:0

淩動職場表

簡介:感謝大家的關注