如何使用VBA打开新工作簿并添加图像?

如何使用VBA打开新工作簿并添加图像?,vba,excel,Vba,Excel,我正在尝试为Excel2007获取一个宏,以打开一个包含一组图像的文件夹。然后创建一个新工作簿并将图像嵌入其中 如果我注释掉行Sheet.Shapes.AddPicture FileName:=F,linktofile:=msoFalse,savewithdocument:=msoCTrue,Left:=cell.Left+5,Top:=cell.Top+5,Width:=560,Height:=310,那么一切都正常了。如果我取消注释该行,我会得到“运行时错误'434:需要对象” 我已经检查了

我正在尝试为Excel2007获取一个宏,以打开一个包含一组图像的文件夹。然后创建一个新工作簿并将图像嵌入其中

如果我注释掉行
Sheet.Shapes.AddPicture FileName:=F,linktofile:=msoFalse,savewithdocument:=msoCTrue,Left:=cell.Left+5,Top:=cell.Top+5,Width:=560,Height:=310,那么一切都正常了。如果我取消注释该行,我会得到“运行时错误'434:需要对象”

我已经检查了该表。Shapes正在返回一个Shapes对象,它是,但Shapes对象是空的。当我尝试在宏外部打开的工作簿上添加Sheet.Shapes和picture时,它会添加图像。我还检查了Sheet.Shapes.AddShape是否与宏中打开的工作簿一起工作,它确实可以

在这一点上,我不知道问题可能是什么。有人有过这方面的经验吗?我应该使用不同的方法吗?提前感谢您的帮助或指导

Sub Macro1()
Dim ImagePath, Flist
ImagePath = GetFolder()
If ImagePath = "" Then Exit Sub
Flist = FileList(ImagePath)
Name = "C:\target.xlsm"
Set Book = Workbooks.Add
Set Sheet = Book.Sheets(1)
For i = 1 To 5
    cell = "C" + CStr(i)
    F = ImagePath + "\" + Flist(i - 1)
        Sheet.Shapes.AddPicture FileName:=F, linktofile:=msoFalse, _
            savewithdocument:=msoCTrue, Left:=cell.Left + 5, Top:=cell.Top + 5, Width:=560, Height:=310
    Next
Book.SaveAs FileName:=Name, FileFormat:=52
Book.Close
End Sub

 Function FileList(ByVal fldr As String) As Variant
'Lists all the files in the current directory
'Found at http://www.ozgrid.com/forum/showthread.php?t=71409
    Dim sTemp As String, sHldr As String
    If Right$(fldr, 1) <> "\" Then fldr = fldr & "\"
    sTemp = Dir(fldr & "*.png")
    If sTemp = "" Then
        FileList = False
        Exit Function
    End If
    Do
        sHldr = Dir
        If sHldr = "" Then Exit Do
        sTemp = sTemp & "|" & sHldr
    Loop
    FileList = Split(sTemp, "|")
End Function

Function GetFolder() As String
Folder:
With Application.FileDialog(msoFileDialogFolderPicker)
    .AllowMultiSelect = False
    .Title = "New Screenshot Folder"
    .Show
    num = .SelectedItems.Count
    If .SelectedItems.Count = 0 Then
        GetFolder = ""
    Else: GetFolder = .SelectedItems(1)
    End If
End With
End Function
Sub宏1()
模糊图像路径
ImagePath=GetFolder()
如果ImagePath=“”,则退出Sub
Flist=文件列表(ImagePath)
Name=“C:\target.xlsm”
设置工作簿=工作簿。添加
设置页=书本页(1)
对于i=1到5
cell=“C”+CStr(一)
F=ImagePath+“\”+Flist(i-1)
Sheet.Shapes.AddPicture文件名:=F,linktofile:=msoFalse_
savewithdocument:=msoCTrue,左:=cell.Left+5,顶部:=cell.Top+5,宽度:=560,高度:=310
下一个
Book.SaveAs文件名:=名称,文件格式:=52
预订,关门
端接头
函数文件列表(ByVal fldr作为字符串)作为变量
'列出当前目录中的所有文件
”“在http://www.ozgrid.com/forum/showthread.php?t=71409
Dim sTemp作为字符串,sHldr作为字符串
如果右$(fldr,1)“\”则fldr=fldr&“\”
sTemp=Dir(fldr&“*.png”)
如果sTemp=“”,则
FileList=False
退出功能
如果结束
做
sHldr=Dir
如果sHldr=“”,则退出Do
sTemp=sTemp&“|”&sHldr
环
FileList=Split(sTemp,“|”)
端函数
函数GetFolder()作为字符串
文件夹:
使用Application.FileDialog(msoFileDialogFolderPicker)
.AllowMultiSelect=False
.Title=“新建屏幕截图文件夹”
显示
num=.SelectedItems.Count
如果.SelectedItems.Count=0,则
GetFolder=“”
其他:GetFolder=.SelectedItems(1)
如果结束
以
端函数

