Excelシート毎の比較、抽出

このQ&Aのポイント
  • 各果物のSheet毎に売上率を比べて、「合計」Sheetに一番高い売上率を表示させたい。
  • 各果物のSheetから抽出したデータを「合計」Sheetに表示させたい。
  • 新しいSheetが追加されても対応できるような式が必要。
回答を見る
  • ベストアンサー

Excel シート毎の比較、抽出

教えて頂きたい事が、二つあります。 sheetの名前が 「合計」「レモン」「みかん」「オレンジ」「ブドウ」「ひな形」とあります。 (1)各果物のSheetのセル(R7C6)に売上率が書いています(数値)  各果物のSheet毎に売上率を比べて  「合計」Sheetの同位置のセル(R7C6)に、一番高い売上率を表示させたい。 (2)もう一つは  各果物のSheetのあるセル(R7C7)に色が書いてあります(文字列)  書いてないこともあります。  「合計」Sheetの同位置のセル(R7C7)に各Sheetより抽出したデータを  表示させたい。    例えば    Sheet 「レモン」「みかん」「オレンジ」「ブドウ」「ひな形」    R7C7    黄    紫   (空欄)   群青  (空欄)    でSheet「合計」セル(R7C7)に         [黄 紫 群青]    と言うような具合。   「=レモン!R7C7&" "&みかん!R7C7&" "&オレンジ!R7C7&" "&ブドウ!R7C7」    とすると、スペース分が出てしまい、綺麗に表示されません。 今後フルーツが増えていく予定 (「合計」「レモン」「みかん」「オレンジ」「ブドウ」「メロン」「ひな形」) (「合計」「レモン」「みかん」「オレンジ」「ブドウ」「りんご」「メロン」「ひな形」) (「合計」「パイナップル」「レモン」「みかん」「オレンジ」「ブドウ」「りんご」「メロン」「ひな形」) なので間(合計が先頭でひな形が一番後ろ)に新しいsheetが入っても、対応できるような式がいいのですが・・・

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

  • ベストアンサー
  • mz80
  • ベストアンサー率46% (13/28)
回答No.5

(1)Book内の総シート数Cntの設定のコーディングがなくなっています。このため、For i=1 To Cnt のループが1回も実行されません。結果、売り上げは0 色は空欄となります。 (2)最大売上を最小値0に、また、色を空っぽにするのは、行のループ内です。 (3)処理しないシート名が「レモン」と「ひな型」以外になっています。「レモン」でなく「合計」だと思います。 およそ500行で「レモン」~「ぶどう」の4シートで5秒くらいかかりますね(私のPCだと)。シートが増えるとかなり動作が遅くなりそうな。 Sub Uriage() Dim SaidaiUriage As Long Dim UriageIroGyo As Integer Dim UriageRetu As Integer Dim Iro As String Dim IroRetu As Integer Dim Cnt, i As Integer UriageRetu = 6 IroRetu = 7 'Book内の総シート数 (1)の指摘事項 Cnt = Worksheets.Count For UriageIroGyo = 7 To 501 '最大売上を最小値0に、また、色を空っぽにする (2)の指摘事項 SaidaiUriage = 0 Iro = "" '各シートの同一行を比較し、最大売上と色を求める For i = 1 To Cnt '(3)の指摘事項 If Not ((Worksheets(i).Name = "合計") Or (Worksheets(i).Name = "ひな形")) Then '売上の大きいのはどちらか If (Worksheets(i).Cells(UriageIroGyo, UriageRetu).Value > SaidaiUriage) Then SaidaiUriage = Worksheets(i).Cells(UriageIroGyo, UriageRetu).Value End If '色取得 If Not IsEmpty(Worksheets(i).Cells(UriageIroGyo, IroRetu).Value) Then Iro = Iro & " " & Worksheets(i).Cells(UriageIroGyo, IroRetu).Value End If End If Next i Worksheets("合計").Cells(UriageIroGyo, UriageRetu).Value = SaidaiUriage Worksheets("合計").Cells(UriageIroGyo, IroRetu).Value = Iro Next UriageIroGyo End Sub

MORICK
質問者

お礼

できました!感動です (T T) なんも知らない自分に ホントにありがとうございます。

その他の回答 (4)

  • mz80
  • ベストアンサー率46% (13/28)
回答No.4

