将图片从用户窗体复制到电子表格
Copy picture from userform to spreadsheet
我将图片加载到包含在用户窗体中的图像控件中。我想从用户窗体图像控件复制图片并将其粘贴到电子表格中。我找到了一种在电子表格中创建 OLEObject 并以这种方式移动图像的方法 here ,但我正在创建多个电子表格并且我不想要所有额外的对象。
如果我进入 VBA 编辑器,进入用户窗体,进入图像控件,并使用我的鼠标,select 图片 属性 中的(位图)并复制它,我可以只将图片粘贴到电子表格中。
如果我用宏录制器来做同样的事情,代码自然就只有select和粘贴方法了。如果我在代码中引用相同的图片 属性,我得到的只是句柄。
我搜遍了,我相信穷尽了,我在VBA中找不到任何编程抓取句柄和粘贴图片的方法。我对 VBA 还很陌生,API 级别的工作远远超出了我目前的能力范围。
您可以导出到临时文件并从那里加载:
Private Sub UserForm_Activate()
TransferToSheet Me.Image1, Sheet1
End Sub
Private Sub TransferToSheet(picControl, sht As Worksheet)
Const TemporaryFolder = 2
Dim fso, p
Set fso = CreateObject("scripting.filesystemobject")
p = fso.GetSpecialFolder(TemporaryFolder).Path & "\" & fso.gettempname
SavePicture picControl.Picture, p
sht.Pictures.Insert p
fso.deletefile p
End Sub
Tim Williams 使用 Pictures.Insert
方法的解决方案会在图像中插入 link。如果要将图像 嵌入 到工作表中,最好使用 shape
对象,如 here 所述。
我更改了@Tim Williams 代码以粘贴到 Range
而不是 worksheet
并添加了一个部分以删除目标范围内预先存在的形状。
Private Sub TransferToRange(picControl, destRange As Range)
Const TemporaryFolder = 2
Dim shp As Shape
Dim ws As Worksheet
Dim fso As Variant
Dim p As String
Set ws = destRange.Parent
'
' delete visible shapes of picture type at the destRange position
'
For Each shp In ws.Shapes
' picture
If shp.Type = msoPicture Then
' visible
If shp.Visible = msoTrue Then
' position
If shp.Top = destRange.Top And shp.Left = destRange.Left Then
shp.Delete
End If
End If
End If
Next
'
' Save Form.Image.Picture to temporary folder
'
Set fso = CreateObject("scripting.filesystemobject")
p = fso.GetSpecialFolder(TemporaryFolder).Path & "\" & fso.gettempname
SavePicture picControl.Picture, p
'
' Add a Shape-Object to hold a picture
'
With ws.Shapes.AddPicture(Filename:=p, linktofile:=msoFalse, _
savewithdocument:=msoCTrue, Left:=destRange.Left, Top:=destRange.Top, Width:=-1, Height:=-1)
'
' additional settings - if required
'
.Placement = xlMove
.OLEFormat.Object.PrintObject = msoTrue
.OLEFormat.Object.Locked = msoTrue
End With
'
' delete temporary file
'
fso.deletefile p
End Sub
我将图片加载到包含在用户窗体中的图像控件中。我想从用户窗体图像控件复制图片并将其粘贴到电子表格中。我找到了一种在电子表格中创建 OLEObject 并以这种方式移动图像的方法 here ,但我正在创建多个电子表格并且我不想要所有额外的对象。
如果我进入 VBA 编辑器,进入用户窗体,进入图像控件,并使用我的鼠标,select 图片 属性 中的(位图)并复制它,我可以只将图片粘贴到电子表格中。
如果我用宏录制器来做同样的事情,代码自然就只有select和粘贴方法了。如果我在代码中引用相同的图片 属性,我得到的只是句柄。
我搜遍了,我相信穷尽了,我在VBA中找不到任何编程抓取句柄和粘贴图片的方法。我对 VBA 还很陌生,API 级别的工作远远超出了我目前的能力范围。
您可以导出到临时文件并从那里加载:
Private Sub UserForm_Activate()
TransferToSheet Me.Image1, Sheet1
End Sub
Private Sub TransferToSheet(picControl, sht As Worksheet)
Const TemporaryFolder = 2
Dim fso, p
Set fso = CreateObject("scripting.filesystemobject")
p = fso.GetSpecialFolder(TemporaryFolder).Path & "\" & fso.gettempname
SavePicture picControl.Picture, p
sht.Pictures.Insert p
fso.deletefile p
End Sub
Tim Williams 使用 Pictures.Insert
方法的解决方案会在图像中插入 link。如果要将图像 嵌入 到工作表中,最好使用 shape
对象,如 here 所述。
我更改了@Tim Williams 代码以粘贴到 Range
而不是 worksheet
并添加了一个部分以删除目标范围内预先存在的形状。
Private Sub TransferToRange(picControl, destRange As Range)
Const TemporaryFolder = 2
Dim shp As Shape
Dim ws As Worksheet
Dim fso As Variant
Dim p As String
Set ws = destRange.Parent
'
' delete visible shapes of picture type at the destRange position
'
For Each shp In ws.Shapes
' picture
If shp.Type = msoPicture Then
' visible
If shp.Visible = msoTrue Then
' position
If shp.Top = destRange.Top And shp.Left = destRange.Left Then
shp.Delete
End If
End If
End If
Next
'
' Save Form.Image.Picture to temporary folder
'
Set fso = CreateObject("scripting.filesystemobject")
p = fso.GetSpecialFolder(TemporaryFolder).Path & "\" & fso.gettempname
SavePicture picControl.Picture, p
'
' Add a Shape-Object to hold a picture
'
With ws.Shapes.AddPicture(Filename:=p, linktofile:=msoFalse, _
savewithdocument:=msoCTrue, Left:=destRange.Left, Top:=destRange.Top, Width:=-1, Height:=-1)
'
' additional settings - if required
'
.Placement = xlMove
.OLEFormat.Object.PrintObject = msoTrue
.OLEFormat.Object.Locked = msoTrue
End With
'
' delete temporary file
'
fso.deletefile p
End Sub