ラベル Excel の投稿を表示しています。 すべての投稿を表示
ラベル Excel の投稿を表示しています。 すべての投稿を表示

2011年1月14日金曜日

データの取り出しをスムーズに進める一つのヒント。(その2)




前回の筆者の記事にて「INDEX関数はシート選択も可能です」ということでしたので、その辺を早速。
INDEX関数、MATCH関数などは前回の記事を参考にしてください。


前回は売上数という単一のシートだけで話をしてましたが、売上数のほかに売上金をまとめた表もあるとします。
その場合のチェックする領域の切り替えを使うことができる、INDEX関数の領域指定「第4引数」の話をしましょう。


まず、前提の条件として、「同じレイアウトのシートであるということ」です。
つまり、レイアウトの違う2つでは何も期待したものが得られない可能性があります。
(やり方は無いわけではないと思うんですが、今回は便宜上こうしておきます)
今回は、「同じレイアウトのシートで別データを取り出そう」という括りでいきます。


同じシートレイアウトであれば、「売上数」と「売上金」が切り替わると式を2本コピーして、セル位置を入れ替えておけばいいのでは?
と考えたくなるのが普通です。
でも、今回はプルダウンリストの切り替えで、自動的に読む位置を変えるというものを作成してみます。


基本的なINDEX(MATCH)関数の書き方は前回と一緒です。
1つ違うのは、第1引数の範囲の指定の仕方です。


選択する領域が2つ存在する今回は、以下のように記述します。






「B2:G8」の箇所が赤枠内の「売上数」
「I2:N8」の箇所が青枠内の「売上金」

となります。

このように、複数の範囲を指定することで、「第4引数」の役割が生きてきます。






赤枠内では、始点となる「4月」の値を求め、青枠内では終点となる「6月」の値を求めています。

求める方法は前回同様INDEX(MATCH)関数です。
前回と大きく違うのは、第4引数によるデータテーブル選択域の違いということです。
前回もとめたものは単一の領域指定であったため、第4引数は省略できましたが、今回は複数領域を指定しています。



第4引数で指定しているものは、「売上数」「売上金」という言葉を指定しています。
この場合、セルC13には「売上金」が入っていますので第4引数の結果は「2」となります(「売上数」であれば、「1」となります)。
よって、第1引数の範囲の指定は「2」、つまりセル番号「I2:N8」の範囲からの検索となるのです。


今回は、同一テーブル上で実施した方法だけですが、別シートの指定も活用できます。
シートごとにテーブルを変え(できれば、レイアウトは同一形態のほうが楽です)、それぞれを呼び出すことも可能です。


このように第4引数をうまく活用することで、より利用の幅が広がるはずです。

今回はデータ数が、縦も横もさほど多くなく、VLOOKUP関数での代用も可能であるとは思われます。
しかし、データが膨大になると、列番号の指定が少々面倒なのでINDEX関数(MATCH関数)を利用するほうがよいのではないかと思われます。
データの数を見極めた上で、関数を効果的に使っていくことがよいでしょう。




余談…
関数の入力画面(下図)のようなものがないとやりにくい(わかりにくい)という方へ。



簡単に出すためには、セル内に「=INDEX」と入力し、Ctrl+A で上記の図がでてきます。
他の関数でも可能ですので、Excelの便利方法として覚えておくとよいでしょう。

ちなみに、INDEX関数の場合には、第4引数の省略の関係でこのような選択肢が先に出てきます。
複数の引数選択肢がある場合にでるようです。



今回の場合であれば、「配列、行番号、列番号」を選択すると、同様の操作が可能です。


投稿者:@DeDe_NI


[google]

2010年10月21日木曜日

データの取り出しをスムーズに進める一つのヒント。(その1)


excel_for_office_14_web / Joey DeVilla


担当者ごとの月別のデータ(Excel)があります。
どのように、担当者別の月ごとのデータを抽出しますか?

Excelのワークシートを使って簡単に取り出すにはどのようにするのが効率的でしょうか?
VLOOKUP(HLOOKUP)関数もいいですね。
ただ、その場合セルの指定などで少々面倒な思いをする場合があります。


そこで、「INDEX関数とMATCH関数」の併用です。
今回は、そのことに触れてみたいと思います。

そもそも「INDEX関数」ってなに?



行番号、列番号(データ位置の番号であってワークシート上のデータ番号ではないもの)からデータを抽出するものです。

=INDEX(配列,行番号,列番号)


配列:範囲または配列定数を指定
行番号:行位置を数値で設定
列番号:列位置を数値で設定

「数値を指定する必要があるのなら、VLOOKUP(HLOOKUP)関数と一緒では?」と思われるかと思います。
しかし、後ほど記載するMATCH関数との組み合わせでこの問題が一気に解決する(はず)です。

では、実際のデータを元に使用方法の違いを見てみましょう。



例として、上記のような表から特定月の商品別売上を求めるとします。

VLOOKUP関数であればこのようになるかと思います。

=VLOOKUP(C10,B3:G8,2,FALSE)


C10セルにある商品名「コーラ」を、B3からG8までの範囲にある中の2番目の値を返す。
という感じですね。

