アプリ版:「スタンプのみでお礼する」機能のリリースについて

複数のシートを自動でコピー(統合)するエクセルのマクロについて教えてください。
「毎月の売上明細シート」を別のエクセルファイルにコピー(統合)して「年間の売上明細シート」を作成したいです。

同じブック内でコピー(統合)するマクロは下記の「マクロ1」で想定通りに動くのですが、これを「毎月の売上明細シート(エクセルファイル)」はそのままで(要は加工できないエクセルです)、別のエクセルにマクロを組んで、そこに「年間の売上明細シート」を作成するマクロに変更したいのですが、素人なのでさっぱりわかりません。
同一ブック内で統合するマクロを別のエクセルに統合するマクロへの修正方法を教えてください。よろしくお願いいたします。

*当方、WINDOWS10でエクセル2016使用です。
*売上明細の中身は問題ではないと思いますが、、、日付ごとに売上商品、個数、合計単価が記載されている明細です。

「マクロ1」・・・同じブック内でコピー(統合)するマクロ
Sub マクロ1()
Dim sWS As Worksheet '毎月の売上明細シート(コピー元)
Dim dWS As Worksheet '年間の売上明細シート(コピー先)

Set dWS = Worksheets("AllData")

'年間の売上明細シートの2行目以降を削除
dWS.UsedRange.Offset(1, 0).Clear

'各シートの2行目以降のデータを、年間の売上明細シートの末尾にコピー
For Each sWS In Worksheets
If sWS.Name <> dWS.Name Then
With sWS.UsedRange

'コピー元シートにデータが1件以上ある場合
If .Rows.Count > 1 Then
.Offset(1, 0).Resize(.Rows.Count - 1).Copy _
Destination:=dWS.Cells(Rows.Count, 1). _
End(xlUp).Offset(1, 0)
End If

End With
End If
Next sWS

'年間の売上明細シートをA列で並べ替え
dWS.UsedRange.Sort Key1:=Range("A1"), Header:=xlYes
End Sub

質問者からの補足コメント

  • 毎月の売上明細のエクセル名は「毎月の売上明細シート」で、そのエクセル内にはシート名が「1月」「2月」「4月」と各月の売上明細(販売日・商品名・販売額)のデータのあるシートがあります。ない月もありますが、シート名に関係なく、各月のデータを順番に拾ってほしいです。
    質問文のマクロ1はこのエクセルの新しいシートで実行すると、各月のデータを統合してくれます。とても便利なマクロです。

    今回の質問は、このエクセル「毎月の売上明細シート」はそのままで、別のエクセル「年間の売上明細シート」(そのエクセルのシート名も年間の売上明細シートでいいです)に統合したいということです。できれば、マクロ1はとてもわかりやすく使い勝手のよいマクロなので、ちょっと修正して使えるとありがたいです。

      補足日時:2020/06/27 16:47

A 回答 (3件)

そうゆう事ですか、伝わりませんでしたね。


こちらでどうぞ
Sub Sample()
Dim dWS As Worksheet
Dim fileFll As String
Dim sh
  Set dWS = ThisWorkbook.Worksheets(1)
  With Application.FileDialog(msoFileDialogFilePicker)
    .Title = "毎月の売上明細シートがあるBookを選択してください"
    .InitialFileName = CreateObject("WScript.Shell").SpecialFolders("desktop")
    .Filters.Add "*", "*.xls*"
    If .Show = 0 Then
      MsgBox "キャンセルされました": Exit Sub
    Else
      fileFll = .SelectedItems(1)
    End If
  End With
  dWS.UsedRange.Offset(1, 0).Clear
  With Workbooks.Open(fileFll)
  '毎月の売上明細シートがあれば、年間の売上明細シートの末尾にコピー
    For Each sh In .Worksheets
      If sh.Name <> "AllData" Then
        sh.UsedRange.Offset(1).Copy _
            Destination:=dWS.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0)
      End If
    Next sh
    .Close
  End With
  '年間の売上明細シートをA列で並べ替え
  dWS.UsedRange.Sort Key1:=Range("A1"), Header:=xlYes
End Sub

ご質問よりコードを信じました。
新規ブック標準モジュールにコピペで
    • good
    • 0
この回答へのお礼

ありがとうございました!想定通りに動きました。
まだVBAを見てもよくわからないのですが
しっかり勉強しようと思います。

