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

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

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

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

コピー

元のオブジェクトを破壊することなく、オブジェクトの複製を生成することをコピーと呼びます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

Q&A

解決済

3回答

1031閲覧

VBAで特定のシートを別ファイルにコピーしたい

退会済みユーザー

退会済みユーザー

総合スコア0

VBA

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

コピー

元のオブジェクトを破壊することなく、オブジェクトの複製を生成することをコピーと呼びます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

0グッド

0クリップ

投稿2020/06/16 09:48

編集2021/02/11 08:28

**
どうやら原因は必要なシートをactivateしていなかった為でした。
7行目と8行目の間に
Workbooks("Profile List Maker.xlsm").Activate
と入れたらうまくいきました!
2021.2

**

VBA初心者です。
元ファイル("C" & VVYear & "年度 新入社員データ.xlsx")から「写真」という言葉が入っているシート名のシートだけを別ファイル("Profile List Maker.xlsm")にコピーしたいのですが、
8行目で「インデックスが有効ではありません」とメッセージが出てしまい、止まってしまいます。
(※コード上にカーソルをあてると、Workbooks("Profile List Maker.xlsm").Worksheets(Worksheets.Count)=「インデックスが有効ではありません」とコメントが出ます)
7行目のワイルドカードの設定がおかしいのでしょうか?
どなたかお力添えいただければ幸甚に存じます。

1:Option Explicit

2:Sub Profile_List_Maker_年度全員(ByVal VVYear As Integer)

3:Dim aa As String, pic As Integer
4:aa = Dir("C" & VVYear & "年度 新入社員データ.xlsx")

5:Workbooks.Open Filename:="C" & VVYear & "年度 新入社員データ.xlsx", ReadOnly:=True

