マクロ・複数の条件から一致する合計を求めたい

このQ&Aのポイント
  • マクロ初心者ですが、SUMIF関数で条件を集計していますが処理が重くなり困っています。
  • ピポットテーブルは別ブックに反映できないため使用を断念しました。
  • 関数を使用せずに集計ボタンを作成して処理の時間を短縮したいです。
回答を見る
  • ベストアンサー

マクロ・複数の条件から一致する合計を求めたい。

マクロ初心者です。 現在SUMIF関数で一致する条件を集計しているのですが、件数が多く処理が重くなってしまい困っています。 ピポットテーブルの使用も検討したのですが、表を参照して別ブックに反映させる事がある為、使用する事を断念しました。 今回、解決したい内容は・・・ ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー sheets("データ")には A3から「受注した日付」、B3から「発送日」、C3から「取引先」、D3から「商品名」、E3から「=A3&B3&C3&D3」※受注日+発送日+取引先+商品名、F3から「=B3&C3&D3」※発送日+取引先+商品名、G3から「=C3&D3」※取引先+商品名、H3から受注数を一覧(下へ)表示しております。 シートはそれぞれ、sheets("受注日累計")、sheets("発送日累計")、sheets("累計")があり、sheets("受注日累計")にはE3のデータをSUMIFで参照して一致するものの合計値を、sheets("発送日累計")にはF3のデータをSUMIFで参照して一致するものの合計値を、sheets("累計")にはG3のデータをSUMIFで参照して一致するものの合計値を表示しております。 ※それぞれD7セルから。 その為、処理に非常に時間がかかりますので、関数を使用せず集計ボタン一つで、処理が重く成らない様、集計出来るようにしたいのですが・・・ どうか無能な私にご教授の程、宜しくお願いいたします。 エクセルは2003を使用しております。

質問者が選んだベストアンサー

  • ベストアンサー
  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.9

こんにちは。お邪魔します。 ちょっと難度高いので短期間で自作できるよう導く自信がないので、 暫定で使って貰えるようにこちらで書いてみました。 27000件のサンプルで動作確認していますが、 実行環境や実際のファイルのあり方によってはメモリ不足も あり得ないこともないです(たぶん大丈夫?)。 VBA的には、遅くはない、程度ですが、 SUMIF()と比べれば、断然速い筈です(手元の環境+ブックでは約0.7秒)。 もし使い物にならないようでしたら、 他の方法で書き直してみようかな?、とも思っています。 とりあえずは、そのままコピペで動くように書いていますので、 試すだけでもしてみてください。 どんな感じか雰囲気だけでも感じとって貰えれば、と思います。 条件や仕様への私の理解が完全とは言えないので、こちらが誤解していれば 期待しされているものとは多少違うかも知れません。 出力先のセル位置や出力の仕方などは、明確に把握できていませんので。 試す場合は、 まず、予めコピーしたブックで、 Sub Re8076330()を どこか適当なモジュールに貼り付けて、 一旦、適当な名前で保存してから、 実行してみてください。 Accessでいうレポートにあたる内容を すべて更新、上書きする形でシートに返すという理解でいます。 簡単に処理の流れだけコメント化して説明しておきます。 そちらで動作確認の上、調整・修正が難しいようでしたら、 具体的な条件・仕様の相違などを補足してみてください。 技術的な内容としては  Worksheet の扱い  Range の扱い  配列変数 の扱い  Scripting.Dictionary の扱い 初~中級の技術の組み合わせです。 Scripting.Dictionary については、このサイトでも、 過去にたくさんの回答が付けられています。 基本的な部分は教則サイトで覚えるとして、 応用的な部分についても資料・情報に困ることはないと思います。 比較的メジャーだという意味で選んだ手法ですので。 もし、このままお使いになるようでしたら、できれば、やがては、 ご自分でメンテ出来るように覚えていって貰えるとい嬉しいのですけど。 # 因みに、ですが、 sheets("データ") の =A3&B3&C3&D3 などの数式についても、 数式に頼らず、VBAで対応する方が何かと軽くできます。 余裕が出来たら検討してみると良いと思います。。 ' ' =================================== ' ' ■ 参照設定 Microsoft Scripting Runtime ■ Sub Re8076330()   Const S__PR_SHEET = " 受注日累計 発送日累計 累計" ' ' ↑ 出力先シート名を半角スペース区切りで指定 ↑(※先頭に半角スペース)   Dim mtxS()   Dim mtxP()   Dim arrK()   Dim arrI()   Dim arrPrSh '  Dim oDict As Scripting.Dictionary ' ■参照設定■した場合   Dim oDict As Object ' ■参照設定■しなかった場合   Dim tnRows As Long   Dim tnUb As Long   Dim tnUniq As Long   Dim nBtm As Long   Dim iPR As Long   Dim i As Long ' ' 元データを配列変数に格納   tnRows = Rows.Count   With Sheets("データ")     mtxS = .Range("E3:H" & .Cells(tnRows, 1).End(xlUp).Row).Value   End With   tnUb = UBound(mtxS) ' ' 出力先シート名を配列に   arrPrSh = Split(S__PR_SHEET) ' ' Dictionary オブジェクトを設定 '  Set oDict = New Scripting.Dictionary ' ■参照設定■した場合   Set oDict = CreateObject("Scripting.Dictionary") ' ■参照設定■しなかった場合 ' ' シートをループ   For iPR = 1 To 3 ' ' 重複しないKeyを作成しつつItemで累計を計算     For i = 1 To tnUb       oDict(mtxS(i, iPR)) = oDict(mtxS(i, iPR)) + mtxS(i, 4)     Next i ' ' Dictionary の中身を一旦、一次元の配列変数に格納     With oDict       tnUniq = .Count       arrK = .Keys       arrI = .Items       .RemoveAll     End With ' ' 一次元の配列変数から出力用の二次元の配列変数に     ReDim mtxP(1 To tnUniq, 1 To 2)     For i = 1 To tnUniq       mtxP(i, 1) = arrK(i - 1)       mtxP(i, 2) = arrI(i - 1)     Next i     Erase arrK, arrI ' ' 出力シートの既存レポートをクリア→配列データを一括出力     With Sheets(arrPrSh(iPR))       nBtm = .Cells(tnRows, "D").End(xlUp).Row       If nBtm > 6 Then .Range("D7:E" & nBtm).Value = Empty       .Range("D7:E" & tnUniq + 6).Value = mtxP     End With     Erase mtxP   Next iPR   Set oDict = Nothing   Erase mtxS, arrPrSh End Sub ' ' ===================================

