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

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

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

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

Q&A

解決済

4回答

806閲覧

エクセルマクロでシート名を別ファイルセルからひっぱりたい

urusibara

総合スコア5

VBA

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

0グッド

0クリップ

投稿2020/02/09 14:19

編集2020/02/09 21:56

前提・実現したいこと

請求書.xlsmファイルの集計シートにあるリストのパスから前半.xlsmファイルの同名シートを開いてrange("A5")をコピーして、請求書.xlsmファイルの同名シートのA62にコピーをするコードを調べていますが、うまくいきません
間違っている箇所と修正点などを詳しくご教授ください

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

エラーメッセージ ### 該当のソースコード ソースコード Sub コピー() Dim i As Long Dim strSheetName As String Dim ws01 As Worksheet '集計 Dim ws02 As Worksheet '前半 Dim ws03 As Worksheet '後半 Set ws01 = Worksheets("集計") 'ワークシートの設定 Set ws02 = Worksheets("前半") 'ワークシートの設定 Set ws03 = Worksheets("後半") 'ワークシートの設定 For i = 2 To ws01.Cells(Rows.Count, "A").End(xlUp).Row '2行目~最終データ行までループ strSheetName = Cells(i, "A").Value 'セルの値を取得 Workbooks.Open Filename:="C:\Users\users\Desktop\新しいフォルダー (21)\前半.xlsm" Workbooks("前半.xlsm").Activate Workbooks("前半.xlsm").Worksheets(strSheetName).Range("A5").Copy Workbooks("請求書.xlsm").Worksheets(strSheetName).Range("A62").xlPasteValues Next End Sub ```ここに言語名を入力 VBA ### 試したこと ここに問題に対して試したことを記載してください。 ### 補足情報(FW/ツールのバージョンなど) ここにより詳細な情報を記載してください。

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

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

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

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

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

meg_

2020/02/09 15:12

コードは「コードの挿入」で記入しましょう。
guest

回答4

0

VBA

1Sub コピー() 2 Dim i As Long 3 Dim strSheetName As String 4 Dim wb01 As Workbook '集計 5 Dim ws01 As Worksheet '集計 6 Dim wb02 As Workbook '前半 7 Set wb01 = Workbooks("請求書.xlsm") 8 Set ws01 = Worksheets("集計") 'ワークシートの設定 9 Workbooks.Open Filename:="C:\Users\users\Desktop\新しいフォルダー (21)\前半.xlsm" 10 Set wb02 = Workbooks("前半.xlsm") 11 For i = 2 To ws01.Cells(Rows.Count, "A").End(xlUp).Row '2行目~最終データ行までループ 12 strSheetName = ws01.Cells(i, "A").Value 'セルの値を取得 13 wb01.Worksheets(strSheetName).Range("A62").Value _ 14 = wb02.Worksheets(strSheetName).Range("A5").Value 15 Next 16 Workbooks("前半.xlsm").Close 17End Sub

Copy、PasteValue は、代入に変更しました。
試してないけど。

投稿2020/02/09 22:48

iruyas

総合スコア1067

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

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

urusibara

2020/02/11 08:37

参考になりました! ご教授ありがとうございます!
guest

0

ベストアンサー

こんにちは。
問題のソースコードは、For-Nextループの中でWorkbooks.openをしてしまっているからだと思います。

以下のコードは、ちょっと自分なりに整理したものです。これで動作しました。

1:for i=2 to.... ではなく、もっと簡略化するために for eachにしました。

2:workbooks.openすると、そのブックがactiveになってしまい、別のシート上でEnd(xlDown)とかをやろうとするときは、そのシートactiveにしないとうまくいかないで、意識的にこっちのworkbookをactivateさせたりしています。

ご参考になれば.....

VBA

