12/15/2019

Excel。複数の表から一つのグラフを作る方法【Combined graph】

Excel。複数の表から一つのグラフを作る方法

<2in1グラフ>

複数の表があります。

今回は、地域ごとにわけて、管理している3つの表があります。
4月~6月をつかって、全店舗の積み上げ縦棒グラフを作りたい場合、どうしたらいいのでしょうか?

なお、次のようなグラフを作りたいわけです。

それぞれの表からグラフをつくって、そのグラフを一つにまとめることはできません。

一つの表からグラフを作成して、その後、他の表のデータをコピーして貼り付けるのも面倒ですし、3つの表をグラフのために、1つの表に修正するのも、大変ですし、面倒です。

ところが、それほど難しく考えなくても、複数の表から一つのグラフを作ることは簡単です。

範囲選択をしますが、ここでポイントがあります。

一つの表だけ、「見出し行」を含むことができます。

全ての表の見出し行を含めると、2つ目以降の表の見出し行をデータ行だと勘違いしてしまい、グラフが次のように店舗というデータが加わってしまっておかしくなってしまいます。

そのために、一つの表だけ見出し行を含めるだけにします。

範囲選択したあとは、作りたいグラフを選択すればいいだけです。

今回は、積み上げ縦棒グラフにしていきます。

このように、別々の表であっても、一つのグラフを簡単に作ることができますので、あらためて、表を作る必要はありません。

12/14/2019

Excel Technique_BLOG Categoryに追加しました。2019/12/14

Excel Technique_BLOG Categoryに追加しました。

<目次サイト>

このBLOGの記事を、
カテゴリー分けにした【Excel Technique_BLOG Category】に追加しました。

Excel。DATEDIF関数を使って、勤続年数を求めると何かがおかしい?

DATEDIF関数は、関数の挿入ボタンからダイアログボックスを表示することができない、いわば、【隠し関数】なのですが、このDATEDIF関数を使った場合、会社さんのルールによっては、うまく算出されてないことがあります。

<続きはこちら>
Excel。DATEDIF関数を使って、勤続年数を求めると何かがおかしい?
https://infoyandssblog.blogspot.com/2015/01/exceldatedif.html


Excel。末締めの翌末払い。土日祝祭日に完全対応の日程表を作成してみる。

【末締めの翌末払い】しかも、土日祝祭日に完全対応した日程表を作りたい。

<続きはこちら>
Excel。末締めの翌末払い。土日祝祭日に完全対応の日程表を作成してみる。
https://infoyandssblog.blogspot.com/2015/01/excelpaymentday.html


Excel。末締めの翌20日払い。土日祝祭日に完全対応の日程表を作成してみる。

【末締めの翌20日払い】の支払予定日の日程表を作成してみよう
<続きはこちら>
Excel。末締めの翌20日払い。土日祝祭日に完全対応の日程表を作成してみる。
https://infoyandssblog.blogspot.com/2015/02/excelpaymentday20.html


Excel。20日末締めの翌10日払い。土日祝祭日に完全対応の日程表を作成してみる。

【20日締めの翌10日払い】の土日祝祭日に完全対応した支払予定日の日程表を作成してみましょう。

<続きはこちら>
Excel。20日末締めの翌10日払い。土日祝祭日に完全対応の日程表を作成してみる。
https://infoyandssblog.blogspot.com/2015/02/excelpaymentday2010.html

12/12/2019

Excel。XLOOKUP関数だと簡単!降順の表から検索するならINDEX+MATCH関数の苦労から解放?!【XLOOKUP】

Excel。XLOOKUP関数だと簡単!降順の表から検索するならINDEX+MATCH関数の苦労から解放?!

<INDEX+MATCH関数・XLOOKUP関数>

次のような合計値に応じてランクを決定する表があります。

数値をもとにして、ランクの表から検索するので、「VLOOKUP関数」を使うように思われますが、このケース。

VLOOKUP関数では、対応することができません。

C2:C10を一度クリアして、VLOOKUP関数で算出してみましょう。

C2には、
=VLOOKUP(B2,$F$2:$G$7,1,TRUE)
という数式になるはずです。

しかし、「#N/A」というエラーが表示されてしまいます。

検索値は、B2だし、範囲も問題ない。
抽出したいのは、ランクなので、列番号は「1」。
完全一致ではなく、近似値なので、「TRUE」と大丈夫なような気がしますが、VLOOKUP関数のルールを逸脱しています。