不能通过创建字符串“C1”来定义单元格,这只是地址。按照您的操作方式,
cell
是一个字符串,而字符串没有任何属性。您需要的是一个范围对象,因此

Dim cell As Range
Set cell = sheet.Range("C" & i)

您应该始终
Dim
所有变量,在模块顶部使用
Option Explicit
,这样您就不会忘记它;)


这通常可以防止错误。当然,您应该使用正确的类型
Dim
它们,即
Dim FilePath As String

您不能通过创建字符串“C1”来定义单元格,这只是地址。按照您的操作方式,
cell
是一个字符串,而字符串没有任何属性。您需要的是一个范围对象,因此

Dim cell As Range
Set cell = sheet.Range("C" & i)

您应该始终
Dim
所有变量,在模块顶部使用
Option Explicit
,这样您就不会忘记它;)


这通常可以防止错误。当然,您应该
Dim
使用正确的类型,即
Dim FilePath As String

正确的命令是:

        Sheet.Shapes.AddPicture Filename:=F, linktofile:=msoFalse, _
        savewithdocument:=msoCTrue, Left:=Range(cell).Left + 5, Top:=Range(cell).Top + 5, Width:=560, Height:=310

我强烈建议您更改名称变量名称,因为这会在最新版本的excel中导致错误。

正确的命令是:

        Sheet.Shapes.AddPicture Filename:=F, linktofile:=msoFalse, _
        savewithdocument:=msoCTrue, Left:=Range(cell).Left + 5, Top:=Range(cell).Top + 5, Width:=560, Height:=310

我强烈建议您更改名称变量名,因为这会在最新版本的excel中导致错误。

您使用的变量名为Name、cell和其他保留名称,这肯定会导致错误。我建议始终使用变量标识符作为变量名的前导,如I(如果是整数)、s(如果是字符串)等,以确保它们没有使用保留名称。您使用的是名为Name、cell和其他保留名称的变量,这肯定会导致错误。我建议始终在变量名前面加一个变量标识符,如I(如果是整数)、s(如果是字符串)等,以确保它们不使用保留名称。何时将
Name
用作变量会导致错误?我同意它不应该被用作变量,但只要它被正确使用(作为字符串变量),它应该仍然可以工作?我可以看出,在excel 2016中,名称是保留的。使用此变量将导致运行时错误“1004”。奇怪的是,我使用的是Excel 2016,可以像使用任何其他变量一样使用
Name
。我甚至可以使用类似于
ActiveCell
的东西作为字符串变量,而不会导致错误(当然,除非我尝试使用实际的
ActiveCell
对象)。也许我还没有设置一个选项?请不要使用模糊的名称。当我不调暗变量时,它只会为我创建一个
Variant/String
类型变量。什么时候使用
name
作为变量会导致错误?我同意它不应该被用作变量,但只要它被正确使用(作为字符串变量),它应该仍然可以工作?我可以看出,在excel 2016中,名称是保留的。使用此变量将导致运行时错误“1004”。奇怪的是,我使用的是Excel 2016,可以像使用任何其他变量一样使用
Name
。我甚至可以使用类似于
ActiveCell
的东西作为字符串变量,而不会导致错误(当然,除非我尝试使用实际的
ActiveCell
对象)。也许我还没有设置一个选项?请不要使用模糊的名称。你不会改变一个变量,而是会改变工作表的名称:)当我不调暗它时,它只会为我创建一个
Variant/String
类型变量。