はじめまして。VBA初心者のため、お知恵を貸してください。
1つのフォルダの中に、いちご10月、いちご11月、みかん9月、なし8月、、という形で、月別のフルーツの売り上げデータが複数あります。
このExcelを、フルーツ別に1つのブックにまとめたいのですが、どのようなマクロにすればよいでしょうか。→例 いちご売上高 というExcelに、10月、11月というシートがついているイメージ
1、まとめたエクセルには、フルーツ名と売上高(例 いちご売上高.xlsx)というファイル名にしたいです。
2、月別のExcelに、シートは1つだけです。(月がシート名。例 10月)
3、フルーツによって、売上がない月もあります。
Excelの数が多く、手作業に時間がかかってしまうので
マクロでの作業に変更したいです。
よろしくお願いします。。
No.1ベストアンサー
- 回答日時:
Sub フルーツ別にExcelファイルを作成()
Dim wsSource As Worksheet
Dim wsDest As Worksheet
Dim LastRow As Long
Dim FruitName As String
Dim DestWorkbook As Workbook
Dim SourceWorkbook As Workbook
' 作業するフォルダのパスを指定します。必要に応じて変更してください。
Dim FolderPath As String
FolderPath = "C:\YourFolderPath\"
' フォルダ内のファイルを処理します。
Dim FileName As String
FileName = Dir(FolderPath & "*.xlsx")
' ファイルが存在する限りループします。
Do While FileName <> ""
' ファイルを開きます。
Set SourceWorkbook = Workbooks.Open(FolderPath & FileName)
' ファイル名からフルーツ名を抽出します。
FruitName = Left(FileName, InStr(FileName, "売上高") - 1)
' フルーツ名.xlsxの新しいブックを作成します。
Set DestWorkbook = Workbooks.Add
' 新しいブックにシートを1つ追加します。
Set wsDest = DestWorkbook.Sheets(1)
' シート名をフルーツ名に設定します。
wsDest.Name = FruitName
' ソースブックのデータをコピーして貼り付けます。
Set wsSource = SourceWorkbook.Sheets(1)
LastRow = wsSource.Cells(wsSource.Rows.Count, "A").End(xlUp).Row
wsSource.Range("A1:B" & LastRow).Copy wsDest.Range("A1")
' ソースブックを閉じて、次のファイルに進みます。
SourceWorkbook.Close SaveChanges:=False
FileName = Dir
Loop
' ファイル保存ダイアログを表示して、フルーツ別のExcelファイルを保存します。
Dim SavePath As String
SavePath = Application.GetSaveAsFilename("フルーツ別売上高.xlsx", FileFilter:="Excelファイル (*.xlsx), *.xlsx")
If SavePath <> "False" Then
DestWorkbook.SaveAs SavePath
End If
' 新しいブックを閉じます。
DestWorkbook.Close SaveChanges:=False
End Sub
回答いただき、ありがとうございます。
早速実行してみたところ、
DestWorkbook.SaveAs SavePath
のところで、止まってしまい、「オブジェクト変数又はwithブロック変数が設定されていません」というメッセージがでました。
全然分かっておらず、、、、、大変申し訳ないのですが、どのように対応すればよいでしょうか。
No.3
- 回答日時:
不明点です。
1.ファイルのフルーツ名の末尾に数字が付くことがありますか。
例として、みかん112月.xlsx の場合、
みかん1の12月分と判断できますが、
それを許すと、みかん11月.xlsxは、みかん1の1月分なのか、みかんの11月分なのかの判断ができなくなります。
従って、フルーツ名の末尾に数字が付くことがないことが保証されていれば、実現可能です。
2.ファイルの件数はおよそ何件でしょうか。
フルーツの件数が約40件だとすると、12か月分なので、最大40×12=480件
およそ、500件程度かと想定しますが、実際のところは、どのくらいあるのでしょうか。
3.○○売上高.xlsxのシートの並びは、どのようにしますか、
左から、
1案:1月、2月、3月、4月、・・・・11月、12月
2案:4月、5月、・・・・11月、12月、1月、2月、3月
が考えられます。2案は4月が年度開始月の場合に採用されることが多いです。
ご回答ありがとうございます!
不明点が多く、申し訳ありません。また、返信が遅くなり申し訳ありませんでした。
ご確認いただいた点ですが
1、フルーツ名の後ろに数字がつくことはありません。
2、ファイル件数は、1ヶ月20程度です。
3.シートの並び順は、二案の4月はじまりとなります。
と、なります。
No.2
- 回答日時:
こんにちは
不明点が多すぎるので、とてもコードにはできませんが、以下に大雑把な考え方を・・
同時並行で処理する方法も考えられますが、ややこしいと思いますので、(若干効率は悪いですが)順にひとつずつ処理する方法にしてあります。
ご参考までに。
1)まず、指定フォルダ内のフルーツ名をDictionaryなどを利用してリストアップします。
(エクセルなら、シートに全数リストアップしてから「重複を削除」してもよいです)
1-1)指定フォルダ内をDir関数やFSOを用いて、「.xlsx」ファイルを順に走査
(.xlsm等も含むのかは不明)
1-2)ファイル名が「xxx売上高.xlsx」のようなものは対象とせずスキップ
1-3)ファイル名の「11月」等より前の部分を取得
(月の数字が全角なのか半角なのか、あるいは混在なのか不明)
(InStr関数や正規表現で抜き出しできると思います)
1-4)dictionaryに登録することで、一意にする。
あるいは、シートにリストして「重複を削除」
※ 以上で、フォルダ内にあるフルーツ名のリストを作成できます。
※ 常に新規で作成するとしてよいのか、月別ファイルを追加して再実行する可能性があるのか等々不明ですが、一応、以下は後者として考えてあります。
※ 「xxx売上高.xlsx」ブックにすでに対象月が存在する場合にどうするのかも不明ですが、上書きしてよいものと仮定しました。
2)フルーツ名リストに従って、順にフルーツ毎に以下の処理を行う。
2-1)「フルーツ名売上高.xlsx」が存在するかDIR関数等で調べ、
存在すればブックをOPEN、なければ新規作成する。
2-2)フォルダ内の「フルーツ名*.xlsx」に該当するファイルを順に処理
2-3)ファイル名が「フルーツ名売上高.xlsx」の場合はそのファイルはスキップ
2-4)ファイル名から「フルーツ名」および「.xlsx」を削除したものを作成
(月名部分に、シート名として使えない文字があるのか不明ですが、存在する可能性があるのなら、削除したり「_」などに置き換えるなどが必要)
2-5)上記で得られる「月名」のシートが存在するか調べる。
存在しなければ、新規にシートを作成
2-6)処理中のシート全体を「月名」シートにコピペする
2-7)処理中のファイルを閉じて次のファイルへ
(該当ファイルがなくなるまで続ける)
2-8)「フルーツ名売上高.xlsx」を保存し、次のフルーツ名の処理へ
※ 2)の処理をフルーツ名毎に繰り返すことで、全体の処理ができるものと思います。
※ 一気に全部を作成しようとすると大変だと思いますが、部分部分に区切って順に動作を確認しながら作成してゆくことで、完成できるものと想像します。
ご回答ありがとうございます。
不明点が多く、申し訳ありません。
ファイル名ですが、月は半角でした。
まだまだ勉強不足なので、少しずつ区切って考えてみます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBA シートをコピーする際に Co...
-
ワイルドカード「*」を使うとう...
-
別ブックをダイアログボックス...
-
VBA 別ブックからコピペしたい...
-
エクセルVBAが途中で止まります
-
Excelマクロ 該当する値の行番...
-
【Excel VBA】書き込み先ブック...
-
エクセル共有化のトラブル
-
VBAで別ブックのシートを指定し...
-
vbaで他のブックに転記したい。...
-
VBA コードを実行すると画面が...
-
Excelのマクロについて教えてく...
-
VBA アプリケーション定義また...
-
マクロを使って不特定のファイ...
-
【VBA】別のブックの同じ行番号...
-
Excelファイルを開くとき、読み...
-
エクセルのマクロを使ってメー...
-
VBAで複数のブックを開かずに処...
-
VBの処理結果をEXCELシ...
-
エクセルマクロで、他ブックか...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA シートをコピーする際に Co...
-
別ブックをダイアログボックス...
-
エクセルVBAが途中で止まります
-
ワイルドカード「*」を使うとう...
-
VBA 別ブックからコピペしたい...
-
【ExcelVBA】インデックスが有...
-
VBA コードを実行すると画面が...
-
VBAで別ブックのシートを指定し...
-
【ExcelVBA】zip圧縮されたCSV...
-
VBAで別のブックにシートをコピ...
-
VBA 実行時エラー 2147024893
-
VBA シート名が一致した場合の...
-
ユーザーフォームの切り替えに...
-
【マクロ】違うフォルダにある...
-
【Excel VBA】書き込み先ブック...
-
VBS Bookを閉じるコード
-
Excelマクロ 該当する値の行番...
-
VBAで複数のブックを開かずに処...
-
Excel2007VBAファイルの表示に...
-
VBA アプリケーション定義また...
おすすめ情報