1つ目は、検索値の左側に抽出したいデータがある。
今回はG列の合計の左にランクがある。
抽出したいものが検索値の右側にないとVLOOKUP関数を使うことができません。

では、F列とG列を入れ替えればいいのかというと…

C2の数式も合わせて次のように修正します。

=VLOOKUP(B2,$F$2:$G$7,2,TRUE)
オートフィルを使って数式をコピーしたところ、エラーのセルがあります。

実は、まだVLOOKUP関数のルールから逸脱しています。

2つ目として、範囲のF2:G7の表ですが、今回のような数値の場合は、【昇順】でなければいけません。

商品コードや氏名の場合は、ルール上よろしくありませんが、完全一致のケースが多く、検索されます。

なので、次のようにF列を昇順にすると、問題なく検索してくれます。

しかしながら、通常数値の高い順でリストをつくるだろうし、Sが何点以上というように表を閲覧するはずです。

よって、最初の表では、VLOOKUP関数を使うことはできないわけです。

では、どのようにしたらいいのかというと、このケースでの定番「INDEX+MATCH関数」をつかうことで、検索することができます。

さらに、F1:G7の表だけではINDEX+MATCH関数でも、検索することはできません。

H列の「~まで」という数値を用意する必要があります。

B2に、INDEX+MATCH関数で数式を作ってみましょう。

=INDEX($F$2:$F$7,MATCH(B2,$H$2:$H$7,-1),1)

これで、検索することができるのですが、数式が非常に「難解」ですね。

数式の説明をしてきます。

MATCH関数がどのような動きをしているのか確認してみましょう。

D2の数式は、
=MATCH(B2,$I$2:$I$7,-1)
検索値は、B2で198を指します。

検索範囲は、$I$2:$I$7
照合は、「-1」とします。「-1」は、検索値以上の最小値を検索します。

すると、上から3コ目が該当するので、3と算出されました。

それを受けて、E2のINDEX関数を確認しましょう。
=INDEX($G$2:$G$7,D2)
G2:G7の範囲で、上から、D2、つまり、3番目を検索するので、「B」を検索してくれるわけです。

このように、検索する表をそのまま使用して、検索することは容易ではありませんでした。

しかし、Office365のExcel  Insiderで搭載された、「スピル」そして、新しく登場した【XLOOKUP関数】をつかうと、INDEX+MATCH関数のような苦労はせずにすむようになりました。

D2にXLOOKUP関数の計算式をつくっていきます。

=XLOOKUP(B2:B10,G2:G7,F2:F7,,-1,1)
これで、あっという間に算出してくれます。

範囲の表が、どうのこうのというような条件はありません。

XLOOKUP関数は、スピル機能を使う関数なので、オートフィルを使って数式をコピーする必要はありません。

また、絶対参照で範囲の表を固定する必要もありません。

それでは、数式を説明しましょう。

まず、XLOOKUP関数は、
XLOOKUP(検索値,検索範囲,戻り範囲,[見つからない場合],[一致モード],[検索モード])
という形式になっています。

検索値は、B2:B10。
合計点がどのランクなのか検索するので、B2:B10と設定します。

検索範囲は、G2:G7。検索値に該当するのを検索する範囲です。

戻り範囲は、F2:F7。検索結果の範囲です。

このように、検索範囲と戻り範囲を別々に設定できるようになったので、検索範囲を範囲の表の一列目にないといけないというルールから解放されたわけです。

見つからない場合は、今回はないので、省略。

一致モードは、完全一致かどうか決めるところです。
VLOOKUP関数では省略すると、「近似値」になってしまいましたが、XLOOKUP関数では、省略すると「完全一致」になります。

今回は、完全一致または、次に小さい項目の「-1」を設定します。

1件目は198なので、198の次に小さい項目は、190が該当しますので、Bを検索するわけです。

最後の、
検索モードは、リストの上から検索させるので、先頭から末尾へ検索の「1」を選択します。

この検索モードによって、VLOOKUP関数だと、範囲の表を昇順にしておかないといけないというルールから解放されました。

このように、XLOOKUP関数は、現場で大きなインパクトを与える関数になるのかもしれませんね。

12/11/2019

Excel関数辞典 VOL.22。DOLLAR関数~DSTDEVP関数

Excel関数辞典 VOL.22。DOLLAR関数~DSTDEVP関数

<Excel関数>

今回は、DOLLAR関数~DSTDEVP関数までをご紹介しております。