ただ、この場合4月はこれ、5月はこれと関数を追加をしていく必要がありますね?
特に第3引数の列番号の指定などはいちいち数を数えて入れての繰り返しになるはずです。
B10のセルにある月をプルダウン選択で月選択し、商品名も選択できると便利ですよね。
この状態でプルダウン選択を行うとプルダウン選択項目と結果が一致しません。

では、実際に同じ結果を出すためにINDEX関数を使用してみます。



=INDEX(B2:G8,MATCH(C11,B2:B8,FALSE),MATCH(B11,B2:G2,FALSE))


INDEX関数では範囲を選択し、行番号、列番号の指定をしていきます。
最初の「B2:G8」でデータの範囲を選択し、その中から、行番号(コーラの3行目)、列番号(4月の2列目)をそれぞれ選択します。

しかし、行番号、列番号をそれぞれ数値で指定してしまっては、VLOOKUP(HLOOKUP)関数の方が楽であり、とても汎用的とは言いがたいかと思います。

そこで、使用するのはMATCH関数です。

=MATCH(検査値,検査範囲,照合の型)


検査値:この場合は、「商品名(コーラ)」
検査範囲:この場合は商品名(行番号)、月(列番号)
照合の型:False(0でも可)なら完全一致のみ、True(1、-1)なら最大値(最小値)の値

このような、位置を特定するのに有益なMATCH関数を組み合わせることで、検索がスムーズになるはずです。

この組み合わせで行うと、「月」「商品名」をプルダウンリスト化することで、検索項目を入力することなくスムーズに検索する一つのツールとすることができるはずです。

ここまでであれば、「大して変わらないからVLOOKUPやHLOOKUP関数のままで良いか」と思うかもしれません。


複数月の平均を求めてみる



では、3ヶ月の平均を求める。といった場合はどうでしょうか?
4月から6月までの平均を求めるとします。

VLOOKUP関数であればそれぞれ、4月の売上、5月の売上、6月の売上を持ってくるための関数を書き、その値を元に平均を求めるという操作になるかと思います。
これをINDEX関数では1文で書き表すことができます。



F12の式は以下のようになります。
赤字が「始点」となるセル位置(この場合、4月のコーラ)
青字が「終点」となるセル位置(この場合、6月のコーラ)

=AVERAGE(
INDEX(B2:G8,MATCH(D12,B2:B8,FALSE),MATCH(B11,B2:G2,FALSE))
:INDEX(B2:G8,MATCH(D12,B2:B8,FALSE),MATCH(D11,B2:G2,FALSE))
)


INDEX関数であれば、行番号と列番号を求めるので、その求めた答えを「AVERAGE」関数に当てはめます。

AVERAGE関数で範囲を指定するように、始点となるセル位置をINDEX関数で求め、終点となる位置もINDEX関数で求めると、X月からY月までのZヶ月の平均売上といったものも求まります。
さらに、データが売上平均などとなっている場合にSUM関数やCOUNT関数などを併用しながら使えば、汎用的なワークシートの作成が可能となるはずです。

また、この場合は期間、商品をそれぞれセルに保存していますので汎用的な利用ができます。
(5月から8月のビールの売上平均など)


このように「INDEX関数(併用MATCH関数)」を使用することで他の関数の引数としての役割も果たせます。
また、INDEX関数ではシート選択(データ種類の選択)のようなこともできますが、それは今度の機会にでも。


投稿者:@DeDe_NI


2010年5月17日月曜日

DDEを利用したEXCEL表読込みのTips

DDEを利用したEXCELの表を取り込む際に
表の行数が何行になっても対応できる方法です。

まず下のような表があり、赤枠の部分を読込みたいとします。



この表をDDEで取り込む場合通常は以下のようにfilenameステートメントを記述します。

filename myxls dde "Excel|[Book1]Sheet1!R2C1:R3C3";

data test;
infile myxls;
input name $ sex $ age;
run;

無事にデータセット化できました。


では下の図のように表に値が追加されていった場合はどうすればよいでしょうか。
filenameの記述を毎回書き換えるのは少し面倒ですよね。


こういう場合はfilenameステートメントを次のように記述しておきます。

filename myxls dde "Excel|[Book1]Sheet1!C1:C3";

R1C1参照の部分を以下のように変更しています。

R2C1:R3C3
↓
C1:C3


SASデータセットに取り込むプログラムは次のように変更します。

data test;
infile myxls firstobs=2;
input name $ sex $ age;
run;

firstobs=2を追加していますね。

無事にデータセット化することが出来ました。



R1C1形式の指定をカラム情報のみにすると指定したカラム範囲の全てのデータを対象にします。
(firstobs=2を追加したのは表の項目ラベルも対象範囲にはいってしまうためです)
こうしておく事でデータが随時追加されていく表に対しても
プログラムの変更なく取り込むことが出来ますので、覚えておくと便利です。

おわり


投稿者:@miya_NI


ネイチャーインサイト サイトリニューアル&NIBLOGの引っ越し

ご連絡が遅くなりましたが、 ネイチャーインサイトの際とがリニューアルしました。 https://www.n-insight.co.jp/ それに伴い、NIBLOGも引っ越しすることになりました。 https://www.n-insight.co.jp/niblog/ ...