KOKOROTAKE
質問者

お礼

ご回答ありがとうございます!! 問題が解決いたしました!! 数日間あの手この手で色々試しましたが、やっと前に進む事ができます。 本当にありがとうございました。

その他の回答 (8)

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.8

こんばんは! 一例です。 Alt+F11キー → メニュー → 挿入 → 標準モジュール → VBE画面に ↓のコードをコピー&ペーストしてマクロを実行してみてください。 (Alt+F8キー → マクロ → マクロ実行です) Sub Sample1() 'この行から Dim i As Long, k As Long, endRow As Long, cnt As Long, wS As Worksheet Worksheets.Add after:=Worksheets(Worksheets.Count) Worksheets(Worksheets.Count).Name = "作業用" Set wS = Worksheets("作業用") Application.ScreenUpdating = False With Worksheets("データ") '「受注日累計」Sheet用 .Range("E:E").AdvancedFilter Action:=xlFilterInPlace, unique:=True i = .Cells(Rows.Count, 1).End(xlUp).Row Range(.Cells(3, 5), .Cells(i, 5)).Copy wS.Activate ActiveSheet.Cells(1, 1).Select Selection.PasteSpecial Paste:=xlPasteValues endRow = Worksheets("受注日累計").Cells(Rows.Count, "D").End(xlUp).Row If endRow > 6 Then Range(Worksheets("受注日累計").Cells(7, "D"), Worksheets("受注日累計").Cells(endRow, "D")).ClearContents End If cnt = 6 For k = 1 To wS.Cells(Rows.Count, 1).End(xlUp).Row .Range("E:E").AutoFilter field:=1, Criteria1:=wS.Cells(k, 1) cnt = cnt + 1 Worksheets("受注日累計").Cells(cnt, "D") = WorksheetFunction.Subtotal(9, .Range("H:H")) Next k '「発送日累計」Sheet用 wS.Range("A:A").ClearContents .Range("F:F").AdvancedFilter Action:=xlFilterInPlace, unique:=True i = .Cells(Rows.Count, 1).End(xlUp).Row Range(.Cells(3, 6), .Cells(i, 6)).Copy wS.Activate ActiveSheet.Cells(1, 1).Select Selection.PasteSpecial Paste:=xlPasteValues endRow = Worksheets("発送日累計").Cells(Rows.Count, "D").End(xlUp).Row If endRow > 6 Then Range(Worksheets("発送日累計").Cells(7, "D"), Worksheets("発送日累計").Cells(endRow, "D")).ClearContents End If cnt = 6 For k = 1 To wS.Cells(Rows.Count, 1).End(xlUp).Row .Range("F:F").AutoFilter field:=1, Criteria1:=wS.Cells(k, 1) cnt = cnt + 1 Worksheets("発送日累計").Cells(cnt, "D") = WorksheetFunction.Subtotal(9, .Range("H:H")) Next k '「累計」Sheet用 wS.Range("A:A").ClearContents .Range("G:G").AdvancedFilter Action:=xlFilterInPlace, unique:=True i = .Cells(Rows.Count, 1).End(xlUp).Row Range(.Cells(3, 7), .Cells(i, 7)).Copy wS.Activate ActiveSheet.Cells(1, 1).Select Selection.PasteSpecial Paste:=xlPasteValues endRow = Worksheets("累計").Cells(Rows.Count, "D").End(xlUp).Row If endRow > 6 Then Range(Worksheets("累計").Cells(7, "D"), Worksheets("累計").Cells(endRow, "D")).ClearContents End If cnt = 6 For k = 1 To wS.Cells(Rows.Count, 1).End(xlUp).Row .Range("G:G").AutoFilter field:=1, Criteria1:=wS.Cells(k, 1) cnt = cnt + 1 Worksheets("累計").Cells(cnt, "D") = WorksheetFunction.Subtotal(9, .Range("H:H")) Next k .AutoFilterMode = False .Activate End With Application.DisplayAlerts = False Worksheets("作業用").Delete Application.DisplayAlerts = True Application.ScreenUpdating = True End Sub 'この行まで ※ 一旦マクロを実行すると元に戻せませんので、別Bookに各シートをコピー&ペーストして マクロを試してみてください。m(_ _)m

