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

各月の売上明細のデータを、別のエクセルブックに集約するマクロの「修正」について教えてください。
(マクロやVBAは今月始めたばかりでまだわからないことだらけでご迷惑をおかけします。)

現状(下記、「売上明細統合マクロ」ご参照)、各月の売上明細のデータのエクセルブックにあるシート「すべて」を順番に統合するマクロになってしまっていますが、実は各月の売上明細シート以外にも「グラフ」や「注意事項」等、今回の統合作業には「不要なシート」があります。これを無視して「各月の売上明細シートのみ」集約するように修正したいです。

*当方Windows10、Excel2016使用です。
*集約元である「各月の売上明細のエクセルブック」には、グラフや注意事項のシートの他、1月・2月・4月…と各月の売上明細のシートがあります。売上明細のシートの中身は今回関係ないと思いますが、一応、「販売日・商品名・売上額」が販売日ごとに載っているとします。
*集約先である「年間の売上明細のエクセルブック」のシートはひとつだけで「年間の売上明細シート」です。年間の販売日・商品名・売上額が販売日ごとに集約したいです。
*数字のみ合算するマクロの話ではないです。必要なシートの情報を転記・集約したいです。

【別のエクセルブック(毎月の売上明細、各月のシートがある)の情報を、別のエクセルブック(年間の売上明細)にまとめるマクロ】
Sub 売上明細統合マクロ()
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

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

  • うーん・・・

    If sh.Name Like "*" & FIND_STR & "*" Thenにしたところ「月」のあるシートの集約はなんとかできました。
    冒頭でConst FIND_STR = "月"と定義済。

    なんらかの印(例えば■とか)があるシート以外を集約するというのが希望する処理なんですが、なかなか修正できないのですが、、、修正しているところです。

    No.3の回答に寄せられた補足コメントです。 補足日時:2020/06/29 22:20
  • 話が変わってきてしまいましたので、いったん当質問をしめさせていただき、改めて質問いたします。ご回答ありがとうございました。

      補足日時:2020/06/29 23:00

A 回答 (3件)

シート名を指定してコピーとマージをしてはいかがでしょう。


あるいは1シートずつ「これマージする?」と対話形式で指定する。

特定のシートを認識する方法でやり方が変わるという事です。
そんなわけで、”特定のシート”を認識する方法を工夫しましょう。

特定のセルに共通の文字が入力されているとか、シート名に規則性があるとか、そういったところから自動で選別することができます。
規則性も無くルールが複雑な選別するのであれば、1シートずつ選択するのが無難かもしれません。

このような手順で対策を考えることで、次にどうすれば良いのかに繋がります。
一つずつステップを進めていきましょう。
    • good
    • 0
この回答へのお礼

どのようなVBAになるのでしょうか?
各シート名に■を入れることは可能です。

お礼日時:2020/06/29 00:25

こんばんは、


https://oshiete.goo.ne.jp/qa/11731726.html で回答した者です。

先にも記しましたが、シート構成、シート名は貴方にしか分かりません。
要件定義が前回も今回もしっかりされていませんよ。

本題
>勉強しようと思います。との事なので、
除外するシートが対象のシートより少ないようなら、
If sh.Name <> "AllData" Then をヒントに or でつなげれば良いでしょう。

先のご質問の内容で想像すると  Like "*月"  で良いかもです。

この辺りは、ご自身で調べてみましょう。
    • good
    • 0
この回答へのお礼

シート構成、シート定義は質問文に記載しているのでそちらをご確認ください。

お礼日時:2020/06/29 00:41

こんにちは



既に他の方の回答にもありますが、ご提示のコードで対象とするシートを判別しているのは
 If sh.Name <> "AllData" Then
の部分です。
上記の例では、「AllData」というシート名以外のシートが全て集約の対象となります。

ですので、この部分を質問者様が集約したいシートだけ合致するような判定条件に変えれば、ご質問の内容は実現できるでしょう。

>シート構成、シート定義は質問文に記載しているのでそちらをご確認ください。
不要な情報も多く、私には「集約したいシート」の特定方法を読み取れませんでした。(種々の可能性の排除ができないので)
雰囲気的には、既回答にもある通り「Like "*月"」でも良さそうに思えますが、実体がどうなっているのか不明なので、これで行けるのどうかはわかりかねます。
この回答への補足あり
    • good
    • 0
この回答へのお礼

For Each sh In .Worksheets
If sh.Name = Like "*月" Then
sh.UsedRange.Offset(1).Copy _
Destination:=dWS.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0)
End If
Next sh

おっしゃるように
”AllData”をLike"*月"に変えるとコンパイルエラーとなってしまいます。
できれば、集約不要な各シート名の頭に■を入れることで除外したいです。(特に■にこだわりがある訳ではないです。集約不要なシートの集約を除外したいだけです。)

お礼日時:2020/06/29 21:56

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