お礼日時:2020/06/27 22:11

>途中で「毎月の売上明細シートのあるブックを選択してください」と出るので、そのシートを開いてみるのですが、何も起こりません。


>これは何のVBAなんでしょうか。

そうですか、、
検証してみました。
実行されましたが、、だめですか?
>途中で「毎月の売上明細シートのあるブックを選択してください」と出るので、そのシートを開いてみるのですが、何も起こりません。

コピー元ファイルに 毎月の売上明細シート シート名はありますか?もしかして、 毎月の売上明細  とかではないでしょうか?
同様に新規ブックに 年間の売上明細シート 名のシートはありますか? もしかして、 年間の売上明細  とかではないでしょうか?

これは、あなたにしか分かりません。
ご質問のコードでは、Set dWS = Worksheets("AllData") となっていますが、
説明文には、年間の売上明細シート となっています。

コード内のシート名 年間の売上明細シート  毎月の売上明細シート を該当シート名に書き替えてみてください。

しかしながら、この辺りで躓くと必要になるであろう条件定義を自力で行うのは、難しいかも知れませんね。

改めて
VBAは新規ブックの標準モジュールにコピペしましたか?
その新規ブックには、年間の売上明細シートはありますか?そこにコピーされます。

ダイアログが出て、毎月の売上明細シートのあるブックを選択してください の通りに
毎月の売上明細シートの入っているブックを選んで 開くボタンを押してください。

シート名があれば、このままでも実行されると思います?
    • good
    • 0
この回答へのお礼

毎月の売上明細のシート名は「1月」「2月」・・・です。ない月もあります(売上のない月はシートもない)。マクロ1はそのシート名関係なくちゃんとデータを自動で統合してくれました。
途中で追加作業が発生する手間のかかるマクロではなく、もっとシンプルに、それぞれのエクセル(毎月の売上明細シートと、年間の売上明細シート)を開いて、マクロを実行したら、年間の売上明細が自動で完成するようにできるとありがたいです。
マクロ1のように。。。

お礼日時:2020/06/27 16:53

こんにちは、


>素人なのでさっぱりわかりません。うう

ご質問内容をちゃんと理解しているか分かりませんが、こんな感じでどうでしょう
Option Explicit
Sub マクロ1()
Dim dWS As Worksheet
Dim fileFll As String
Dim sh
  Set dWS = ThisWorkbook.Worksheets("年間の売上明細シート")
  With Application.FileDialog(msoFileDialogFilePicker)
    .Title = "毎月の売上明細シートがあるBookを選択してください"
    .InitialFileName = CreateObject("WScript.Shell").SpecialFolders("desktop")
    .Filters.Add "*", "*.xls*"
    If .Show = 0 Then
      MsgBox "キャンセルされました": Exit Sub
    Else
      fileFll = .SelectedItems(1)
    End If
  End With
  With Workbooks.Open(fileFll)
  '毎月の売上明細シートがあれば、年間の売上明細シートの末尾にコピー
    For Each sh In .Worksheets
      If sh.Name = "毎月の売上明細シート" Then
        sh.UsedRange.Offset(1).Copy _
            Destination:=dWS.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0)
      End If
    Next sh
    .Close
  End With
  '年間の売上明細シートをA列で並べ替え
  dWS.UsedRange.Sort Key1:=Range("A1"), Header:=xlYes
End Sub

fileFll = .SelectedItems(1)に 毎月の売上明細シートの含まれているブックのフルパスを書けばmsoFileDialogは不要です。

新規ブックを作成
新規ブック内に年間の売上明細シート名のシートを作成
(一旦任意の場所に保存してください)

上記サンプルを標準モジュールに

エラー処理はしておりません。
.Closeなのでターゲットブックに=now()のような関数(又はVBA)があるとアラートが出るかと思いますが
条件などは適時変更、対応してください。

全く思い違いならすみません。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
下の方の説明が難しくて全くわからないのですが…
とりあえずマクロ作成(コピーしただけですが)してやってみたのですが、まったく何も起こりません。
途中で「毎月の売上明細シートのあるブックを選択してください」と出るので、そのシートを開いてみるのですが、何も起こりません。
これは何のVBAなんでしょうか。

お礼日時:2020/06/27 15:40

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!