プロが教える店舗&オフィスのセキュリティ対策術

以下のような構文で他のブックからデータ貼付を実行するマクロを作成しています。
最後の値のみ貼付る構文が間違っているようで
「Rangeクラスのcopyメソッドが失敗しました。」エラーメッセ―ジが出てしまいます。
どこが間違っているのでしょうか?

Option Explicit
Public Sub Macro1()
Dim Thisbook_path As String
Dim Excel_path As String
Dim Excel_name As String
'実行中のマクロが記述されているブックのフォルダへの絶対パス
Thisbook_path = ThisWorkbook.Path

Excel_path = Thisbook_path & "\" & Worksheets("本店").Cells(4, 1).Value & ".xlsm"
Excel_name = Worksheets("本店").Cells(4, 1).Value & ".xlsm"

MsgBox (Excel_name)
If Dir(Excel_path) = "" Then
MsgBox (Excel_path & "が存在しません")
Exit Sub
End If
Workbooks.Open Excel_path
ThisWorkbook.Activate
Workbooks(Excel_name).Worksheets("集計").Range("B1").Copy Destination:=Worksheets("本店").Range("B20").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Workbooks(Excel_name).Close
End Sub

A 回答 (3件)

細かな所までは見ていませんが、ほんのちょっとの、微妙な所ではないでしょうか。


>ThisWorkbook.Activate
これが要らないと思います。
最後にブックを締めるときに邪魔にならないように、False を入れました。

'//
Public Sub Macro1()
Dim Thisbook_path As String
Dim Excel_path As String
Dim Excel_name As String

Thisbook_path = ThisWorkbook.Path

Excel_name = ThisWorkbook.Worksheets("本店").Cells(4, 1).Value & ".xlsm"

Excel_path = Thisbook_path & "\" & Excel_name

MsgBox (Excel_name)
If Dir(Excel_path) = "" Then
 MsgBox (Excel_path & "が存在しません")
 Exit Sub
End If
Workbooks.Open Excel_path 'Activate を抜きました。
Workbooks(Excel_name).Worksheets("集計").Range("B1").Copy
ThisWorkbook.Worksheets("本店").Range("B20").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Workbooks(Excel_name).Close False '←ここにFalse を加えました。
End Sub
    • good
    • 0
この回答へのお礼

大変わかりやすく教えて頂きまして、誠に有難うございました。
無事に動作することができ、大変大変助かりました。
心より御礼申し上げます。
ありがとうございました。

お礼日時:2016/07/29 19:09

失礼。

ファイルの有無チェックまで消してしまいましたが そっちは残しておいた
方がいいですね。
    • good
    • 0
この回答へのお礼

ご回答いただきまして誠に有難うございました。
コピーするセルが1セルになっておりましたが、実際はもっと広い範囲指定をして使用するものでした。
最初に貼付した構文が間違っておりまして、かえってご迷惑をおかけしてしまいましたことお詫び申し上げます。
でも、新しい考え方を教わりましたので、今後に生かしていきたいと思います。
ご教授ありがとうございました。

お礼日時:2016/07/29 19:11

最後の方が訳の分からない状態になってますね。



ただ見たところコピーするのは1セルなんですよね。だったらコピーなんてしなくても
数式で外部参照して その数式を値に戻せばいいんじゃないですか?

Dim Excel_name As String
Dim siki As String
Excel_name = Worksheets("本店").Cells(4, 1).Value & ".xlsm"
siki = "='" & ThisWorkbook.Path & "\[" & Excel_name & "]集計'!B1"

With Worksheets("本店").Range("B20")
.Formula = siki
.Value = .Value
End With
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A