標準偏差も関数で算出できるようですね。

DOLLAR関数
ダラー
数値を四捨五入してドル記号を付けた文字列に変換する
DOLLAR(数値[,桁数])


DOLLARDE関数
ダラーディーイー
分数表記のドル価格を小数に変換
DOLLARDE(分子,分母)


DOLLARFR関数
ダラーエフアール
小数表記のドル価格を分数に変換
DOLLARFR(小数値,分母)


DPRODUCT関数
ディープロダクト
条件を満たすレコードの積を算出
DPRODUCT(データベース,フィールド,条件)


DSTDEV関数
ディースタンダードディブ
条件を満たすレコードの標準偏差推定値を算出
DSTDEV(データベース,フィールド,条件)


DSTDEVP関数
ディースタンダードディブピー
条件を満たすレコードの標準偏差を算出
DSTDEVP(データベース,フィールド,条件)

12/09/2019

Excel。カテゴリー別で通し番号を作るにはどうしたらいいの?【serial number】

Excel。カテゴリー別で通し番号を作るにはどうしたらいいの?

<COUNTIF+TEXT関数>

現在使用している店舗管理表があります。

地域コードだけで管理していたのですが、店舗数が多くなってきたので、次のように、地域コードというカテゴリー別に通し番号をつけた新コードをつくりたいのですが、自力でイチイチコードを作っていくのは面倒です。

Excel VBAでプログラムを作ってもいいのでしょうけど、COUNTIF関数とTEXT関数を使うことで、問題を解決することができます。

考え方ですが、E列に、地域コードが何回目に登場するのかがわかれば、その数値が通し番号にすることができます。

つまり、登場回数を数えればいいわけです。

E2をクリックして、COUNTIF関数ダイアログボックスを表示しましょう。

範囲には、$B$2:B2
範囲選択の始点を絶対参照して、終点を相対参照のままにすると、オートフィルターで数式をコピーすると範囲選択が広がっていく仕組みです。

検索条件はB2
設定したら、OKボタンをクリックします。

数式は、
=COUNTIF($B$2:B2,B2)

あとは、オートフィルを使って数式をコピーします。

確認してみると、E2はKGの1回目の登場なので、「1」。

E6にKGの2回目の登場なので、「2」というように、算出されていることが確認できます。

これで、登場回数ごとに連番の基盤がつくれたわけです。

あとは、地域コードと文字結合すればいいわけです。

ただ、このまま、C2に=B2&”-“&E2としても、「KG-001」というようなゼロが付いている形式にすることは当然できません。

そこで、表示形式を整えるには、TEXT関数を使う方法が良いと思いますので、文字結合にTEXT関数を使っていきます。

C2をクリックして、次の数式をつくっていきます。
=B2&"-"&TEXT(E2,"000")

表示形式で、”000”とすると、ゼロ付の数値をつくることができます。

表示形式を設定することができる、TEXT関数を使うことで、希望のような形で地域コードをつくることができます。

オートフィルを使ってつくった数式をコピーします。

これで、カテゴリー別の通し番号つくることができました。

12/08/2019

今週のFacebookページの投稿 2019/12/02-2019/12/08

今週のFacebookページの投稿 2019/12/02-2019/12/08

<Facebookページ>

Facebookページで【書いてみた】ワンポイントです。

12月02日
Excel。ipmt関数は元利均等払の利息の支払金額関数です。
ちなみに利息分を求める時に使います。

12月03日
Excel。nper関数は目標額に必要な期間を算出関数です。

12月04日
Excel。rate関数は目標額に必要な利率を算出関数です。

12月05日
Excel。ABS関数。読み方は、アブソルートで、数値の絶対値を算出します。

12月06日
Excel。ACCRINT関数。
読み方は、アクリントで、定期利付債の経過利息を算出します。

12月07日
Excel。ACCRINTM関数。
読み方は、アクリントエムで、満期利付債の利息を算出します。

12月08日
Excel。ACOS関数。
読み方は、アーク・コサインで、逆余弦(アークコサイン)を算出します。

Excelテクニック and  MS-Office recommended by PC training
https://www.facebook.com/exceltechniqueandmsoffice/

12/06/2019

Excel VBA。大量のデータから条件付き合算値を出す方法。アレコレ。【SUMIF】

Excel VBA。大量のデータから条件付き合算値を出す方法。アレコレ。

<Excel VBA>

