プロが教える店舗&オフィスのセキュリティ対策術

こんばんは。どうすることも出来ず困っています。マクロが出来ないのでエクセルで試してみましたが無理でした。説明が分かりずらいかもしれませんがご教授お願いします。

データ貼付Sheetの情報
・データ貼付Sheetにはシステムからダウンロードしたエクセルのデータを貼り付ける
・データ貼付Sheetにはシステムからダウンロードしたエクセルのデータを貼り付ける
・店コード(支店)は購入したものが無ければ店コード(支店)表示されない
・分類も購入が無ければ分類名の欄は表示されない

まとめSheetの情報
・まとめSheetは全ての店コードと分類が常に表示されている
・データ貼付Sheetにある数値をまとめに反映させたい
・データ貼付Sheetの分類(同じ色の分類の計)をまとめに反映したい
・支店が増える可能性あり

どうか皆さんのお知恵をお借りしたいです。

「エクセルでデータを別シートへ複数条件で」の質問画像

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

  • うーん・・・

    ありがとうございます。VBAで標準モジュールに貼り付けましたが、「実行エラー インデックスが有効範囲にありません。のエラーが表示されます。これはどうすればいいのでしょうか。

    No.2の回答に寄せられた補足コメントです。 補足日時:2017/09/29 22:29
  • つらい・・・

    ご指摘頂きありがとうございます。初めてだったので仕組みがよくわからないまま投稿してしまいました。今後は気を付けます。

    No.1の回答に寄せられた補足コメントです。 補足日時:2017/09/29 22:31
  • どう思う?

    ご指摘の①と②を確認しました。②の各シートの一番上の列からではなく2列目から配置しておりましたので削除しました。「このブックでマクロが使用できないか、またはすべてのマクロが無効になっている」のエラーが出ました。マクロ有効の設定したのですが、同じエラー表示になります。
    マクロの設定方法が間違っているのかもしれません。再度やり直ししてみます。それと大変失礼な質問ですが、関数ではこの設定は無理でしょうか?

    No.3の回答に寄せられた補足コメントです。 補足日時:2017/09/29 23:26
  • つらい・・・

    すみません、何度かチャレンジしたら出来ました!先ほどの補足は無視してください。
    違うデータをダウンロードして、データ貼付けsheetに貼り、試してみました。すると分類が増えていた所が反映されていませんでした。ダウンロードしたデータは月や時期によってコードや分類が減ったり増えたりします。←ここがネックです。(まとめSheetのコードと分類が全てです)

      補足日時:2017/09/29 23:48
  • つらい・・・

    >月や時期によってコードや分類が減ったり増えたりします。
    とは「データ貼付」シートの分類(列数)が一定でない!という意味でしょうか?
    ↑ 分類(列数)もコード(縦数)もどちらもです。
    何度も補足ばかりですみません(泣)

    No.5の回答に寄せられた補足コメントです。 補足日時:2017/09/30 00:46
  • HAPPY

    こちらこそこんなに遅い時間までお付き合い頂きすみません。

    最終列が「総計」と設定されている定義なので、「分類」になった場合は
    ↓にするのですね。了解しました。
    >No.4で投稿した通り、最終列が「総計」でなく「分類」の場合
    >★①と★②はの「-1」は消してください。m(_ _)m

    集計ボタンを作りそこをぽちっと数回押すと、「総計」が倍・倍に増えていくのはそのせいですね。
    No.2の投稿で「総計」に関数を入れるとありましたが「SUM」でいいのでしょうか?
    今夜は遅いのでまた明日にでも返信頂ければ嬉しいです。
    余談ですが、「ベストアンサー」をtom04に差し上げたいのですが押してしまうと締切になってしまうのでしょうか。

    No.7の回答に寄せられた補足コメントです。 補足日時:2017/09/30 02:07
  • へこむわー

    試してみました。
    >「データ貼付」シートの1行目項目が必ず「まとめ」シートの分類群の中にあるのであれば
    「総計」の列も一緒に操作する方法です。←「まとめ」にはすべての分類が常時表示してます。
    >コード内の「-1」を2か所とも消してみてください。←消してみるとこんな表示が・・(画像参照)

    次に下記を試してみました。
    >もう一つの方法としては「-1」のままで「総計」列に数式を入れる方法
    「まとめSheet」の「総計」は常にG2にありますので、G2に =IF(COUNT(C2:F2),SUM(C2:F2),"")を入れ、実行すると「総計」の数式が消え「総計」の数字が最初にした方法の合計の倍の数字になりました。

    私のVBAの設定が間違っているのかもしれないですね・・・・

    「エクセルでデータを別シートへ複数条件で」の補足画像7
    No.8の回答に寄せられた補足コメントです。 補足日時:2017/09/30 16:44

