まりふのひと

既存のExcelゴルフスコア表からグラフを作る−2

平均スコアの計算式

§ セルF1
  • 入力:
    =AverageIf(B5:B1000,E1,F5:F1000)
  • 解説: セルB5〜B1000(開催年)の値が、セルE1 に等しいセルF5〜F1000(Out)の平均値。
  • 補正後: “=AVERAGEIF($B$5:$B$1000,$E1,F$5:F$1000)”
    • セルB5〜B1000 は、式のコピー方向(下、右)を問わず固定。
    • セルE1 は、
       下にコピーした時は E2 に、右にコピーした時は E1 なので、列のみ固定する。
    • セルF5〜F1000 は、下にコピーしても F5〜F1000、右にコピーした時は G5〜G1000 なので、行のみ固定する。
§ セルF1 以外
  • セルF1 の計算式をコピーすればよい。

ヒント
  1. この計算式の問題点は「行の最大値を 1000 にしている」こと。
    • この値を超えた行は計算の対象外になってしまう。大きくすると計算(検索)に時間が掛かる。小さくする、その後 追加したデータが反映されない等の問題点があり悩ましい。
    • マクロでは、通常、Ctrl+↓ を上手く使って計算するので無駄がない。
    • Indirect 関数を使ってみたが、式のコピーが出来ない(コピーしても行や列が自動的に変わらない)ので、ここでは使えない‥‥ ことがわかった。(たぶん)
    • 試しに‥‥ 行を挿入してみた。
      (1)挿入前のセルF1の計算式:=AVERAGEIF($B$5:$B$1000,$E1,F$5:F$1000)
      (2)行番号 250の下に、10行挿入する。(行251〜260を行選択し、右クリック⇒[挿入])
      (3)挿入後のセルF1の計算式=AVERAGEIF($B$5:$B$1010,$E1,F$5:F$1010) ‥‥ 1000が1010になっていた。
       この技?、使える!!!!!
  2. 平均スコアの年を変えると、その年の平均値が表示される。
  3. 参考)回数は “=CountIf($B$5:$B$1000,E1)” で求められる。(開催年の個数)

グラフ作成に必要な表を作る

 新しいシートに、次のような、年毎の平均値の表を作る。

  • シート名: 平均値表 (名前は任意)
  • 項目
    • 開催年 ‥‥ 検索に使うので、スコア表の「開催年」と同じ設定にする。
    • 平成年 ‥‥ これはグラフ作成に必要な項目で、項目名は任意。
    • 回数 ‥‥ 年間の回数
    • Out、In、中、グロス、Net、パット数 ‥‥ セルの書式設定は、スコア表に合わせた方がよい。
  • これに伴い、ゴルフスコア表があるシート見出しを「スコア表」とした。(名前は任意)




 作り方

§ 開催年
  • 入力は数字のみ(2008,2009,2010…)とする。
  • 何年まで作るかは任意。(後から解るが、多く作ってもあまり意味がない)
§平成年

 文字型にしておかないと、グラフ作成時トラブル可能性がある。
作り方は任意であるが、開催年と整合性が取れていることが条件。

  • 例1:セルB2に “平成20年” と入力し、フィルハンドルでコピーする。
  • 例2:セルB2に “="平成"&(A8-1988)&"年"” と入力し、フィルハンドルでコピーする。
    • 西暦年−1988=平成年 になることを利用したもの。
  • 例3:セルB2に
    =TEXT(A2&"/1/1","gggee年")
    と入力し、以下はフィルハンドルでコピーする。
    • これは、西暦年の1月1日の日付を作り元号年に変換する方法で、開催年と完全に整合性が取れている。
§ 回数

 “CountIfカウント イフ” 関数を使い、スコア表の「開催年」(B列)から平均値表の「開催年」(A列)に一致するセルの数を取得する。

  1. セルC2をクリックする。
  2. “=countif(”と入力し、
  3. (関数の挿入)をクリックする。
  4. 「範囲」にカーソルを移し、
  5. [スコア表]シートを前に出し、
  6. セルB5からB10までドラッグして選択する。
  7. “スコア表!B5:B10”と表示されるので、“スコア表!B5:B1000” に修正する。
    • 本来ならば B5から B1000まで選択するのであるが、面倒なので便法をとったもの。
  8. 「検索条件」にカーソルを移し、
  9. [平均値表]シートのセルA2をクリックする。
     →検索条件に“A2”が入る。
  10. [OK]をクリックする。
     →数式バーに
    =COUNTIF(スコア表!B5:B1000,A2)
    と表示される。

  11. この数式を下にコピーすると、B列の範囲が変わってしまうため、絶対番地に変更する。
     →“=COUNTIF(スコア表!$B$5:$B$1000,A2)”
  12. フィルハンドルを使って、数式を下にコピーする。
§ Out

 “AverageIfアベレージ イフ” 関数を使い、スコア表の「開催年」(B列)から平均値表の「開催年」(A列)に一致する「Out」(F列)の平均値を取得する。

  1. セルD2をクリックする。
  2. “=averageif(”と入力し、
  3. (関数の挿入)をクリックする。
  4. 「範囲」にカーソルを移し、
  5. [スコア表]シートを前に出し、
  6. セルB5〜B10を選択する。
  7. “スコア表!B5:B10”と表示されるので、“スコア表!B5:B1000” に修正する。
  8. 「条件」にカーソルを移し、
  9. [平均値表]シートのセルA2をクリックする。
     →条件に“A2”が入る。
  10. [平均対象範囲]にカーソルを移し、
  11. [スコア表]シートを前に出し、
  12. セルF5〜F10を選択する。
  13. “スコア表!F5:F10”と表示されるので、“スコア表!F5:F1000” に修正する。
  14. [OK]をクリックする。
     →数式バーに
    =AVERAGEIF(スコア表!B5:B1000,A2,スコア表!F5:F1000)
    と表示される。

  15. この数式を下にコピーすると、
    (1)第1引数の B列の範囲が変わってしまうため、絶対番地に変更する。
    (2)右へコピーすると第2引数は列が変わるため、列のみ固定する。
    (3)第3引数は行のみ固定する。
     →“=AVERAGEIF(スコア表!$B$5:$B$1000,$A2,スコア表!F$5:F$1000)”
  16. フィルハンドルを使って、数式を下にコピーする。
§ In, 中, グロス,Net, パット数

 「Out」の関数をコピーする。基本の数式は次のようになる。

  • セルE2(In): “=AVERAGEIF(スコア表!B5:B1000,A2,スコア表!G5:G1000)”
  • セルF2(中): “=AVERAGEIF(スコア表!B5:B1000,A2,スコア表!H5:H1000)”
  • セルG2(グロス): “=AVERAGEIF(スコア表!B$:B1000,A2,スコア表!I5:I1000)”
  • セルH2(Net): “=AVERAGEIF(スコア表!B5:B1000,A2,スコア表!K5:K1000)”
  • セルI2(パット数): “=AVERAGEIF(スコア表!B5:B1000,A2,スコア表!M5:M1000)”
#DIV/0! と表示される理由
  • これは「0で割った」ことを表す。
  • 「平均値」は「データ数で割る」ことになる。対象データが無いゼロで割ることになり、このエラーが出る。
  • スコア表の「パット数」を見ると‥‥ 開催年の 2008年と 2009年は未入力となっている。
     回避するには、スコア表の任意のレコードにゼロを入力すると、平均値表はゼロが表示される。

目次へ