6:For pic = 1 To Worksheets.Count
7: If Workbooks(aa).Worksheets(pic).Name Like "" & "写真" & "" Then
8: Workbooks(aa).Worksheets(pic).Copy after:=Workbooks("Profile List
Maker.xlsm").Worksheets(Worksheets.Count)
9:End If
10:Next

11: Workbooks(aa).Worksheets(VVYear & "年入社 新入社員情報").Copy
after:=Workbooks("Profile List Maker.xlsm").Worksheets(Worksheets.Count)

12:Workbooks(aa).Close Filename:="C" & VVYear & "年度 新入社員データ.xlsx"

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

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

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

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

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

guest

回答3

0

ベストアンサー

下記のコードでうまくいきました。
でも何で Workbooks("Profile List Maker.xlsm").Worksheets(Worksheets.Count) だとコピー先がうまく指定できなかったんだろう...?ブックも指定しているのに。
もしご存じの方がいらしたらご教示お願いします^^;

Option Explicit

Sub Profile_List_Maker_年度全員(ByVal VVYear As Integer)

Dim aa As String, pic As Integer

aa = Dir("C" & VVYear & "年度 新入社員データ.xlsx")

Dim bb As Worksheet
Set bb = Worksheets("作成画面")

Workbooks.Open Filename:="C\" & VVYear & "年度 新入社員データ.xlsx", ReadOnly:=True For pic = 1 To Workbooks(aa).Worksheets.Count If Workbooks(aa).Worksheets(pic).Name Like "*" & "写真" & "?" Then Workbooks(aa).Worksheets(pic).Copy after:=bb End If Next Workbooks(aa).Worksheets(VVYear & "年入社 新入社員情報").Copy after:=ThisWorkbook.Worksheets(Worksheets.Count) Workbooks(aa).Close Filename:="C\" & VVYear & "年度 新入社員データ.xlsx"

投稿2020/06/20 13:14

編集2020/06/20 13:16
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

ワークブックを指定せずに、Worksheets.Count とするとアクティブなワークブックのシート数になります。この時点でアクティブなのはコピー元のブックです。ここはコピー先のブックのシート数にしないとだめなはずです。

ワークブックの指定を省略せずにコードを書くべきです。省略すると操作対象が曖昧になり読みづらいコードになりますし、アクティブなオプジェクトが想定外に変更されたりするとバグの原因になります。

vba

1Option Explicit 2 3Sub Profile_List_Maker_年度全員(ByVal VVYear As Integer) 4 5 Dim pic As Integer 6 7 Dim fromWB As Workbook 'コピー元ブック 8 Set fromWB= Workbooks.Open(Filename:="C\" & VVYear & "年度 新入社員データ.xlsx", ReadOnly:=True) 9 10 Dim toWB As Workbook 'コピー先ブック 11 Set toWB = Workbooks("Profile List Maker.xlsm") 12 13 For pic = 1 To fromWB.Worksheets.Count 14 If fromWB.Worksheets(pic).Name Like "*" & "写真" & "*" Then 15 fromWB.Worksheets(pic).Copy after:=toWB.Worksheets(toWB.Worksheets.Count) 16 End If 17 Next 18 19 fromWB.Worksheets(VVYear & "年入社 新入社員情報").Copy after:=toWB.Worksheets(toWB.Worksheets.Count) 20 21 fromWB.Close 22 23

投稿2020/06/16 13:08

編集2020/06/20 13:05
hatena19

総合スコア34075

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

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

退会済みユーザー

退会済みユーザー

2020/06/20 11:14

返信が遅くなり申し訳ありませんでした。またご説明ありがとうございます。 早速頂いたコードを入れてみたのですが、Set fromWB= Workbooks.Open Filename:="C\" & VVYear & "年度 新入社員データ.xlsx", ReadOnly:=Trueで、「修正候補:ステートメントの最後」とメッセージが出てしまいました。上記だとオブジェクトと認識されないのでしょうか?
hatena19

2020/06/20 13:05

あっ、間違えてました。代入するときは()が必要でした。下記でどうでしょうか。 Set fromWB = Workbooks.Open(Filename:="C\" & VVYear & "年度 新入社員データ.xlsx", ReadOnly:=True)
退会済みユーザー

退会済みユーザー

2020/06/20 13:12

ご教示ありがとうございます。そちらも試したのですが、やはりダメでした。 外部参照のファイルはオブジェクト変数に入れられないのでしょうか...? (ネットや本で調べてみたのですが、載ってませんでした;)
guest

0

「Workbooks("Profile List Maker.xlsm").Worksheets(Worksheets.Count)」でエラーが出ている気がします。
"Profile List Maker.xlsm"にWorksheets.Count枚目のシートは存在していますか?

投稿2020/06/16 12:07

meg_

総合スコア10760

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

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

退会済みユーザー

退会済みユーザー

2020/06/20 11:03

返信が遅くなってしまい、申し訳ありません。 ご指摘の箇所で出ています。hatena19さんのアンサーで理解したのですが、 Worksheets(Worksheets.Count)の前にWorkbooks("Profile List Maker.xlsm")を記述しても、 Workbooks("Profile List Maker.xlsm")の一番右端のシートを意味する訳ではないようですね...。 別ファイル:Workbooks("Profile List Maker.xlsm")に元ファイル:("C\" & VVYear & "年度 新入社員データ.xlsx")の一番右端のシートはコピー前なので、存在していません。
meg_

2020/06/20 12:11

今現在Activeなもの(WorkbookとかWorksheetとか)が何かを意識してコードを書かないと、意図しない動作となることがあります。エラーが出たり、意図しない動きになったときには丁寧にデバッグしましょう。
退会済みユーザー

退会済みユーザー

2020/06/20 13:04

コメントありがとうございます。なんとか自己解決できました。 元ファイルからコピーするシートは下記の二つです。 1.シート名に「写真」という言葉が入っているシート 2.リストの作成元となるデータシート 両シートのコピー先を Workbooks("Profile List Maker.xlsm").Worksheets(Worksheets.Count)としていたのが良くなかったようです。 1.のシートコピー時は別ファイルの3シート目、2.のシートコピー時は別シートの4シート目が指定されるはずなのですが、1.2.ともに元ファイル?の7シート目が指定されてました。 1.のシートのコピー先を別ファイルのシート名<Worksheets("作成画面")>で指定したところ、 VBAが区別して認識できたようです。 でも結局、何故うまく指定できていなかったのかは分かりません。
meg_

2020/06/20 23:05

Worksheets(Worksheets.Count)はシート名ではなく、インデックスでシートを指定しています。 Worksheets.CountにはWorkbookの指定がないため、Activeworkbook.Worksheets.Countと同じになり、それはActiveworkbook("C\" & VVYear & "年度 新入社員データ.xlsx").Worksheets.Countってことかと。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問