質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

1回答

1048閲覧

VBA:Book1.XlsからBook2.Xlsmへの値の取得、貼り付けを繰り返しで行いたい

vivid

総合スコア8

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

1クリップ

投稿2018/07/03 06:11

編集2018/07/03 07:47

前提・実現したいこと

VBAの学習を初めて理解していない点があるのですが。
BookA.xlsから今回作成予定のBookB.xlsmにデータのコピーと貼り付けを行いたいと考えています。
また、繰り返し処理で行いたいと考えています。
BookA.xlsのセル"B10"をBookB.xlsmの"C5"に入れる
BookA.xlsのセル"B11"をBookB.xlsmの"C6"に入れる
BookA.xlsのセル"B12"をBookB.xlsmの"C7"に入れる



BookA.xlsのセル"Bx"の値が空白ならば繰り返し終了

発生している問題・エラーメッセージ

'Range'メソッドは失敗しました:'_Worksheet'オブジェクト

該当のソースコード

VBA

1Sub Execution() 2 3 Dim wFile As String 4 Dim i As Integer 5 6 Dim Sheet1 As Worksheet 7 Dim Sheet2 As Worksheet 8 9 '画面の描画オフ 10 Application.ScreenUpdating = False 11 12 'パスを取得 13 wFile = Range("F2").Value 14 'ファイルを開く 15 Workbooks.Open wFile 16 17 '設定 18 i = 1 19 20 Set Sheet1 = Workbooks("BookA.xlsx").Worksheets("sheet1") 21 Set Sheet2 = Workbooks("BookB.xlsm").Worksheets("sheet1") 22 23 24 Do While Cells(i + 9, "B").Value <> "" 25 Sheet2.Range(i + 4, "C").Value = Sheet1.Range(i + 9, "B").Value 26 i = i + 1 27 28 Loop 29 30 31 '描画オン 32 Application.ScreenUpdating = True 33 34 'ファイルクローズ 35 Excel.Application.CutCopyMode = False 36 ActiveWorkbook.Close SaveChanges:=False 37 38 39End Sub

試したこと

知識が浅く、具体的な方法を見つけられていません。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

外していたらすみません。

Sheet2.Range(i + 4, "C").Value = Sheet1.Range(i + 9, "B").Value
↑ここの指定は、Cellsでないといけません。
Rangeは、Range("B4")でB4セル一つを指定したり、Range(Cells(1.1),Cells(6,5)) のようにA1からE6までの範囲を指定するなどには使用できますが、セル一個を行、列で指定するとこのエラーがでます。

またこのVBAは、BookB.xlsmにおかれていますか?
だとすると、自身を示すのは、ThisWorkbookなので

Set Sheet2 = Workbooks("BookB.xlsm").Worksheets("sheet1")

あたりも曖昧になってしまうと思います。

Workbookの指定と、Range指定を追加して修正すると、こんな風になるかと思います。

Sub Execution()

Dim wFile As String
Dim i As Integer

Dim wkb01 As Workbook
Dim wkb02 As Workbook

Dim Sheet1 As Worksheet
Dim Sheet2 As Worksheet

Dim Range1 As Range
Dim Range2 As Range

'画面の描画オフ
Application.ScreenUpdating = False

'パスを取得
wFile = Range("F2").Value
'ファイルを開く
Set wkb01 = Workbooks.Open(Filename:=wFile, ReadOnly:=True, UpdateLinks:=0)
Set wkb02 = ThisWorkbook

'設定
i = 1

Set Sheet1 = wkb01.Worksheets("sheet1")
Set Sheet2 = wkb02.Worksheets("sheet1")

Do

Set Range1 = Sheet1.Cells(i + 9, 2)

If Range1.Value = "" Then
Exit Do
End If

Set Range2 = Sheet2.Cells(i + 4, 3)

Range2.Value = Range1.Value

i = i + 1

Loop

'描画オン
Application.ScreenUpdating = True

'ファイルクローズ
Excel.Application.CutCopyMode = False
wkb01.Close SaveChanges:=False

End Sub

ActiveWorkbookも、状況により、想定外のシートが操作されるので、明確に「このブックだ!」と指定した方がトラブルが少ないと思われます。

回答には慣れていないので、外していたらすみません。

投稿2018/07/03 08:11

ky_46

総合スコア92

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

vivid

2018/07/03 08:33

ありがとうございます。 VBAはBookB.xlsmになります。 また、この手法で解決いたしました。 ありがとうございました。 Cellsについての知識が不足していることが確認できたので理解を深めようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問