KOKOROTAKE
質問者

お礼

ご回答ありがとうございます。 おかげ様で問題が解決いたしました!! ただ、今回はNo.9さんのマクロを使用させていただきます。 本当にありがとうございました。

回答No.7

#1です。表記方法に間違いが有りました。申し訳ありません。 (訂正) <受注日累計> オートフィルタ後、A列を検索したい受注日(または受注期間)にしてSUBTOTAL関数で合計表示させる。 <発送日累計> オートフィルタ後、B列を検索したい発送日(または発送期間)にしてSUBTOTAL関数で合計表示させる。 (補足) 推測ですが2003を使われているということですと、OSはXP、5年前位前のPCではないでしょうか。 だとすれば、実際データ量が多くなればなるほど、スペック不足の問題も考え、対応していく必要があります。 私もExcel・Accessでプログラミングをした経緯がありますが、VBA初心者だとこういった集計を作るのはハードルが高いでしょう。 あと、Excelに下手にVBAを組み込んだりシートを多くすればPC環境によってはスペック不足になることもあります。メモリ不足のメッセージが出たら危険信号です(経験上)。 IF文やSUMIFを使うやり方など他にも色々方法がありますので、他にも考えたのですが、やはり提示した方法が一番ベストですね。 A列~D列はそのままにし、H列のデータをE列にもってきて、E列(受注数)の最後に累計欄をつけてSUBTOTAL関数で合計させるだけ。 そしてオートフィルタを行なってから条件抽出すればそんなに難しい手間がかかりません。 式もあまりない上にsheets("データ")のみで済むので、PCに負荷もかからないと思います。 オートフィルタとSUBTOTAL関数の組み合わせは、検索で機能を調べると結構応用できるので、覚えておくといいと思います。

KOKOROTAKE
質問者

お礼

数回にわたりご回答いただき誠にありがとうございました。 今回はマクロを使用して問題解決に至りました。 オートフィルタとSUBTOTAL関数の組み合わせもかなり使えそうです!!他の集計表に使用させていただきました! 本当にありがとうございました。

  • KURUMITO
  • ベストアンサー率42% (1835/4283)