大量のデータを処理するには、Excel VBAだから、繰り返し処理で対応すると意外と処理時間がかかることが多々あります。

楽に処理するだけでなく、できれば、処理時間も短時間で行えればいいですよね。

今回は、12万件のデータを用意しました。

12万件のデータは読み込み済みですが、本来は読み込んだ後に計算したいわけです。

すると、SUMIF関数をその都度作るのは面倒なので、読み込んだ後に計算させたいという作業イメージだとします。

このデータのA列には、新宿・渋谷・池袋・品川の店舗ごとの金額を集計するマクロを考えてみましょう。

最初は、Excel VBAなので、繰り返し処理で考えた場合どうなるのでしょうか?

Sub 条件付き計算01()
    Dim i As Long
    Dim j As Long
    Dim Ans As Long
    Dim EndRow As Long
    Dim shop_name As String
   
    EndRow = Range("a1").End(xlDown).Row
   
    For j = 2 To 5
    shop_name = Cells(j, 5)
   
        For i = 2 To EndRow
            If Cells(i, 1) = shop_name Then
                Ans = Ans + Cells(i, 2)
            End If
        Next
        Cells(j, 6).Value = Ans
        Ans = 0
    Next
End Sub

簡単に説明をしておきます。

EndRow = Range("a1").End(xlDown).Row
これはお馴染みの行ですね。最終レコードは何行目なのか知るための行ですね。

For j = 2 To 5
shop_name = Cells(j, 5)
Next
これは、新宿から品川まで4回繰り返すためのものですね。

For i = 2 To EndRow
     If Cells(i, 1) = shop_name Then
         Ans = Ans + Cells(i, 2)
    End If
Next
For文は、最終レコードまで繰り返し処理を行います。今回は12万回ですね。

If文は、A列のセルが店舗名、例えば新宿と同じだったら、B列のデータを変数に代入して加算するというのを繰り返しています。

Cells(j, 6).Value = Ans
加算された計算結果を表示させます。

いたってシンプルな繰り返し処理です。これを実行してみましょう。

算出することができましたが、実際に処理をすると、処理しているのがわかるぐらい結果が表示されるまで時間がかかります。

さらに大量なデータだった場合は、処理時間も比例してかかるようになります。

原因は繰り返し処理の回数ですね。12万件を4回繰り返しています。

ただ、Excel VBAを勉強しはじめだと、繰り返し処理というイメージが強くなるので、このような方法をイメージする方が多いようです。

しかし、そもそもExcelなので、Excelの数式を使う方法もあります。

次のような構文でも、算出することができます。

Sub 条件付き計算02()
    Range("g2").Value = "=SUMIF(A:A,E2,B:B)"
    Range("g3").Value = "=SUMIF(A:A,E3,B:B)"
    Range("g4").Value = "=SUMIF(A:A,E4,B:B)"
    Range("g5").Value = "=SUMIF(A:A,E5,B:B)"
End Sub

単純ですね。

SUMIF関数の数式を直接回答させたいセルに作っちゃおうという考え方ですね。

実行してみると問題なく算出してくれます。

これでいいと思えますが、処理速度。

レスポンスタイムは先ほどの繰り返し処理よりも早いですが、それでもちょっと時間がかかります。

それに、今回のように簡単な数式だったので、作りやすいのですが、もっと煩雑な式だと作るのが大変になってしまいます。

そこで、『WorksheetFunctionプロパティ』を使うと処理速度が大幅に改善することができます。

次の構文は、WorksheetFunctionプロパティを使った場合です。

Sub 条件付き計算03()
    Range("h2").Value = WorksheetFunction.SumIf(Range("a:a"), "新宿", Range("b:b"))
    Range("h3").Value = WorksheetFunction.SumIf(Range("a:a"), "渋谷", Range("b:b"))
    Range("h4").Value = WorksheetFunction.SumIf(Range("a:a"), "池袋", Range("b:b"))
    Range("h5").Value = WorksheetFunction.SumIf(Range("a:a"), "品川", Range("b:b"))
End Sub

WorksheetFunctionプロパティでSumIf関数を使った場合です。

実行すると、瞬く間に処理をしてくれます。

WorksheetFunctionプロパティは、すべてのワークシート関数を使えるわけではありませんが、処理時間を考慮すると、繰り返し処理にこだわらなくても、いいように思えますので、機会があれば、WorksheetFunctionプロパティで検討してみるといいかもしれませんね。