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

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

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

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

Q&A

1回答

854閲覧

複数ファイルのシートから集計用ファイルに転記したいです

kiro_1002

総合スコア10

VBA

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

0グッド

2クリップ

投稿2019/02/05 08:13

編集2019/02/05 08:14

前提・実現したいこと

条件
・集計用ファイル(以後、転記先)が存在する
・集計される複数のファイル(以後、転記元)は、特定のフォルダにまとめて格納されている
・転記元と転記先のファイル名は同一※ただし「yyyymm」のため月で変わる
・転記先にはマクロ起動前に、集計用シート作成済
・転記する列範囲は固定(A~I、M,N列)だが、行範囲が各ファイルによって変化する
・ものによっては該当シートがない場合もあるのでその時は無視して次のファイルの転記に移る

上記の条件でマクロを組みたいのですが
条件の下2つのコードに迷っています。

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

以下のコードの場合、該当するシートがないファイルでマクロが止まってしまう。

シートに記載されている分の転記ができない。

該当のソースコード

Sub tenki()
Dim folder As String '//フォルダ
Dim file As String '//ファイル選択
Dim book As Workbook '//ブックオープン
Dim ws As Worksheet, flag As Boolean '//参照シート有無
Dim i As Integer
i = 2

With Application.FileDialog(msoFileDialogFolderPicker) If .Show = True Then folder = .SelectedItems(1) End If End With '//フォルダを選択 file = Dir(folder & "*.xlsx") Do While file <> "" '//ファイルを開く Set book = Workbooks.Open(folder & "\" & file) '//集計したい月のシートがあるか確認 For Each ws In Worksheets If ws.Name = Format(Now, "yyyymm") Then flag = True Next ws If flag = True Then ThisWorkbook.Worksheets(Format(Now, "yyyymm")).Range("A" & CStr(i)).Value = book.Worksheets(Format(Now, "yyyymm")).Range("A").Value ThisWorkbook.Worksheets(Format(Now, "yyyymm")).Range("B" & CStr(i)).Value = book.Worksheets(Format(Now, "yyyymm")).Range("B").Value ThisWorkbook.Worksheets(Format(Now, "yyyymm")).Range("C" & CStr(i)).Value = book.Worksheets(Format(Now, "yyyymm")).Range("C").Value ThisWorkbook.Worksheets(Format(Now, "yyyymm")).Range("D" & CStr(i)).Value = book.Worksheets(Format(Now, "yyyymm")).Range("D").Value ThisWorkbook.Worksheets(Format(Now, "yyyymm")).Range("E" & CStr(i)).Value = book.Worksheets(Format(Now, "yyyymm")).Range("E").Value ThisWorkbook.Worksheets(Format(Now, "yyyymm")).Range("F" & CStr(i)).Value = book.Worksheets(Format(Now, "yyyymm")).Range("F").Value ThisWorkbook.Worksheets(Format(Now, "yyyymm")).Range("G" & CStr(i)).Value = book.Worksheets(Format(Now, "yyyymm")).Range("G").Value ThisWorkbook.Worksheets(Format(Now, "yyyymm")).Range("H" & CStr(i)).Value = book.Worksheets(Format(Now, "yyyymm")).Range("H").Value ThisWorkbook.Worksheets(Format(Now, "yyyymm")).Range("I" & CStr(i)).Value = book.Worksheets(Format(Now, "yyyymm")).Range("I").Value ThisWorkbook.Worksheets(Format(Now, "yyyymm")).Range("M" & CStr(i)).Value = book.Worksheets(Format(Now, "yyyymm")).Range("M").Value ThisWorkbook.Worksheets(Format(Now, "yyyymm")).Range("N" & CStr(i)).Value = book.Worksheets(Format(Now, "yyyymm")).Range("N").Value file = Dir() i = i + 1 book.Close

Else
book.Close

End If Loop

End Sub

試したこと

上記のコードをベースにしております。
いじる箇所は大体見当がつくのですがどうすればよいのか分からず……

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

azuapricot

2019/02/05 08:19

コードはマークダウンボタン (<code>ってやつです)を押したらでてくる ```ここに言語を入力 コード ``` ↑の枠の中のコードという文言を消して貼りつけてください。 「ここに言語を入力」という文字を消してVBAと記述してください
guest

回答1

0

とりあえず明らかな間違いは、

vba

1For Each ws In Worksheets 2 If ws.Name = Format(Now, "yyyymm") Then flag = True 3Next ws

で一回 flag = True にしたらずっとTrueのままであるので、
これ以降のループで該当するシートがなくても転記処理が実行されてしまい、エラーになります。
flag = False で戻してからループに入りましょう。

ステップ実行すればすぐ見つかる間違いでしょう。
Excel VBA:ステップ実行でプログラムの動きをチェックする|Plus 1 Excel

また、該当シートが見つかったら最後までループする必要はないので、
Exit For でループを抜けましょう。

flag = False For Each ws In book.Worksheets If ws.Name = Format(Now, "yyyymm") Then flag = True Exit For End If Next ws

他にもコードに冗長な部分が見られますが、とりあえず上記の修正でたぶん動くでしょう(?)
Range("A").Value でエラーになりますね。Range("A" & CStr(i)).Value の間違いかな?
ただ、これだと1行だけしか転記されないが、それでいいのかな?


kiro_1002 さんのコメント

各ファイルによって入力されている量が異なるため、行範囲がバラバラなのでそれに適応できるととても助かります。

下記の方法で最終行が取得できるので、それをもとに範囲指定すればいいでしょう。

最終行の取得(End,Rows.Count)|VBA入門

投稿2019/02/05 10:27

編集2019/02/06 01:07
hatena19

総合スコア33699

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

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

kiro_1002

2019/02/05 13:25

ありがとうございます。 転記は転記元に入力されている分の転記を行いたいです。条件に記載のある通り各ファイルによって入力されている量が異なるため、行範囲がバラバラなのでそれに適応できるととても助かります。 イメージとしては ファイル1は各列10行まで入力されており、ファイル2は各列30行まで入力されている。 ↓ それぞれ転記先へ となります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問