回答No.6

回答No4,5です。 SUMIF関数をデータシートの中で使うようにしてはどうでしょう。試験してみてください。 列を新たに追加してG列、J列、M列を作ります。 G3セルには次の式を入力して下方にドラッグコピーします。 =IF(F3="","",IF(COUNTIF(F$3:F3,F3)=1,SUMIF(F:F,F3,N:N),"")) J3セルには次の式を入力して下方にドラッグコピーします。 =IF(I3="","",IF(COUNTIF(I$3:I3,I3)=1,SUMIF(I:I,I3,N:N),"")) M3セルには次の式を入力して下方にドラッグコピーします。 =IF(L3="","",IF(COUNTIF(L$3:L3,L3)=1,SUMIF(L:L,L3,N:N),"")) 受注日累計シートのA3セルには次の式を入力してE3セルまでドラッグコピーしたのちに下方にもドラッグコピーします。 =IF(ROW(A1)>MAX(データ!$F:$F),"",IF(COLUMN(A1)<=4,INDEX(データ!$A:$D,MATCH(ROW(A1),データ!$F:$F,0),COLUMN(A1)),INDEX(データ!$G:$G,MATCH(ROW(A1),データ!$F:$F,0)))) 発送日累計シートのA3セルには次の式を入力してD3セルまでドラッグコピーしたのちに下方にもドラッグコピーします。 =IF(ROW(A1)>MAX(データ!$I:$I),"",IF(COLUMN(A1)<=3,INDEX(データ!$B:$D,MATCH(ROW(A1),データ!$I:$I,0),COLUMN(A1)),INDEX(データ!$J:$J,MATCH(ROW(A1),データ!$I:$I,0)))) 累計シートのA3セルには次の式を入力してC3セルまでドラッグコピーしたのちに下方にもドラッグコピーします。 =IF(ROW(A1)>MAX(データ!$L:$L),"",IF(COLUMN(A1)<=2,INDEX(データ!$C:$D,MATCH(ROW(A1),データ!$L:$L,0),COLUMN(A1)),INDEX(データ!$M:$M,MATCH(ROW(A1),データ!$L:$L,0)))) 式を入力した段階では時間がかかりますが、その後に新たなデータがデータシートに追加されればそれぞれのシートの表も変わるわけですがその時の時間がどの程度かかるかですね。少しは改善されましたでしょうか?

KOKOROTAKE
質問者

お礼

数回にわたりご回答いただき誠にありがとうございました。 今回はマクロを使用して問題解決に至りましたが、 ご教授いただきました数式は他に流用させていただきます。 本当にありがとうございました。

  • KURUMITO
  • ベストアンサー率42% (1835/4283)
回答No.5

データの量がかなり多くなっていますね。 しかし関数処理に比べて計算が複雑になることからむしろマクロによる処理が遅くなると思いますね。

KOKOROTAKE
質問者

お礼

数回にわたりご回答いただき誠にありがとうございました。 今回はマクロを使用して問題解決に至りましたが、 ご教授いただきました数式は他に流用させていただきます。 本当にありがとうございました。

  • KURUMITO
  • ベストアンサー率42% (1835/4283)
回答No.4

