學習資源:《Excel VBA從入門到進階》第44集 by蘭色幻想
本節來學習如何處理VBA圖片與圖形處理,用到的是VBA的shape對象。
Shape 對象,該對象代表工作表或圖形工作表上的所有圖形,它是sheets和chart的子對象(屬性)。下表列出shape部分常用屬性。

獲取單元格sheet.shape.topleftcell.address
使用示例:獲取shape的l類型。
Dim ms As Shape
Cells(k, 1) = ms.Type

關於shape對象的添加、編輯、變換位置等操作,在這邊就略過了。因為這部分內容太多,使用起來也復雜,需要用到時就使用錄制宏來獲取代碼吧。
下面學三段常用的代碼:
1. 圖片批量導入
例題:在B例批量導入A列名稱的對應圖片。


思路:插入圖形,在圖形上填充圖片。
因為部分圖片分辨率過大,直接插入,可能會導致文件很大。在圖形上插入,可以控制圖片的大小,和壓縮圖片。
提示:關於如何插入圖形,可以錄制一個插入圖形並填充圖片的宏,獲得代碼后再套上循環改寫。
Sub 圖片導入()
Dim S As Shape
Dim RG As Range
'刪除已有圖片
For Each S In ActiveSheet.Shapes
If S.Type <> 8 Then '有插入一個窗體控件指定宏
S.Delete '把不是窗體控件的shape(圖片、圖形等)清除
End If
Next S
'導入圖形
For Each RG In Range("B2:B5")
'插入矩形msoShapeRectangle,它的左邊距、頂點、寬度、高度都引用RG單元格的
ActiveSheet.Shapes.AddShape(msoShapeRectangle, RG.Left, RG.Top, RG.Width, RG.Height).Select
'RG單元格左邊單元格填寫了圖片名稱,填充對應圖片到矩形里。
Selection.ShapeRange.Fill.UserPicture "C:\" & RG.Offset(0, -1) & ".jpg"
Next RG
End Sub
運行示例(逐步展示導入圖片,實際用時其實是一秒多):

2. 批量插入復選框
例題:在B例批量導入復選框。

提示:先錄制一個插入復選框的宏,獲得代碼后再套上循環改寫。
Sub 批量插入復選框()
Dim RG As Range
Dim S As Shape
'刪除已有復選框
For Each S In ActiveSheet.Shapes
If InStr(S.Name, "Ch") > 0 Then '復選框的名稱是Check box
S.Delete
End If
Next S
'批量插入復選框
For Each RG In Range("B2:B15")
'插入復選框CheckBoxes,它的左邊距、頂點、寬度、高度都引用RG單元格的
ActiveSheet.CheckBoxes.Add(RG.Left, RG.Top, RG.Width, RG.Height).Select
'復選框的文本為“是”,值為空,鏈接的單元格是RG的位置
With Selection
.Characters.Text = "是"
.Value = xlOff
.LinkedCell = RG.Address
End With
'把RG單元格的字體顏色變成白色,否則打勾會顯示True和False
RG.Font.ThemeColor = xlThemeColorDark1
Next RG
End Sub
運行示例(逐步批量插入復選框,實際用時不過1秒多):

3. 連線
例題:把相同內容的單元格連線起來。

Sub 連線()
Dim rg1 As Range, rg2 As Range, rg3 As Range, rg4 As Range
Dim S As Shape
Dim RG As Range
'刪除已有線條
For Each S In ActiveSheet.Shapes
If S.Type = 9 Then
S.Delete
End If
Next S
'連線
Set rg1 = Range("B1")
Set rg2 = Range("B2")
Set rg3 = Range("C2")
Set rg4 = Range("C1")
'控制起點和終點,起點為B列單元格的左邊線中點,終點為C列單元格的左邊線中點
'沒有右邊線的說法,所以不能把起點設為A列單元格的右邊線中點
ActiveSheet.Shapes.AddLine(rg1.Left, rg1.Top + rg1.Height / 2, rg3.Left, rg3.Top + rg3.Height / 2).Select
Selection.ShapeRange.Line.EndArrowheadStyle = msoArrowheadTriangle
ActiveSheet.Shapes.AddLine(rg2.Left, rg2.Top + rg2.Height / 2, rg4.Left, rg4.Top + rg4.Height / 2).Select
Selection.ShapeRange.Line.EndArrowheadStyle = msoArrowheadTriangle
End Sub
運行示例(逐步進行連線,實際用時不超1秒):

小結
這些例題都比較簡單,尤其第三道,只是想把幾個可能常用到的實例介紹出來,要想把它們化為己用的話肯定要改寫一下,如果需要用到沒講的功能就使用錄制宏來獲取代碼吧,不細講了~
這幾天有看視頻的,就是不知道該怎么做筆記了,因為有些內容也沒聽太明白,后面可能還會慢更(捂臉……讓我想想該怎么做之后的筆記會比較好……