No.1です。 細かなことは長くなるので、ご自身のコーディングと比較して見てください。 MORICKさんの作られた構想は、1つのシート内の有効な行でループし売上を取得。次のシートに移り、先ほどのシートの売上と行ごとに比較し最大を求める。これをシート数分繰る返すとなっています。 この場合、全シートでの処理が終わらないと各行の最大売上が決まらないため、行数分の最大売上を覚えておく場所が必要です(dimで配列を定義)。で、この考えは素直な考え方です。もし、行が固定で10とか決まるのであれば、この構想でOKです。 シート内のデータの入った行数は、excelから教えてもらえないようです。rows.countは、範囲指定時の行数で指定していないと65565みたいです(本当はあるのかもしれません。私が知らないだけかも)。 そこで、基本となる行数をシート「レモン」の売上欄が空っぽでない行までとして最初に数え、1行ごとの比較を全シートで行い、シート「合計」に結果を書き込み、これを行数分繰り返す様な構想に変更しました。 あと、これはつけたしですが、イベントプロシージャー、この場合Worksheet_Activateですが、ここに直接コーディングを入れるのは、勉強するのには、余りよくないのです。そこで、本来の処理は、標準モジュールに作成し、Worksheet_Activateの中は、1行だけCALL文を入れるようにしました。動作がおかしい場合、このCALL文をコメントにしてしまえば、プログラムは動かなくなるという利点もあります。 内容は シート合計のモジュールは Option Explicit Private Sub Worksheet_Activate() Call Uriage End Sub 標準モジュールは Option Explicit Sub Uriage() 'シート「合計」からWorksheet_Activateで呼び出される 'シート「レモン」の売上欄、7列目に行方向に連続で値が '入っているものとし、各シートはその行数分処理する ' Dim SaidaiUriage As Long Dim UriageIroGyo As Integer Dim UriageRetu As Integer Dim Iro As String Dim IroRetu As Integer Dim Cnt, i As Integer Dim myLastRow As Long UriageRetu = 6 IroRetu = 7 'Book内の総シート数 Cnt = Worksheets.Count 'シート「レモン」の売上欄には、有効な行数分連続で値が '入っているものとして '処理行数を決定する。1行目から調べ、未入力行で終了 i = 1 While (Not IsEmpty(Worksheets("レモン").Cells(i, UriageRetu).Value)) i = i + 1 Wend '未入力行の行番号なので処理する行より1つ多い。 'マイナス1して、処理行数とする myLastRow = i - 1 '最大売上の取得ループ '行数分ループ For UriageIroGyo = 1 To myLastRow '最大売上を最小値0に、また、色を空っぽにする SaidaiUriage = 0 Iro = "" '各シートの同一行を比較し、最大売上と色を求める For i = 1 To Cnt If ((Worksheets(i).Name = "合計") Or (Worksheets(i).Name = "ひな形")) Then '何もしない Else '売上の大きいのはどちらか If (Worksheets(i).Cells(UriageIroGyo, UriageRetu).Value > SaidaiUriage) Then SaidaiUriage = Worksheets(i).Cells(UriageIroGyo, UriageRetu).Value End If '色取得 If Not IsEmpty(Worksheets(i).Cells(UriageIroGyo, IroRetu).Value) Then Iro = Iro & " " & Worksheets(i).Cells(UriageIroGyo, IroRetu).Value End If End If Next i Worksheets("合計").Cells(UriageIroGyo, UriageRetu).Value = SaidaiUriage Worksheets("合計").Cells(UriageIroGyo, IroRetu).Value = Iro Next UriageIroGyo End Sub

MORICK
質問者

補足

>シート「レモン」の売上欄、7列目に行方向に連続で値が入っているものとし、 なんですが入ってません(汗)途中空欄の行が数カ所あります。 ただ列は501行と決まってるので以下のように作ってみたのですが・・・ マクロは動いてはいるのですが、 売り上げは0 色は空欄のままです。なぜなんでしょうか・・・? Option Explicit Sub Uriage() Dim SaidaiUriage As Long Dim UriageIroGyo As Integer Dim UriageRetu As Integer Dim Iro As String Dim IroRetu As Integer Dim Cnt, i As Integer Dim myLastRow As Long UriageRetu = 6 IroRetu = 7 '最大売上を最小値0に、また、色を空っぽにする SaidaiUriage = 0 Iro = "" For UriageIroGyo = 7 To 501 '各シートの同一行を比較し、最大売上と色を求める For i = 1 To Cnt If Not ((Worksheets(i).Name = "レモン") Or (Worksheets(i).Name = "ひな形")) Then '何もしない '売上の大きいのはどちらか If (Worksheets(i).Cells(UriageIroGyo, UriageRetu).Value > SaidaiUriage) Then SaidaiUriage = Worksheets(i).Cells(UriageIroGyo, UriageRetu).Value End If '色取得 If Not IsEmpty(Worksheets(i).Cells(UriageIroGyo, IroRetu).Value) Then Iro = Iro & " " & Worksheets(i).Cells(UriageIroGyo, IroRetu).Value End If End If Next i Worksheets("合計").Cells(UriageIroGyo, UriageRetu).Value = SaidaiUriage Worksheets("合計").Cells(UriageIroGyo, IroRetu).Value = Iro Next UriageIroGyo End Sub

  • NNAQ
  • ベストアンサー率56% (104/184)
