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

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

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

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

Q&A

解決済

4回答

1054閲覧

作業ファイルが不確定時の配列ループ

Dis

総合スコア19

VBA

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

0グッド

0クリップ

投稿2020/10/12 11:33

Sub シート収集()

html

1 Dim filePath As Variant 2 filePath = Application.GetOpenFilename( _ 3 FileFilter:="Excelブック(*.xlsx;*.xlsm;*.xls),*.xlsx; *.xlsm; *.xls", MultiSelect:=True) 4 5 Dim file As Variant 6 Dim wb As Workbook 7 Dim i As Long 8 Dim name As Variant 9 name = Array("01北海道", "02東京", "03大阪", "名古屋", "05福岡") 10 11 For Each file In filePath 12 Set wb = Workbooks.Open(file) 13 If Not wb Is Nothing Then 14 Select Case True 15 Case wb.name = name(i) & ".xlsx" 16 wb.Sheets(2).name = name(i) & " 内訳" 17 wb.Sheets(2).Copy Before:=ThisWorkbook.Worksheets(1) 18 End Select 19 wb.Close False 20 End If 21 Next file 22End Sub

**以下の作業は、毎日行われ、開くファイルの数は作業する日によって変わるとします。

**
選択ダイアログで複数ファイルを選択し、thisworkbookに開いたファイルのシートを集めていくというマクロです。

常に配列の01~05全てのファイルと開くとすると問題なく動くのですが、作業するファイルは毎日変わる(01と02のみ動かしたい時もあれば、03と04と05のみ動かしたい時もある)ため、うまくいきません。

html

1 Case wb.name = name(i) & ".xlsx" 2 wb.Sheets(2).name = name(i) & " 別紙" 3 wb.Sheets(2).Copy Before:=ThisWorkbook.Worksheets(1) 4 End Select

例えば02東京と03大阪のファイルを選択して、マクロを動かすと
name(0)である"01北海道"が該当しないため、マクロがなにもせず終わってしまいます。

もちろん、全てのCaseを書けば問題が解決することはわかりますが、実際の作業ファイルは40程あるため、メンテナンス性を考えて短くしたいと思っています。

どうかご教示いただけたらと思います。
よろしくお願いします。

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

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

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

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

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

guest

回答4

0

大変申し訳ありません。皆様の助言をいただきもう一度精査したところ以下のコードでうまく動きました。

Sub シート収集() Dim filePath As Variant filePath = Application.GetOpenFilename( _ FileFilter:="Excelブック(*.xlsx;*.xlsm;*.xls),*.xlsx; *.xlsm; *.xls", MultiSelect:=True) Dim file As Variant Dim wb As Workbook Dim myArray As Variant Dim name As Variant name = Array("01北海道", "02東京", "03大阪", "04名古屋", "05福岡") Dim i As Long For Each file In filePath Set wb = Workbooks.Open(file) For Each myArray In name Select Case True Case wb.name = myArray & ".xlsx" wb.Sheets(2).name = myArray & " 内訳" wb.Sheets(2).Copy Before:=ThisWorkbook.Worksheets(1) End Select Next myArray wb.Close False Next file End Sub

ループするコードが一つ足りなかっただけでした。
自己解決にはなりましたが、皆様の助言で解決に向かいました。
最も私に考える余地をくださった方にベストアンサーをあげたいと思います。
本当にありがとうございました。

投稿2020/10/12 15:03

編集2020/10/12 15:05
Dis

総合スコア19

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

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

0

補足要求です。
選択したファイルが決まれば、コピー元のシート名は必ず決まるのでしょうか。
それとも、コピー元ブックのシートの左から2番目固定で、そのシート名をコピーし、
コピー先のシート名はコピー元のブック名+”XXX”のようにするのですか。(XXXはコピー元のブック名ににより決まる)
又、その場合、1つの選択したファイルから、2つ以上のシートをコピーする場合もあるのでしょうか。

投稿2020/10/12 13:15

編集2020/10/12 13:30
tatsu99

総合スコア5493

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

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

0

端的にいうと、

選択ダイアログで複数のファイル(.xlsxブック)を選択する。
選択したブック名が "01北海道", "02東京", "03大阪", "名古屋", "05福岡"のどれかだったら
そのブックの2番目のシートを、マクロを実行しているブックの先頭にコピーする。

ということがご希望のことでしょうか。
もし、そうなら、下記のコードで。
違うなら、どの辺が違うのか、具体的に説明してください。

Sub シート収集() Dim filePath As Variant filePath = Application.GetOpenFilename( _ FileFilter:="Excelブック(*.xlsx;),*.xlsx;", MultiSelect:=True) Dim file As Variant Dim wb As Workbook Dim wbName As String For Each file In filePath Set wb = Workbooks.Open(file) If Not wb Is Nothing Then wbName = Replace(wb.name, ".xlsx", "") '拡張子".xlsx"を削除 Select Case wbName Case "01北海道", "02東京", "03大阪", "04名古屋", "05福岡" wb.Sheets(2).name = wbName & " 内訳" wb.Sheets(2).Copy Before:=ThisWorkbook.Worksheets(1) End Select wb.Close False End If Next file End Sub

投稿2020/10/12 13:08

編集2020/10/13 00:21
hatena19

総合スコア34075

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

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

0

ベストアンサー

常に配列の01~05全てのファイルと開くとすると問題なく動くのですが、作業するファイルは毎日変わる(01と02のみ動かしたい時もあれば、03と04と05のみ動かしたい時もある)ため、うまくいきません。

メインのExcelブックに「実行設定」とかのシートを作成
実行パターンがある程度決まっているなら「実行設定1」「実行設定2」とかでシートを作成して
どのシートの設定で動かすか決めれば良いのでは?
(メンテナンスもシート上の値を変更するだけ)

※VBAで判定処理は書かないといけませんが
イメージ説明

  • 「File01.xlsx」は全マクロ実行。
  • 「File02.xlsx」は未実行。
  • 「File03.xlsx」はマクロ1,マクロ2実行。
  • 「File04.xlsx」はマクロ1,マクロ3,マクロ4実行。

追記
マクロ名が決まっていないのであれば
モジュール内のマクロ名(プロシージャ名)を取得するには?

セルをクリックしたらファイル選択でExcelファイルのパスが取得できるようにする。
パスが取得できたらマクロ名を取得し横並びに表示(private は除外しても良いかも)
あとは必要のないマクロを削除し順番を揃える。

マクロ名を変数に代入して実行
実行に関して引数が無いのであれば名前だけで実行できます。

そういう設定ができるシートを作成されてはどうですか?

投稿2020/10/12 11:58

編集2020/10/12 12:37
kuma_kuma_

総合スコア2506

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

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

Dis

2020/10/12 12:08 編集

作業ファイルは40ファイル程度かつランダムであり、全ての組み合わせが考えられるため、その方法はあまり現実的ではないかもしれません…
Dis

2020/10/12 12:29

すいません。改めて読み返して理解できました。確かにこれなら対応できそうですね。メンテナンス性も優れてそうです。ありがとうございます。 ただ、コードのみで解決するパターンがもしあれば、参考にしたいので、回答を待ちたいと思います。 この度はご教示ありがとうございました。
Dis

2020/10/12 12:34

追記ありがとうございます。 私のレベルでは、理解するのに時間がかかるコードなため、じっくり理解させていただきたいと思います。 わざわざ追記していただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問