为何VBA代码中.LockAspectRatio = msoTrue报错?求语法修正
修正VBA图片导入代码的LockAspectRatio报错问题
你的代码里.LockAspectRatio = msoTrue报错,核心原因是**Picture对象没有LockAspectRatio属性**,这个属性属于Shape对象。你需要把Picture转换成Shape来操作,或者直接用Shapes.AddPicture方法插入图片,这样能直接控制宽高比。
修正方案一:将Picture转为Shape操作
'Save image to Cell Dim FileName As Variant Dim Img As Picture Dim ImgShape As Shape FileName = Me.TextBox_5 '先赋值再判断,原代码逻辑顺序错误 If FileName <> "" Then With ws Set Img = .Pictures.Insert(FileName) Set ImgShape = .Shapes(Img.Name) '将Picture对象转为Shape对象 With ImgShape .Placement = xlMove .LockAspectRatio = msoTrue '现在可正常调用该属性 .Width = 150 '设置宽度后,高度会自动按比例调整 .Left = .Parent.Cells(lr, "D").Left .Top = .Parent.Cells(lr, "D").Top End With End With End If
修正方案二:直接用Shapes.AddPicture插入图片(更推荐)
这个方法一步到位,无需转换对象,逻辑更简洁:
'Save image to Cell Dim FileName As Variant Dim ImgShape As Shape FileName = Me.TextBox_5 If FileName <> "" Then With ws Set ImgShape = .Shapes.AddPicture( _ Filename:=FileName, _ LinkToFile:=msoFalse, _ SaveWithDocument:=msoTrue, _ Left:=.Cells(lr, "D").Left, _ Top:=.Cells(lr, "D").Top, _ Width:=150, _ Height:= -1 '高度设为-1会自动按宽高比计算 ) ImgShape.Placement = xlMove End With End If
另外注意原代码的两处小问题:
- 原代码先判断
FileName <> ""再赋值,逻辑倒置,应先把TextBox_5的值赋给FileName再判断 lr变量需要提前定义并赋值(比如通过lr = .Cells(.Rows.Count, "D").End(xlUp).Row获取最后一行行号)
内容的提问来源于stack exchange,提问作者Bruce
相关产品推荐
相关产品推荐