回答No.3

(1)は単純に =MAX(レモン:ひな形!RC) (2)はシートを追加するならVBAのほうがいいですが、力技なら =IF(レモン!RC<>"",レモン!RC,"")&IF(みかん!RC<>""," "&みかん!RC,"")&IF(オレンジ!RC<>""," "&オレンジ!RC,"")&IF(ブドウ!RC<>""," "&ブドウ!RC,"")&IF(・・・・・・

  • mz80
  • ベストアンサー率46% (13/28)
回答No.2

No.1です。 集計をするタイミングは、合計シートをクリックした時とした場合… 1.メニューでツール→マクロ→Visial Basic Editorを選択します。VBEの画面が表示されます。 2.画面は、普通「プロジェクト-VBAProject」というタイトルのウインドウが左に表示されるはずです。 出ていなければ、VBE画面のメニューで表示→プロジェクトエクスプローラを選択します。ウインドウが表示されます。 3.プロジェクトウインドウにはフォルダーのアイコンの下にシート名のぶら下がった一覧が出ています。合計のシートをダブルクリックします。コード入力のウインドウが開きます。 4.回答のコーディングをコピーし、コード入力のウインドウに貼り付けます。 これでいいはずです。やってみてください。最初は誰でもわからないものです(^^; Worksheet_Activateというプログラムのモジュール名は、決まり文句でそのシートが選択されたとき、excelが自動的に呼び出すものです。 集計のタイミングを自分でボタンでクリックする、あるいは、メニューのツール→マクロから選ぶのであれば 「Worksheet_Activate」を別な名前、例えば「Uriage」とかにして、標準モジュールに貼り付けていただければOKだと思います。

MORICK
質問者

お礼

できました。と言うか、できてました(汗 てっきり普通の式入力のように何か表示されるものだと思ってて。ありがとうございます。 これは他の行もする場合はどうしたらよろしいのでしょうか・・・頑張ってみたのですが動きません。 Private Sub Worksheet_Activate() Dim SaidaiUriage As Long Dim UriageGyo, UriageRetu As Integer Dim Iro As String Dim IroGyo, IroRetu As Integer Dim Cnt, i As Integer Dim j As Integer Dim myLastRow As Integer UriageGyo = j UriageRetu = 6 IroGyo = j IroRetu = 7 SaidaiUriage = 0 Iro = "" 'Book内の総シート数 Cnt = Worksheets.Count myLastRow = Rows.Count '最大売上の取得ループ For i = 1 To Cnt For j = 1 To myLastRow If ((Worksheets(i).Name = "合計") Or (Worksheets(i).Name = "ひな形")) Then '何もしない Else '売上の大きいのはどちらか If (Worksheets(i).Cells(UriageGyo(j), UriageRetu).Value > SaidaiUriage) Then SaidaiUriage = Worksheets(i).Cells(UriageGyo(j), UriageRetu).Value End If '色取得 If Not IsEmpty(Worksheets(i).Cells(IroGyo(j), IroRetu).Value) Then Iro = Iro & " " & Worksheets(i).Cells(IroGyo(j), IroRetu).Value End If End If Next j Next i Worksheets("合計").Cells(UriageGyo, UriageRetu).Value = SaidaiUriage Worksheets("合計").Cells(IroGyo, IroRetu).Value = Iro End Sub

  • mz80
  • ベストアンサー率46% (13/28)
回答No.1

マクロならこんな感じです。 ここでは、計算するタイミングをシートの合計が選択された時点で行っています(シート名、合計のActivateイベントプロシージャとしてコーディングしています)。そのあたりは、調整してください(ボタンを作ってクリックした時点で計算する等)。 Option Explicit Private Sub Worksheet_Activate() Dim SaidaiUriage As Long Dim UriageGyo, UriageRetu As Integer Dim Iro As String Dim IroGyo, IroRetu As Integer Dim Cnt, i As Integer UriageGyo = 7 UriageRetu = 6 IroGyo = 7 IroRetu = 7 SaidaiUriage = 0 Iro = "" 'Book内の総シート数 Cnt = Worksheets.Count '最大売上の取得ループ For i = 1 To Cnt If ((Worksheets(i).Name = "合計") Or (Worksheets(i).Name = "ひな形")) Then '何もしない Else '売上の大きいのはどちらか If (Worksheets(i).Cells(UriageGyo, UriageRetu).Value > SaidaiUriage) Then SaidaiUriage = Worksheets(i).Cells(UriageGyo, UriageRetu).Value End If '色取得 If Not IsEmpty(Worksheets(i).Cells(IroGyo, IroRetu).Value) Then Iro = Iro & " " & Worksheets(i).Cells(IroGyo, IroRetu).Value End If End If Next i Worksheets("合計").Cells(UriageGyo, UriageRetu).Value = SaidaiUriage Worksheets("合計").Cells(IroGyo, IroRetu).Value = Iro End Sub (字下げが表示されず大変見にくくなっています。)

MORICK
質問者

お礼

ありがとうございます。。。 なんですが、マクロを一度も使用したことがないもので・・・(汗 .メニューの「挿入」→「標準モジュール」 .標準モジュールに以下のVBAコードをコピーペーストします。 .ワークシートからメニューの「ツール」→「マクロ」→「マクロ」で、出てきたものを選択肢して、実行 とあったので見よう見まねでしましたが このやり方でやっても「Worksheet_Activate()」が 出てこないので実行できません(涙 すいません初心者で。。。

関連するQ&A

  • マクロについて質問です。

    A B C   1 3 りんご 2  赤 3 くだもの 4 6 みかん 5 オレンジ 6 くだもの 7 9 ぶどう 8  紫 9 くだもの というデータがシート1にあったとして、シート2のa2セルに6と入力すると以下のようにa5セル以降に抽出し、6という入力を消すと抽出したものも消えるようなマクロを教えていただきたいです。どうかよろしくお願いします。 6 みかん  オレンジ  くだもの

  • Excel 関数 照合した結果がどこにあるのか表示したいのですが

    照合したいデータがあります。 A列とB列のセルを照合の結果、B列のセルがA列のどこにあるか、C列に行番号を表示したいのですが。 どのような関数がいいのか教えてください。よろしくお願いします。   A列   B列   C列 1 リンゴ みかん  2 2 みかん いちご  4 3 バナナ レモン  6 4 いちご メロン  5 5 メロン ぶどう  × 6 レモン

  • エクセルで集計

    エクセルで複数のシートの表の文字列を元にその横のセルにある 数字を選びだして別シート(合計用のシート) に合計の出し方を教えて下さい 一枚目のシート     A      B     1   イチゴ   2 2    メロン     3 3   レモン     4 二枚目のシート     A      B     1   イチゴ    1 2    メロン     2 3   レモン     1 合計のシート(ここを自動で集計したいです)     A       B     1   イチゴ    3 2    メロン      5 3   レモン      5

  • エクセルで範囲内のデータを別シートにうつしたい

    エクセルで特定の範囲内の数値にあてはまるデータを別のシートに新たな表として作成したいのですが、簡単な方法があれば教えてください。 例えば Sheet1   A   B     C  1 25  ミカン   3000 2 30  リンゴ   4500 3  5  メロン   9800 4 17  ブドウ   1800 5 50  バナナ  1000 このようなデータを次のような表にしたいのです。 A列の数値が10~30のみ行ごと抜粋する Sheet2   A   B     C  1 25  ミカン   3000 2 30  リンゴ   4500 3 17  ブドウ   1800  よろしくお願いいたします。

  • Excelで複数条件で抽出した複数データを出力

    Excelで複数条件で抽出した複数データを出力したい Shett1のセルAとセルBの複数条件で、Sheet2を検索し一致したSheet2のセルCを Sheet1の該当するセルCに入れたいのです。 それを関数でするのはどうしたらいいのでしょうか? Sheet1 A B NAME ID(タイトル) いちご A01 いちじく A02 かき B01 すいか C01 なし D01 ぱいなっぷる E01 ばなな E02 ぶどう F01 みかん G01 めろん H01 もも I01 りんご J01 Sheet2 A B C 名前 ID 漢字(タイトル) みかん G01 蜜柑 いちご A01 苺 ぶどう F01 葡萄 りんご J01 林檎 もも I01 桃 かき B01 柿 なし D01 梨 すいか C01 西瓜 いちじく A02 無花果

  • 条件付書式の延長で・・・

    初めて利用させていただきます。どうか教えてください。 いくつかのページを拝見したのですが、自分の問題解決には至りませんので助けて頂きたいのです。 ○○さん りんご みかん メロン ぶどう △△さん みかん ぶどう 柿 ××さん りんご めろん りんご 上記の様な時に、「りんご」のセルは赤、「みかん」のセルはオレンジに「ぶどう」のセルには紫、「メロン」のセルには緑、「柿」のセルには黄色と言ったように『セルの背景色』を指定したいのですが何とかなるものでしょうか?

  • エクセル 複数セル 統合・集計

    詳しい形は画像でアップしていますが,エクセルで品物の品名と,その種類の違いごとに統合・集計できないかと思っています。 これまで質問させていただくなかで,     A      B      C       統合セル    みかん2   ぶどう1   みかん3    みかん5,ぶどう1 と表記するすばらしいマクロを教えていただきました。 今度は,それを発展させた集計表(詳細は画像)ができたらうれしいと考えています。  A         B               C                統合セル 果物  果物4(みかん2,ぶどう2) 果物3(なし1,みかん2)  果物7(みかん4,なし1,ぶどう2) 野菜  野菜3(トマト3)        野菜1(カボチャ1)      野菜4(トマト3,カボチャ1) という風です。 マクロだけでなく,別表を作ったり,セルの配置を工夫したり…といった手が加わっても構いません。 同じような質問を繰り返してしまい,たいへん心苦しいですが,どうぞご教授いただけましたら助かります。   

  • エクセル 2枚のシートの違いを抽出したい

    目を通していただきありがとうございます。 エクセルは全く詳しくないため、質問させていただきます。 sheet1とsheet2に各2000行ほどの表があります。 sheet1 A列(商品) B列(産地) C列(定価) D列(特価) E列(数量)  みかん    愛媛     100      80       500  みかん    静岡     120      85       400  オレンジ  アメリカ     150      90       100   sheet2 A列(商品) B列(産地) C列(定価) D列(特価) E列(数量)  みかん    愛媛     100      80       300  オレンジ  アメリカ     150     100       100  いちご     福岡     300     150       100  みかん    静岡     120      70       400 それぞれ「1行目のみかん」はA~D列まで同じ値で、E列のみの違いですので、 抽出の必要はありません。 sheet2の3行目のいちごはsheet1にはありませんので、これも抽出の必要はありません。 sheet1の2行目とsheet2の4行目のみかん、 sheet1の3行目とsheet2の2行目のオレンジ、はD列(特価)の違いがあります。 この<D列のみ違いがある>ものを行単位でsheet3に抽出したいのですが、 何か良い方法(関数等)がありましたら、教えていただけないでしょうか? なお、表題に「エクセル」と書きましたが、実際はKingsoftのSpreadsheets 2012を使用しています。 基本的な関数でしたらそのまま使えるようですので、エクセルとして書かせていただきました。 よろしくお願いいたします。     

  • エクセルでA1にりんごB1に100とあったら積算する

    エクセル(open office.org3/Mac版)を使っています。 セルA1~にりんご、みかん、ぶどう…とあります。 B1~にそれぞれ数字が入っています。 りんご 100 みかん 200 ぶどう 300 りんご 200 みかん 100 …こんな感じでずらっと並んでいます。 それぞれの果物の合計を出したいです。 りんご合計 300 みかん合計 300 ぶどう合計 300 基本がよくわかっていません…。 現在は=SUMIF(A1:A10,"りんご",B1:B10)としていますが、 エラー508と出てしまいます。 =SUM(C1:C10)だと普通に計算できます。 「エラー508」で検索してヒットしたページ(http://oooug.jp/faq/index.php?faq/4/1494)に 「公式リリースの3.0をお使いください」という回答がついているのですが、 使用しているバージョンは3.0.0です。

  • excelでシートから別シートに抽出する方法

    データシートに A   B    C 佐藤 りんご  25個 木村 オレンジ 3個 伊藤 メロン  12個 伊藤 スイカ  2個 佐藤 イチゴ  40個 佐藤 マンゴー 8個 というデータがあったとします。 それを別のシートに A   B    C 佐藤 りんご  25個    イチゴ  40個    マンゴー 8個 また別のシートに A   B    C 伊藤 メロン  12個    スイカ  2個 といったようにAに佐藤とか伊藤とか入力するだけでB、Cが自動で抽出できるようにできますか? 出来れば関数の入力でやりたいのですがわかる人がいましたらご教授ください。

専門家に質問してみよう