2016-11-09 14 views
0

私はExcel 2007のためのマクロを取得しようとしている画像の束とフォルダを開きます。次に、新しいブックを作成し、そのブックにイメージを埋め込みます。新しいワークブックを開いてVBAでイメージを追加する方法は?

すべては私がラインSheet.Shapes.AddPicture FileName:=F, linktofile:=msoFalse, savewithdocument:=msoCTrue, Left:=cell.Left + 5, Top:=cell.Top + 5, Width:=560, Height:=310をコメントアウトした場合、私はその行のコメントを解除した場合、私が得る作品「実行時エラー 『434』:オブジェクトが必要」

を私はSheet.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 
+0

あなたは** Name **、** cell **という名前の変数と他の予約された名前を使用しています。このため、エラーが発生します。私はいつもあなたの変数名を可変識別子で導くことをお勧めします。たとえば、整数の場合は** i **、文字列の場合は** s **、予約名は使用しないことを保証してください。 – cyberponk

答えて

3

文字列「C1」を作成してセルを定義することはできません。これはアドレスだけです。あなたがやったやり方では、cellは文字列であり、文字列には何もプロパティがありません。あなたはそれを忘れないようにどちらかのあなたはいつもDimすべての変数、あなたのモジュールの上にOption Explicitを使用する必要があります

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

または

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

を使用するので、何が欲しいの範囲オブジェクトです;)

これはしばしば間違いを防止します。もちろん、正しいタイプ、つまりDim FilePath As StringDimを入力する必要があります。

0

正しいコマンドは次のようになります。

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

私は強くそれがエクセルの最近のバージョンでエラーが発生しますと、あなたが、あなたの名前変数名を変更することをお勧めします。

+0

変数として 'Name'を使用すると、いつエラーが発生しますか?私はそれが変数として使用されるべきではないことに同意しますが、文字列変数として正しく使用されている限り、それはまだ動作するはずです。 – arcadeprecinct

+0

私は2016年のエクセルで** **名前**が予約されていることがわかります。これを変数として使用すると、実行時エラー '1004'が発生します。 – cyberponk

+0

奇妙なことに、私はExcel 2016を使っていて、他の変数と同じように 'Name'を使うことができます。私は、実際の 'ActiveCell'オブジェクトを使用しようとしない限り、エラーを起こさずに文字列変数として' ActiveCell'のようなものを使うことさえできます。多分私が設定していないオプション? – arcadeprecinct

関連する問題