データを処理するため作業列を作って対応しています。ところでお示しの方法ではSUMIF関数にかなりの負担がかかっています。そのために処理速度が極端に遅くなっています。マクロを採用したからといって処理速度が速くなるとは限りません。むしろ遅くなってしまうようなことになるでしょう。 SUMIF関数に負担のかからない方法が必要です。せっかく作業列を作っているのですからもう一つの工夫が必要でしょう。作業列をもう一段設けることです。 E,F,G列に現在ある作業列のそれぞれの間に新たに列の挿入を行います。E列は従来のままで、F列は新規の列、G列は従来のF列で、H列は新規の列、I列は従来のG列で、J列は新規の列、K列は従来のH列になります。 F2セルには次の式を入力して下方にドラッグコピーします。 =IF(E3="","",IF(COUNTIF(E$3:E3,E3)=1,MAX(F$2:F2)+1,INDEX(F$2:F2,MATCH(E3,E$2:E2,0)))) H2セルには次の式を入力して下方にドラッグコピーします。 =IF(G3="","",IF(COUNTIF(G$3:G3,G3)=1,MAX(H$2:H2)+1,INDEX(H$2:H2,MATCH(G3,G$2:G2,0)))) J3セルには次の式を入力して下方にドラッグコピーします。 =IF(I3="","",IF(COUNTIF(I$3:I3,I3)=1,MAX(J$2:J2)+1,INDEX(J$2:J2,MATCH(I3,I$2:I2,0)))) そこで受注日累計のシートでは例えばA2セルから受注日 発送日 取引先 商品名 受注数の項目名をE2セルまで入力します。 A3セルには次の式を入力してE3セルまで横にドラッグコピーしたのちに下方にもドラッグコピーします。 =IF(ROW(A1)>MAX(データ!$F:$F),"",IF(COLUMN(A1)<=4,INDEX(データ!$A:$D,MATCH(ROW(A1),データ!$F:$F,0),COLUMN(A1)),SUMIF(データ!$F:$F,ROW(A1),データ!$K:$K))) A列およびB列にはシリアル値が表示されますのでセルの表示形式を日付に変更します。 発送日累計のシートも同様にA2セルから発送日 取引先 商品名 受注数の項目名をD2セルまで入力します。 A3セルには次の式を入力してD3セルまでドラッグコピーしたのちに下方にもドラッグコピーします。 =IF(ROW(A1)>MAX(データ!$H:$H),"",IF(COLUMN(A1)<=3,INDEX(データ!$B:$D,MATCH(ROW(A1),データ!$H:$H,0),COLUMN(A1)),SUMIF(データ!$H:$H,ROW(A1),データ!$K:$K))) 累計のシートも同様にA2セルから取引先 商品名 受注数の項目名をC2セルまで入力します。 A3セルには次の式を入力してC3セルまでドラッグコピーしたのちに下方にもドラッグコピーします。 =IF(ROW(A1)>MAX(データ!$J:$J),"",IF(COLUMN(A1)<=2,INDEX(データ!$C:$D,MATCH(ROW(A1),データ!$J:$J,0),COLUMN(A1)),SUMIF(データ!$J:$J,ROW(A1),データ!$K:$K))) このように作業列を新たに追加することでSUMIF関数の負担は極端少なくなり、これまでとは全く違った計算速度が得られることでしょう。

KOKOROTAKE
質問者

お礼

ご回答ありがとうございます。 検証させていただきましたが、やはり重くなりました。 データは日々追加されていきますので、3ヶ月周期・27000列程余裕を持たないといけない為、やはり非常に重たくなります。 それと、マクロでも重くなるのですね・・・

  • Nouble
  • ベストアンサー率18% (330/1783)
回答No.3

横から済みません Accessは詳しくないのですが、 開発が終わったものは Accessが入っていないPcでも動かせる とか、聞いたことがありますよ? http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1014426765 お役に立てていたならば幸いです。

KOKOROTAKE
質問者

お礼

ご回答ありがとうございます。 参考になりました!!

回答No.2

要するにやりたいことは、 1.受注日、発送日、取引先、商品名ごとの受注数 2.発送日、取引先、商品名ごとの受注数 3.取引先、商品名ごとの受注数 を求めたいだけですよね? それならAccessにデータを放り込んでクエリかSQLを作成すれば一発だと思います。 たとえば、 1.受注日、発送日、取引先、商品名ごとの受注数を求める場合 SELECT 受注日, 発送日, 取引先, 商品名, SUM(受注数) FROM データ GROUP BY 受注日, 発送日, 取引先, 商品名; 2.発送日、取引先、商品名ごとの受注数を求める場合 SELECT 発送日, 取引先, 商品名, SUM(受注数) FROM データ GROUP BY 発送日, 取引先, 商品名; 3.取引先、商品名ごとの受注数を求める場合 SELECT 取引先, 商品名, SUM(受注数) FROM データ GROUP BY 取引先, 商品名; どうしてもエクセルでやりたいならマクロを作った方が良いと思いますけど、Accessでやるのが一番早いと思います。

KOKOROTAKE
質問者

お礼

ご回答ありがとうございます。 やっぱりAccessですよね・・・↓ すべてのPCがOffice professionalなら問題ないのですが・・・ 私以外すべてpersonalの状況ですので、エクセルしか選択の余地が無いのが実情です・・・・ FileMakerを扱える人材もいるのですが、「簡単にできますよ」で一向に作成してくれない状況で・・・ 畑違いの私が、不勉強ながら作成している所です↓ 私はHTMLやCSSの用な簡単なのは書けるのですが、マクロは専門外で本当に参ってます。 本当にご回答ありがとうございました。