1Sub コピー() 2 3 'Dim i As Long - 変数 i は不要になりました 4 Dim strSheetName As String 5 6 Dim ws01 As Worksheet '集計 7 Dim ws02 As Worksheet '前半 8 Dim ws03 As Worksheet '後半 910 Dim wbZenhan As Workbook '前半.xlsmです 11 Dim wbSeikyusho As Workbook '請求書.xlsmです 12 13 'このコードがある"請求書.xlsm" を wbSeikyusho とします 14 Set wbSeikyusho = ThisWorkbook 15 16 Set ws01 = wbSeikyusho.Worksheets("集計") 'ワークシートの設定 17 Set ws02 = wbSeikyusho.Worksheets("前半") 'ワークシートの設定 18 Set ws03 = wbSeikyusho.Worksheets("後半") 'ワークシートの設定 19 20 '前半.xlsmを開きつつ、セットします 21 Set wbZenhan = Workbooks.Open("C:\Users\users\Desktop\新しいフォルダー (21)\前半.xlsm") 22 23 'Workbooks.openすると、そのブックがアクティブになってしまうので、 24 'こちらの”請求書.xlsm"ブックをアクティベートしなおしています 25 wbSeikyusho.Activate 26 27 Dim r As Range 'for eachするための変数です 28 29 For Each r In ws01.Range("A2", Range("A1").End(xlDown)) '2行目〜最終データ行までループ 30 31 strSheetName = r.Value 'セルの値を取得 32 33 '前半.xlsmにある、各シートのA5セルの内容を、請求書.xlsmにある、同名のシートのA62セルに転記する 34 wbSeikyusho.Worksheets(strSheetName).Range("A62") = _ 35 wbZenhan.Worksheets(strSheetName).Range("A5").Value 36 37 Next r 38 39 '”前半.xlsm"を閉じます 40 wbZenhan.Close 41 42End Sub 43

投稿2020/02/10 09:44

AkiSaito

総合スコア110

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

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

urusibara

2020/02/11 08:36

実行することができました! ご教授ありがとうございます!
guest

0

初めて投稿しますが、、
strSheetName = Cells(i, "A").Value で代入したシート名は前半.xlsmを開いたシート名ですか?
もしそうであっても、次のシート名はどうでしょう?
Workbooks("前半.xlsm")内のシートを確認して、あれば実行、なければ、、、のようにする必要があると思いますが、、

Dim TrgSht As Worksheet For Each TrgSht In Workbooks("前半.xlsm").Worksheets'前半.xlsmのすべてのシートオブジェクトに対し If strSheetName = TrgSht.Name Then 'あった場合処理 End If Next TrgSht

投稿2020/02/10 06:36

Q_Zoo

総合スコア16

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

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

urusibara

2020/02/11 08:37

参考になりました! ご教授ありがとうございます!
guest

0

間違っている箇所と修正点

えっと、前提条件として、エクセルのファイルを開くと、
エクセルから見たら、それは「ブック」になります。
ブックの中にはいくつかの「シート」があり、
シート上には多数のセルが存在しているわけです。

請求書.xlsmファイルの集計シートにあるリストのパスから前半.xlsmファイルの同名シートを開いて

1)「請求書.xlsm」ブックの「集計」シートのセル上にリストがある
2)それのどのセルに、パス(ファイルのフルパス?フォルダーのパス?)があるかを指定し取得
3)そのファイルを開く
4)もし、開いたファイルのブック名が「前半.xlsm」なら
5)「前半」(ブックと同じ名前ではないですよね?)シート
(ブックには1つしかシートが無い?)を見て(開くのはファイルでシートは指定だけで良い)、
どのセルを見て値を取得して転記

まずはこれが出来るように書いてみてください。
この辺の前提条件などの理解があやふやなので、
上手くVBA語で表現出来ないのかなと思いました。

ループはこれを繰り返すだけなので、まずは1件を処理できるようになってください。

投稿2020/02/09 23:07

編集2020/02/09 23:09
mattuwan

総合スコア2136

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

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

urusibara

2020/02/11 08:37

参考になりました! ご教授ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問