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

时间:2016-11-09 16:32:14

标签: excel vba excel-vba

我试图获取Excel 2007的宏来打开一个包含大量图像的文件夹。然后创建一个新工作簿并将图像嵌入其中。

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

我检查Sheet.Shapes是否返回了Shapes对象,但是Shapes对象是空的。当我在宏外部打开的工作簿上尝试Sheet.Shapes,AddPicture时,它会添加图像。我还检查过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

2 个答案:

答案 0 :(得分:3)

您无法通过创建字符串&#34; C1&#34;来定义单元格,而这只是地址。你这样做的方式,cell是一个字符串,一个字符串没有任何属性。你想要的是一个范围对象,所以要么使用

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

Dim cell As Range
Set cell = sheet.Cells(i, 3)

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

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

答案 1 :(得分:0)

正确的命令是:

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

我强烈建议您更改名称变量名称,因为它会导致最近版本的Excel出错。