A 回答 (9件)

>・データ貼付Sheetにはシステムからダウンロードしたエクセルのデータを貼り付ける


>・データ貼付Sheetにはシステムからダウンロードしたエクセルのデータを貼り付ける
…(´・ω・`)違いが分からない。

・・・本題・・・

で、代わりに作ってくれという事でしょうか。
関数の使い方が分からないので教えて欲しいという事でしょうか。

質問の仕方を見ると「代わりに作って♪」のように受け取れるのですが…。
それって「質問」ではありませんよね。

具体的に何が分からないのかを示しましょう。
「関数の○○の使い方が分かりません」
「この場合は、この関数を使えばいいのでしょうか」
「ここにこのような式を入れたのですがエラーになります。原因を教えてください」
のように具体的に質問するようにしましょう。
でないと、目の前にある疑問を先送りにするだけになってしまいます。
それって疑問の解決ではありませんよね。


・・・余談・・・

半角カナは見づらいなあ。
この回答への補足あり
    • good
    • 0

こんにちは!



カテゴリはACCESSになっていますが、Excelで良いのですね。
要するに「データ貼付」シートのデータを「まとめ」シートの1行目に分けた分類群にまとめたい!というコトですよね?

VBAになりますが、一例です。
標準モジュールにしてください。
配置は↓の画像のようになっているという前提です。

Sub Sample1()
Dim i As Long, j As Long, lastRow As Long
Dim c As Range, r As Range, wS As Worksheet
Set wS = Worksheets("データ貼付")
With Worksheets("まとめ")
lastRow = .Cells(Rows.Count, "A").End(xlUp).Row
Range(.Cells(2, "C"), .Cells(lastRow, "F")).ClearContents
For i = 2 To wS.Cells(Rows.Count, "A").End(xlUp).Row
For j = 3 To Range("L1").Column
If wS.Cells(i, j) <> "" Then
Set c = .Range("A:A").Find(what:=wS.Cells(i, "A"), LookIn:=xlValues, lookat:=xlWhole)
Set r = .Rows(1).Find(what:=wS.Cells(1, j), LookIn:=xlValues, lookat:=xlPart)
With .Cells(c.Row, r.Column)
.Value = .Value + wS.Cells(i, j)
End With
End If
Next j
Next i
End With
End Sub

※ エラー処理はしていません。
※ 「まとめ」シートのG列(総計)は普通に関数を入れておいてください。m(_ _)m
「エクセルでデータを別シートへ複数条件で」の回答画像2
この回答への補足あり
    • good
    • 0

No.2です。



色々な原因が考えられますが・・・
前回投稿した通り、
① シート名はちゃんと「まとめ」と「データ貼付」のシート名になっているでしょうか?
(コードに記載していとおりダブルクォーテーションで囲まれたシート名になっているか?)
シートが存在しないとそのようなエラーになる場合があります。

② 各シートの配置は前回投稿した画像通りの配置になっているでしょうか?
列・行がずれている場合もエラーになるコトがあるか、
まったく意図しない動きになるコトがあります。

実際のデータがどのようになっているのかこちらでは判断できませんので
この程度しか思いつきません。m(_ _)m
この回答への補足あり
    • good
    • 0

続けてお邪魔します。



>月や時期によってコードや分類が減ったり増えたりします。
とは「データ貼付」シートの分類(列数)が一定でない!という意味でしょうか?

もしそうであれば・・・
前回のコード内の
>For j = 3 To Range("L1").Column

>For j = 3 To wS.Cells(1, Columns.Count).End(xlToLeft).Row - 1
としてみてください。
C列~「データ貼付」シート1行目項目最終列の1列前まで
となります。

※ 最終列が「総計」となっている前提ですので、最終列まで「分類」がある場合は
「-1」は消してください。m(_ _)m
    • good
    • 0

何度もごめんなさい。



行と列を間違っていました。

>For j = 3 To wS.Cells(1, Columns.Count).End(xlToLeft).Column - 1

でした。
どうも失礼しました。m(_ _)m
この回答への補足あり
    • good
    • 0

>分類(列数)もコード(縦数)もどちらもです。



「まとめ」シートの1行目に分類だけ入力済みという前提であれば、
「データ貼付」シートのA列で最終行を取得するようにしています。
A列にデータさえ入っていれば、前回の訂正で列数・行数に関係なく処理できるはずです。

※ 「まとめ」シートは行全体・列全体を対象に検索しているため・・・m(_ _)m
    • good
    • 0

たびたびごめんなさい。



投稿後気になったのですが、
「まとめ」シートの列数は変化するのでしょうか?
もしそうであれば、前回のコードではC~F列までしかデータ消去するようにしていません。

今までのコードはすべて消去し↓のコードに変更してみてください。

Sub Sample2()
Dim i As Long, j As Long, lastRow As Long, lastCol As Long
Dim c As Range, r As Range, wS As Worksheet
Set wS = Worksheets("データ貼付")
With Worksheets("まとめ")
lastRow = .Cells(Rows.Count, "A").End(xlUp).Row
lastCol = .Cells(1, Columns.Count).End(xlToLeft).Column - 1 '//★①//
Range(.Cells(2, "C"), .Cells(lastRow, lastCol)).ClearContents '//★①'//
For i = 2 To wS.Cells(Rows.Count, "A").End(xlUp).Row
For j = 3 To wS.Cells(1, Columns.Count).End(xlToLeft).Column - 1 '//★②//
If wS.Cells(i, j) <> "" Then
Set c = .Range("A:A").Find(what:=wS.Cells(i, "A"), LookIn:=xlValues, lookat:=xlWhole)
Set r = .Rows(1).Find(what:=wS.Cells(1, j), LookIn:=xlValues, lookat:=xlPart)
With .Cells(c.Row, r.Column)
.Value = .Value + wS.Cells(i, j)
End With
End If
Next j
Next i
End With
End Sub

※ ★①で「まとめ」シートのC列~1行目最終列の1列左の列までのデータを一旦消去するようにしています。
※ ★②が前回投稿した「データ貼付」シートの1行目最終列の1列左の列までになります。

No.4で投稿した通り、最終列が「総計」でなく「分類」の場合
★①と★②はの「-1」は消してください。m(_ _)m
この回答への補足あり
    • good
    • 1

最後の補足の件について・・・



二通りのやり方があると思います。
「データ貼付」シートの1行目項目が必ず「まとめ」シートの分類群の中にあるのであれば
「総計」の列も一緒に操作する方法です。
その場合はコード内の「-1」を2か所とも消してみてください。
そうしればそのまま「総計」列も表示されます。

もう一つの方法としては「-1」のままで「総計」列に数式を入れる方法です。
この場合、総計の列がどこになるか?によって当然SUM関数の数式範囲が変わってきますよね。

仮に「まとめ」シートの「総計」列がM列にある場合
「まとめ」シートのM2セルに
=SUM(C2:L2)
としてフィルハンドルで下へコピーしておく!

※ エラー処理まで考慮すると
=IF(COUNT(C2:L2),SUM(C2:L2),"")
といった感じでしょうか。m(_ _)m
この回答への補足あり
    • good
    • 1

こんばんは!



お示しのコードで黄色くなっているところを拝見すると
いままでのコードはエラー処理を一切していませんでした。

もしかして、「まとめ」シートのA列に「データ貼付」シートのA列データ(店コード)が存在しない!
または「まとめ」シートの分類群の中に「データ貼付」シートの分類名が存在しない!
というコトが考えられます。

今一度確認してみてください。

※ 「まとめ」シートに「店コード」もしくは「分類」がない場合はVBAで追加は可能ですが、
コードが長くなるので、今回は割愛させてください。m(_ _)m
    • good
    • 0
この回答へのお礼

何度も何度も無知な私の質問に丁寧に回答して頂き感謝しています。
今までの内容を参考にさせて頂きたいと思います。
ありがとうございました。
もっとBVAを勉強していきます。

お礼日時:2017/09/30 20:59

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