🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
VBA

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

マクロ

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

Q&A

解決済

1回答

1836閲覧

特定のフォルダ内にある全てのExcelを転記用Excelの雛形に転記し、それぞれ名前をつけて保存したいです

mkmigmyuch

総合スコア5

VBA

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

マクロ

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

0グッド

1クリップ

投稿2021/02/15 09:17

編集2021/02/15 09:47

Do While LoopとFor Nextの組み合わせのループ処理の不具合です。

マクロで、フォルダ①内にあるExcelファイル(数千個)の必要項目(ファイルによってどの行までデータがあるか異なる)をExcelファイル②(雛形)へ転記し、名前をつけてコピーを保存。その後Excelファイル②のデータをクリ
アし、次のフォルダ①内のExcelファイルの必要項目を転記、、、というループ処理をマクロで組んでいるのですが、名前をつけて保存する部分がうまく行きません。
はじめの5個くらいのファイルが「計算シート_.xls」となってしまい、該当のセル(F7)からファイル名を引用せずコピーして保存してしまいます。
その結果、最初の何個が保存先で上書き保存されてしまい、ファイルがうまく作れません。

間違っている箇所がわからないため、正しく動くにはどうすればいいか教えてください。。。

Sub tenki()

Dim folder As String
Dim file As String
Dim book As Workbook
Dim i As Integer

With Application.FileDialog(msoFileDialogFolderPicker)

If .Show = True Then
folder = .SelectedItems(1)

End If
End With

file = Dir(folder &"*.xls")

Do While file <>""
Set book = Workbooks.Open(folder &""&file)

ThisWorkbook.Worksheets("sheet1").Range("F7").Value = book.Worksheets("sheet1").Range("F7").Value

ThisWorkbook.Worksheets("sheet1").Range("G7").Value = book.Worksheets("sheet1").Range("G7").Value

For i = 13 To Cells(Rows.Count, 1).End(xlUp).Row

ThisWorkbook.Worksheets("sheet1").Range("F"&CStr(i)).Value = book.Worksheets("sheet1").Range("F"&CStr(i)).Value

ThisWorkbook.Worksheets("sheet1").Range("G"&CStr(i)).Value = book.Worksheets("sheet1").Range("G"&CStr(i)).Value

ThisWorkbook.Worksheets("sheet1").Range("H"&CStr(i)).Value = book.Worksheets("sheet1").Range("H"&CStr(i)).Value

Next

Dim Filename As String

Filename = "C:\保存先フォルダ\計算シート_"&Format(Range("F7")) &".xls"ThisWorkbook.SaveCopyAs Filename
Application.DisplayAlerts = False

file = Dir()

book.Close SaveChanges:=False
Application.DisplayAlerts = False

ThisWorkbook.Worksheets("sheet1").Range("F7").ClearContents
ThisWorkbook.Worksheets("sheet1").Range("G7").ClearContents
ThisWorkbook.Worksheets("sheet1").Range("F13:H200").ClearContents

Loop

End Sub

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

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

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

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

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

cleaner

2021/02/15 09:36

該当セルにはちゃんとデータは入っていますか?
mkmigmyuch

2021/02/15 09:42

コメントいただきありがとうございます。 該当セルは転記マクロで転記された値が入りますが、計算シート_.xlsという名前で保存されてしまったExcelを開くと、転記は出来ているので、データは入っています。
cleaner

2021/02/15 09:56 編集

ファイル名を付けるときにFormat関数を使用しているのはなぜですか? Format関数ではなく、セルの値をそのまま使うとどうなりますか? もしかしたらFormat関数で空白文字列が返されてるかもしれません。 デバッグで確認してみてはどうでしょうか?
mkmigmyuch

2021/02/15 09:55

勉強しながら作成しているため、付け焼き刃な言語になっているかもしれません。。。 F7のセルに転記される値はファイル毎に異なり、セルの値をファイル名として表示させる方法が分からなかったため、インターネットで検索し、Format関数を使うとあったので使用いたしました。 セルの値をそのまま使うとは、どのような記載をすれば出来るのでしょうか? うろ覚えで申し訳ないですが、Range("F7")といれても、そのままF7と表示されてしまった気がします。
cleaner

2021/02/15 09:59

Range("F7").Valueでできます。 しかもRangeのデフォルトはValueのはずなので.Valueはつけなくてもできるはずですが念のためつけておきましょう。
mkmigmyuch

2021/02/15 10:19

ご教示いただきありがとうございます。 会社のPCでしか操作できないため、明日出社時に該当箇所を修正して稼働確認をしたいと思います。
cleaner

2021/02/15 10:26

ついでなのですがデバッグの方法はご存知でしょうか? もしご存知でないならデバッグについて調べて、Format関数辺りをウォッチ式で調べると解決しそうです。
mkmigmyuch

2021/02/15 10:43

補足情報いただきありがとうございます。 インターネットからVBAを引っ張ってきた時にdebug.Printがあったのですが、よく分からず省いてしまっていました。 いま調べて理解できたので、debug機能も使って、エラーが起きている箇所を検知したいと思います!
mkmigmyuch

2021/02/16 02:36

こんにちは。 ご教示いただいた方法で、正しく稼働させることができるようになりました。 かなり重要なツールだったので、大変助かりました。ありがとうございました。
guest

回答1

0

ベストアンサー

Cells(Rows.Count, 1).End(xlUp).RowのCellsや、Format(Range("F7")) のRangeは、どのシートのもの?

投稿2021/02/15 09:47

jinoji

総合スコア4592

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

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

mkmigmyuch

2021/02/15 09:57

コメントいただきありがとうございます。 分かりづらくてすみません。 Cells〜は転記元のExcel、Format〜は転記先のExcelのセルを指定したいと考え、記載しています。
cleaner

2021/02/15 10:01

途中まで所属が明記してあるのに一部だけ省略されているので、もしかしたらバグの原因になるかもしれません。今回は最初の5個以外うまくいってるので問題なさそうですが、バグを疑うときは他と違うところから探すといいですね。
jinoji

2021/02/15 10:01

きっとそうだと思っていました。 book.Worksheets("sheet1").Cells(Rows.Count, 1).End(xlUp).Row Format(ThisWorkbook.Worksheets("sheet1").Range("F7")) のように改めてみてはどうでしょうか。
jinoji

2021/02/15 10:09

うまくファイル名がつかないパターンのときは、転記元のExcelを開いたときに転記対象のSheet1とは別のシートが前面になっているのではないかと推測しています。 xxx.Range と書かずに Rangeとだけ書くと、その時点でのActiveなシートが使われるため、意図しない値が取得されることがあります。
mkmigmyuch

2021/02/15 10:22

ご教示いただきありがとうございます。 会社のPCでしか操作ができないため、省略されているCells〜のところと、Format〜のところを追記し、稼働確認をしてみます。
mkmigmyuch

2021/02/16 02:36

こんにちは。 ご教示いただいた方法で、正しく稼働させることができるようになりました。 かなり重要なツールだったので、大変助かりました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問