回答No.1

かなり苦労されている様ですね。 やり方としては、オートフィルタとSUBTOTAL関数の組み合わせで処理すればうまくいけば、マクロも使わず1つのシートでいけそうな気がします。 SUBTOTAL関数は、非表示部分を計算しないSUM関数というイメージだと分かりやすいかも。 =SUBTOTAL(109,A1:A100) 109は固定 <受注日累計> オートフィルタ後、A3を検索したい受注日(または受注期間)にしてSUBTOTAL関数で合計表示させる。 <発送日累計> オートフィルタ後、B3を検索したい発送日(または受注期間)にしてSUBTOTAL関数で合計表示させる。 なおSUBTOTAL関数の詳細はこちら。

参考URL:
http://www.excel.studio-kazu.jp/kw/20090219150110.html
KOKOROTAKE
質問者

お礼

ご回答ありがとうございます。 流石に今日は帰宅しましたので、明日検証させていただきます。 ご親切にご対応いただき、ありがとうございます。

関連するQ&A

  • Excelにて、ブランクのセルを検索条件とし、その横の数値を合計する方法は?

    今、伝票集計にてSUMIF()で、該当する商品の累計を出しているのですが、 その中に商品名が不明の為、ブランクにしてあるセルが多々あります。 しかし、その箇所にも当然ながら値段が入っている為、 ブランクを検索条件としても合計できるような関数が知りたいのですが 教えてください。 宜しくお願い致します。

  • 増減するデータの集計について

    Excel2013使用です。 「受注書」というシートのデータを集計し、「集計表」というシートに 書き出したいです。 【シート「受注書」】    C      D      E       F     G   1 商品名   色     数量    単価   備考 2 データ・・・・・・・・・・・・・・・ 【シート「集計表」】    A      B      C      D     E 6 商品名   色     数量    単価   備考 7 シート「受注書」のC~Fのデータをコピーし、 シート「集計表」のA~Dに貼り付け後、商品名を基準に重複を削除し、 各商品の合計数量をSUMIF関数で集計するようにしました。 テストデータでは上手く行ったのですが、「受注書」のデータは都度 増減があるため、データを増やして再度テストしたところ、増やした分の データが「集計表」の下部に残ってしまいます。 こんな感じ↓ 【シート「集計表」】    A      B      C      D     E 6 商品名   色     数量    単価   備考 7 *****    **     ***     ***    ** 8 ****     **     ***  ***    ** 12****     **     ***     ***    ** ←増やしたデータ コードは以下の通りです Sheets("受注書").Select Range("C2:G2").Select Range(Selection, Selection.End(xlDown)).Select Selection.Copy Sheets("集計表").Select Range("A7").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Application.CutCopyMode = False ActiveSheet.Range("$A$6:$E$25").RemoveDuplicates Columns:=1, Header:=xlYes Range("C7").Select Range(Selection, Selection.End(xlDown)).Select Selection.ClearContents Range("C7").Select ActiveCell.FormulaR1C1 = "=SUMIF(受注書!C3:C5,集計表!RC1,受注書!C5)" Range("C7").Select Selection.AutoFill Destination:=Range("C7:C9"), Type:=xlFillValues Range("C7:C9").Select Range("A2").Select End Sub 試しに ActiveSheet.Range("$A$6:$E$25").RemoveDuplicates Columns:=1, Header:=xlYes の部分を ActiveSheet.Range("$A:$E").RemoveDuplicates Columns:=1, Header:=xlYes に変えてみたところ、下部の重複データは消えたのですが、集計結果が何故か A7以降にではなくA4以降に表示されてしまい、罫線も消えてしまいました。 更に、C列の数量に不要な0が表示されてしまいます。 こんな感じ↓   A      B      C      D     E 4 商品名   色     数量    単価   備考 5 *****    **     ***     ***    ** 6 ****     **     ***  ***    ** 7                0 8                 0 どこを直したら良いでしょうか?

  • Excel マクロで同じワークシート内で複数の条件が一致するものを

    Excel マクロで同じワークシート内で複数の条件が一致するものを 抽出する方法がありますか。具体的にはワークシート構成は|31日| 30日|29日|・・・|2日|1日|7月集計|品目別集計|となっています。 例として11日シートのC29にバナナ(品目)、E29に国産(規格)、F29 に20(数量)とあった場合に搬入品目別集計シートの同じ行にあるB 列(品目)、E列(規格)の一致するものを検索して該当する行より下 の最初のA列の空白に平成22年7月11日(搬入日)、同じく最初のB列 の空白(搬入日と同じ行になる)には20(数量)を出力する。12日シー トにC29バナナ、E29国産、F29に16とあれば搬入品目別集計シート に出力(平成22年7月11日の下にくるように)するという具合にする ことは可能でしょうか。品目もバナナ・メロンなど複数あり、規格 も国産・台湾産などと複数あるので11日シート(12日シートも同じ) のC29~C58、E29~E58の中で同じ行にあるものを品目別集計シー トのB列(品目)F列(規格)の同じ行にあるものを検索して出力させる。 うまく表現できませんが11日シートなどに日毎に搬入したものを入 力したときに、搬入品目別シート(先に必要な分の品目・規格を入力 した表を先に作成してある)のなかを検索して一致するものを品目毎 ・搬入日順に搬入数量を出力させる作業を手作業ではなく自動的に行 いたいのですが可能でしょうか。長文になりましたが初心者なので 具体的に教えていただきたいのですがどなたか宜しくお願い致します。

  • 関数を使った合計が1少なく集計されてしまいます

    F9に =SUMIF(商品!$M$6:$M:$992,$D9,商品!$L$6:$L$992)  以下F34まで同じ計算式が入っています。  F34に =SUMIF(商品!$M$6:$M:$992,$D34,商品!$L$6:$L$992) F35でF9からF34までの集計をしています =SUM(F9:G34) F35の値が実際の計算より1少なくなってしまいます 正しく計算するには どのような計算式をいれたらいいでしょうか? 教えて下さい。よろしくお願い致します。

  • sumifのように条件に見合う合計を「数値」ではなく「データ(セル)」の合計を集計したいのですが

    SUMIFを使って合計範囲の数値の合計を求めるように、合計範囲の「データが入力されているセル」の合計を求めたいのですが、何かいい関数はありませんでしょうか? 言い換えると、COUNTAを使ってセルの個数を求める場合に検索条件をSUMIFのように特定の検索条件を指定できる関数です。 いろいろ探しましたがうまい方法が見当たりません。 使用方法としては、各曜日ごとのメニュー別の売上金額の合計と人数の合計を求めようとしています。 ワークシートに入力されてるデータは ・各曜日 ・顧客名 ・メニューと支払われた金額 です。 SUMIFを使って、検索条件に各曜日をあてはめ、曜日ごとのメニュー別売上は集計できました。 金額が入力されているセルを合計すれば各メニューごとの人数まで集計できるはずなのですが、SUMIFが「数値」しか集計できない為にそれに代わる関数を探しています。 どうぞよろしくお願い致します。

  • Excel 条件に一致する日付の求め方について

    こんにちは!初めて質問します。 Excel関数の使い方がわからずに困っています。 売上と在庫管理をそれぞれ別シートに入力しています。 売上が出た場合、在庫管理シートに売上日が表示されるようにしたいのです。 シートは、このような形で、それぞれデータを入力しています。 売上表シート A列  B列    C列      D列 日付  顧客名  商品コード  売上金額 在庫管理シート A列   B列     C列    D列    E列 入荷日 商品コード  商品名  売上日  売上金額 商品コードが一致する売上表シートの日付を、在庫管理シートの売上日に表示させたいのですが、 上手くいきません。 売上金額はSUMIF関数で処理することができました。 Excelに関する知識も乏しく、非常に困っています。 なにぶん初めての質問のために質問内容も的を得ず、わかりづらいかもしれませんが、 どなたかお分かりになる方、是非ご教示くださいませ。

  • Excel で 複数条件の合計を出したい。。。

    どなたかご存知の方がいたら教えてください!!!(汗) 下記のようなデータがあります。 列は時系列でデータがどんどん増えていきます。 例)A列=1月  1行目=Xの時系列データ   B列=2月  2行目=Yの時系列データ   C列=3月  3行目=Xの時系列データ    ・      4行目=Zの時系列データ    ・   A列のXのデータの合計をしたい場合は、SUMIF関数を 使えばよいと思うのですが・・・ あるセルに○月と入力するとそのセルの日付を参照して、 その月のX条件だけを満たす合計を出す場合にはどのような関数を使えばよいのでしょうか? もしくは、どのように関数を組合せばよいのでしょうか? なかなかうまく説明できなかったのですが、 よろしくお願いします!!!

  • エクセルのMAX関数を複数条件で

    エクセルのMAX関数を下記のような複数条件をつけて 使いたいのですが、自分で式を書いてもうまくいきません。 アドバイスをよろしくお願いします。 A1に「部署名」、B1に「受注個数」、C1に「受注日」と見出しをし (A2:C9)にデータを入力した表があるとします。 部署名には営業1部、営業2部、営業3部のいずれかが入力されていて、 受注日には6月22日と、6月23日のいずれかの入力があるとします。 この表で「営業1部」であり、「6月22日」のものである受注個数の 最大の値を返したいのです。 日付「6月22日」は別途(E2)に参照用として入力したものを使いたいです。 =MAX(IF(AND(A2:A9="営業1部",C2:C9=E2),B2:B9,"")) これではダメでしょうか。 初歩的ですみません、よろしくお願いいたします。

  • エクセル2003の「串刺し集計」について教えてください。

    年度別の売上等の集計表を作っています。 月毎にシート名を「0604」、「0605」・・・とし、半期毎にも集計を かけたいと思っています。(0604~0609のシート間) それぞれのシートは同じ表で、B列に「曜日(月~日)」が D列には「客数」が入っています。 そこで「特定の曜日の客数」を半期毎の集計シート(0609の後)に 表示させようとして、下記のような関数を入れました。 =sum('0604:0609'!,sumif($c$2:$c$30,"月",d2:d30)) しかし、「入力された数式は正しくない」と表示されてしまい ヘルプを参照しましたが、一般的な入力時の注意だけでした。 SUMにはSUMIFを組み合わせられないのでしょうか? 参照するセルの値が変わっても、集計結果に反映される関数を 教えていただけませんでしょうか。

  • Accessレポート 複数条件での集計

    どなたかお知恵をお貸しください。 テーブル名:T_当社 フィールド:商品管理番号(テキスト)、入庫日(日付)、数量(数値)、金額(数値)、伝票番号(テキスト) テーブル名:T_取引先 フィールド:商品管理番号(テキスト)、入庫日(日付)、数量(数値)、金額(数値) クエリ名:Q_商品一致 元テーブル:[T_当社]、[T_取引先] フィールド:商品管理番号(テキスト)、入庫日(日付)、数量(数値)、金額(数値)、伝票番号(テキスト) 抽出条件:[当社]テーブルの[商品管理番号]と[取引先]テーブルの[商品管理番号]が一致するものだけ データベース構成は以上の通りです。下記のようなレポートを作成したいのです。 条件1:[入庫日]を月単位でグループ化し、[数量][金額]を集計する。----- レポート上の表示項目名[数量][金額] 条件2:[伝票番号]の値が[3U]で始まるものと、[3N]で始まるものは、 条件1の[数量]と[金額]から差し引いて、別列に表示させる。 ※3U、3Nのデータに関しては、[0]が表示されず、空白でもOK。 自分でしたのは、下記の通りです。 1.Q_商品一致クエリで、[伝票番号]が、3Uと3Nで始まるレコードを除外。 2.Q_商品一致クエリを元に、[伝票番号]が、3Uで始まるレコードだけを抽出するクエリ[Q_3U]を作成。 3.Q_商品一致クエリを元に、[伝票番号]が、3Nで始まるレコードだけを抽出するクエリ[Q_3N]を作成。 4.Q_商品一致クエリを元に、[入庫日]でグループ化したクエリ[Q_商品一致(月別)]を作成。  Q_3U、Q_3Nも同様に、[入庫日]でグループ化したくエリを作成。 (4)で作成した3つのクエリを、1つの選択クエリにしてみたのですが、これだと、例えば、 4月度にしか[3N]データがない場合でも、5月度以降の行にも、4月度の[3N]データの値が繰り返し表示されてしまいます。

専門家に質問してみよう