2014年01月27日

1万日目

私の個人的ベスト朝ドラは依然「ちりとてちん」ですが、「ゲゲゲ」も「あまちゃん」も結構はまってましたし、現在の「ごちそうさん」も毎日見てます。

昨夜のトーク番組にヒロインの杏が出ていたのでちょっとだけ見てみたら、「生まれてから1万日目はいつか」みたいな話をしてました。

「計算するの大変そうだな」と一瞬思ったものの、よく考えたらExcelで一発でしたね。

適当なセル(A1とします)に自分の生年月日を入れて、「=A1+10000」とするだけ。
生まれた日自体を1日目と数えるなら、そこから1を引きます。

1万日目に限らず、同様にして何日目でもOKです。
posted by 土屋和人 at 10:10| Comment(2) | TrackBack(0) | Excel

2012年05月23日

やっぱり怖い演算誤差

久しぶりに、というかまたしても、このブログのタイトルにふさわしいネタです(^^;)。

そろそろ次の号も出る頃ですが、「日経PC21」の2012年6月号に掲載された「エクセル数式クイズ」の記事で、実はまた少々やらかしてしまいました。
カラオケの開始時刻と終了時刻の差が必ず30分単位になるという前提で、利用時間を30分を1とする数値に換算して、それに人数と30分当たりの料金を掛けて利用料金の合計を求めるという問題なのですが、問題自体ではなく、その解答・解説記事にまずい部分がありました。

実際の料金計算では当然ちょうど30分になるということはまずないので、30分未満の端数に対応できるようROUNDUP関数で切り上げる、という解説を付けました。
紹介した数式は、論理的には間違っていないはずなのですが、実際には利用時間がちょうど30分単位になった場合、演算誤差によって、1単位分切り上げられてしまう可能性がある……ということに、結構後になってから気が付きました。
たとえば利用時間がちょうど1時間30分だった場合、料金が2時間分として計算されてしまう可能性がある、ということです。

記事の中ではオマケ的な部分ですし、演算誤差やその対策について詳しく説明している余裕もありませんでしたが、それにしてももうちょっと誤差の出にくい数式にはできたんじゃないのか(それはそれで、紹介している数式よりは長くなり、その説明も必要になっただろうと思いますが)、と深く反省しています。
posted by 土屋和人 at 09:08| Comment(0) | TrackBack(0) | Excel

2012年01月02日

UDFで配列を返す

組み込みのワークシート関数にも、戻り値として配列を返すものがいくつかあります(FREQUENCYやLINESTなど)が、これらの関数は、初心者の人にはあまりなじみがないでしょうし、「配列」と聞いただけでちょっと引いてしまう人も多いのではないでしょうか?

『追加関数50』に収録したユーザー定義関数(UDF)では、戻り値を配列として返す関数が実は結構あります。
別に趣味でそのような仕様にしたわけではなく(^^;)、汎用性などを考えるとそっちのほうが便利だろうと思ったからです。
(なお、配列の受け渡しに関しては、私のWebサイトのこのページで割と詳しく説明しています。配列自体についての解説はこちらからどうぞ)

たとえば、指定したセル範囲の中で、特定の書式(塗りつぶしの色など)が設定されたセルの値だけを集計したいとします。
UDFであれば、該当するセルの値の合計などの値を直接求めることももちろん可能です。用途や利用範囲によっては、それはそれでOKな場合も多いでしょう。
しかし、合計以外にも平均や最大値といった複数の種類の集計結果を求めたい場合は、その種類だけUDFを用意しなければならなくなります。

その点、該当する値をすべて配列として返す関数であれば、SUMやAVERAGE、MAXといった関数と組み合わせることで、どんな集計処理でも可能になります(もちろん、組み合わせる関数が配列を処理できる、というのが大前提ですが)。

さらに、配列を返す関数をINDEX関数と組み合わせて、たとえば「塗りつぶしの色が黄色である3番目のセルの値を取り出す」といったことも可能になります。

『追加関数50』にはそれ以外にも、通常は「最初に見つかったセル」に対応する情報しか返さないMATCHやVLOOKUPを拡張し、該当するすべての値を配列として返すような関数も収録しています。
もちろんその戻り値も、SUMやAVERAGE、INDEXなどと組み合わせて利用することが可能です。

また、配列の扱い方や上記のような応用的な利用法についても、いろいろと紹介しているつもりです。
posted by 土屋和人 at 10:48| Comment(0) | TrackBack(0) | Excel

2011年12月31日

できるけどお勧めしないこと

予想はしていましたが、こちらでダウンロード販売している『追加関数』の“本”は、正直、まだほとんど売れていません(^^;)。
そこで、その宣伝の意味も兼ねて、またまたユーザー定義関数(UDF)のネタを。

UDFでは、一般的なVBAのプログラム(マクロ)に比べて、実行できない処理が結構あります。
たとえば、セルやワークシートを直接変更するような処理です。

一方で、一般的なワークシート関数のように「数式の中で計算結果を返すだけ」というわけでもなく、やはりVBAのプログラムですから、いくらかはその枠を超える処理も実現可能です。
具体的には図形(描画オブジェクト)を変更する操作などで、その実例となる関数も、同書にはいくつか収めています。

また、関数が計算されるタイミングで、メッセージボックスや入力ボックス、ユーザーフォームなどを表示することも可能です。
たとえば再計算が行われるつど入力ボックスを表示し、入力された値を計算で使用するといった利用法が考えられます。
こうした関数の使用例も、実はいくつか考えたのですが、最終的に同書では没としました。

没にした理由は、一言でいうと、[関数の引数]ダイアログボックスとの相性が悪いから、です。

条件が真の場合に指定したメッセージを表示する「IF_MESSAGE」という関数の場合、[関数の引数]ダイアログから使用しようとすると、ダイアログを表示している状態の上からメッセージボックスが何度も表示されてしまいました。
[関数の引数]ダイアログを使わず、セルに直接入力するような注意書きを付けて収録しようかとも思ったのですが(実際、そのようにしている関数もあります)、そこまでするほど面白くも有用でもないと判断し、同書には収録しませんでした。

この例に限らず、[関数の引数]ダイアログでは、計算の結果をプレビューするため、セルに入力する前の段階で、その関数の処理が実際に行われます。
このため、求める情報の取得手順が複雑な場合は、ダイアログ上での操作が重くなってしまったり、表示に不具合が発生する可能性もあります。

UDFではこのような処理は避けるか、あるいはダイアログを使わず手入力してもらうことを徹底する必要があります。
posted by 土屋和人 at 12:27| Comment(0) | TrackBack(0) | Excel

2011年11月30日

Excel追加関数50

Word VBA本に続く自主制作PDF本の第二弾『Excel好きに捧げる 面白・便利な 追加関数50』(自分でもちょっとどうかと思うタイトルですが、少しでもキャッチーにしたかったので^^;)が完成し、今日からダウンロード販売を開始しました。

EF50Cover.jpg




前回のユーザー定義関数ネタは、要するにこういうことをやっていたからでした。

ただし、ユーザー定義関数のコードの書き方を解説しているわけではなく、私が思いついた追加関数の“使い方”を、組み込みのExcel関数と同じ要領で紹介するという、結構趣味的な本です。
これ1冊だけでなく、「趣味のExcelシリーズ」というそのまんまのシリーズ名で、ニーズのあるなしに関係なく(^^;)、これからも自分が面白そうだと思ったネタをやっていきたいとも思っています。

まあ、そんなふうに言ってて、結局これ1冊で終わり、というのも、私的にはありがちなパターンなのですが……(^^;)
posted by 土屋和人 at 16:24| Comment(0) | TrackBack(0) | Excel

2011年11月23日

ユーザー定義関数

最近はユーザー定義関数に凝っています。

どうせVBAを使うならイベントプロシージャのほうが自由度は高いし、いろいろと制限のあるユーザー定義関数をあえて使う意味はないかも、と考えていた時期もあるのですが、その制約のあるところが逆に面白く思えてきて……というのは少々オタク的でしょうか?(^^;)
セルの操作はできないけど図形の操作ならできそうだ、とか、メッセージや入力ボックスも表示可能、とか、できることとできないことを仕分けしていく作業は、確かにちょっとマニアックかもしれません。

ただ、Excelでいきなり“完成品”を作って提供するのではなく、各ユーザーが完成品を作るための“部品”として提供するのであれば、関数というのは割と利用しやすい形式なのではないでしょうか。
数式・関数はある程度使いこなせるけどVBAまではちょっと……というユーザー層は、結構厚いような気がします。

VBAを利用すれば、たとえばアドインを組み込むとUIにボタンが表示されたり、ある操作を行うと自動的に一連の処理が実行されて……みたいなことが可能で、それはそれで、VBAの知識がないユーザーにとっても便利です。
ただ、それは追加された“機能”ではあっても“部品”とはいい難いでしょう。
VBAの知識のない人でも、自分自身である程度その機能をコントロールしながら、独自の“完成品”を作っていくことができるという点で、ユーザー定義関数という形式にはやはり一定の存在価値がある、と最近は思うようになりました。

さらにいうと、ユーザー定義関数をいかに組み込み関数の使い勝手に近づけていけるか、というのも、最近の大きなテーマです。
具体的には引数の仕様や「関数の引数」ダイアログボックスでの表示内容などですが、その過程で組み込み関数の仕様に対する理解が深まる部分もあり、またある意味Excelの開発者側に加わったような感覚(錯覚ですが^^;)を覚えたりもできます。

ExcelとVBAが好きな人、さらに深く学びたい人には、結構オススメです。
posted by 土屋和人 at 14:53| Comment(0) | TrackBack(0) | Excel

2011年02月12日

関数の引数の省略 その2

ここでは関数の引数を「カンマ付きで省略すると0(または空白文字列)と見なされる」と書きましたが、どの関数についてもそうなるかのように言い切ってしまうのはまずかった、と気が付きました。

たとえばOFFSET関数で、第4引数「高さ」と第5引数「幅」にはそれぞれ1以上の整数を指定することになっており、0を指定すると#REF!エラーになります。
しかし、「高さ」の指定を省略してカンマを付け、「幅」を指定した場合は、0ではなく「現在の高さを維持する」という指定になります。

また、データベース関数のDCOUNTとDCOUNTAの第2引数「フィールド」では、通常は集計対象の列を指定しますが、この引数を省略すると(第3引数「条件」は必須)、条件に該当するレコード数が求められます。

このほか、統計関数や財務関数にも、途中の引数を省略すると、省略したなりの意味を持つものがあるようです。

結局、省略した引数が0と見なされるか空白文字列と見なされるか、それとも省略した場合の動作が設定されているのかは、それぞれの関数の仕様によって異なる、という当たり前といえば当たり前の結論なのですが……。
posted by 土屋和人 at 09:13| Comment(0) | TrackBack(0) | Excel

2010年08月06日

INDEX関数の引数

ヘルプの解説のわかりにくさにおいては、INDEX関数もなかなかのものです。

実はExcel 2010になって、このヘルプ記事の記述が、それ以前とは微妙に変わった部分があります。(体裁とか、結構大きく変わってはいるのですが、1つのポイントとして)
それは、

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

という関数の書式(これは配列形式ですがセル範囲形式でも同様)において、2007までは「行番号」「列番号」のいずれも省略可能とされていたのが、2010では「行番号」は必須で「列番号」は省略可能、という書き方になっていることです。

ただ、そうはいっても2010の解説の中では以前と同様、

配列が 1 行または 1 列のみの場合、それぞれ行番号または列番号を省略することができます。

といった感じで、あたかも行番号が省略できるような表現もされています。

「列番号を省略する」のはわかりますが、この関数で「行番号を省略する」というのは、具体的にはどういう書き方になるのでしょうか?
ちょっと考えると、

=INDEX(A1:C1,,2)

のようなことかな、と思ってしまうのですが、ここで書いたように、実はこの書き方では第二引数を省略したことにはならず、0を指定したと見なされます。
行番号または列番号に0を指定すると、対象が複数行×複数列の配列(セル範囲)であれば、もう一方の引数で指定した列全体または行全体の配列(セル範囲)を返します。
上の例の場合、対象の配列(セル範囲)は1行だけなので、「全体」を取り出しても戻ってくる値は1つだけ。
結果として1つのセルの値だけが取り出せるので、ひょっとしてこの書き方で正解なのかとも思ってしまうのですが……。

「行番号を省略する」というのは、正しくは次のような書き方です。

=INDEX(A1:E1,2)

しかしこれでは「省略されているのは列番号では?」と思ってしまいますよね。
試してみるとわかりますが、これでちゃんと2列目のセル(この場合はB1)の値が戻ります。

「行番号」という名前が付いているため混乱してしまうのですが、このようなケースでは、第二引数で指定される番号の方向は必ずしも「行」とは限らず、配列(範囲)の形に従います。
要するに、対象が一次元配列(方向は問わず)のとき、第二引数では、その配列内での位置を表す番号を指定しているということです。
正直に白状すると、私自身、結構長い間、このあたりのことが理解できていませんでした。

内容的に行番号なのか列番号なのかはさておき、とりあえずINDEX関数の第二引数は省略不可であり、その引数にたまたま「行番号」という名前が付けられている、というわけです。
INDEX関数の仕様自体が変わったわけではありませんが、ヘルプの書式はこのあたりのことを苦慮したうえでの変更だったのでしょう。


ところでINDEX関数のヘルプといえば、「配列形式」と「セル範囲形式」という表現もわかりづらいですね。
「配列形式」のほうが先に説明され、「セル範囲形式」の書式では第四引数「領域番号」についての説明もあるため、一見、後者のほうが特殊な形式なのかとも思ってしまいます。

実際には、第一引数がセル範囲の参照なら「セル範囲形式」となり、配列なら「配列形式」になります。
何が違うのかというと、前者が戻り値としてセル参照を返すの対し、後者は値(または一次元配列)を返す点です。
(戻り値が値とセル参照とではどう異なるのかについてはこちらを参照)

ヘルプをよく読めばちゃんとそう書いてあるのですが、配列形式の使用例として載っているのがセル範囲を参照する例だったり……(^^;)

ともあれ、INDEXの実際の用途としては、「セル範囲形式」で使われているケースのほうが一般的かと思われます。
決して「第四引数を指定した場合はセル範囲形式、そうでなければ配列形式」というわけではないので、誤解なきよう。
(しかし、こういう勘違いをしている人も結構いそうな気がします。……私も以前そうだったので^^;)
posted by 土屋和人 at 07:58| Comment(5) | TrackBack(0) | Excel

2010年07月01日

2010のスマートタグ

私がここでこんなことを書いたから、というわけでは絶対にないでしょうが(^^;)、Excel(Office) 2010では、とうとうスマートタグはサポートされなくなったようです。

どんなに影が薄くなっても、こちらはOfficeアシスタントなどとは違って実務に関わる機能であり、使っている人がいる可能性がある限りなくなることはないだろうと思っていたので、正直ちょっと驚きました。
(そして、正直ちょっと参りました……仕事の関係で)

もっとも、正確に言うと、これまでスマートタグという形で利用されていた機能が、まったく使えなくなったというわけではありません。
カスタムスマートタグとして設定していた機能は、2010では、セルを右クリックして出てくるショートカットメニューから実行することができます。

ただ、スマートタグであれば、登録されたキーワードがセルに入力された際、セルの隅に印を出して、そこから「何らかの機能が実行できる」ということを示します。
それを見て初めて、ユーザーが「できる」ことに気が付くケースも多かったと思います。

ところが、これがショートカットメニューの中に埋められてしまうと、あらかじめ「できる」ことがわかっている機能しか、そこから実行しよう、ということにはなりません。

まあ、いずれにしてもそういうニーズがない(少ない)からこのように変更された、ということなのでしょうが……
私自身もほとんど使ってなかったとはいえ、Officeアシスタントや日本語音声出力と同様、ひょっとしたら何かに便利に使えたかも……という思いもあり(^^;)、いずれにせよ機能自体がなくなってしまうというのはさびしいものです。
それでもOfficeアシスタントに比べたら、機能を実行する方法が残されている分だけ、まだましなのかもしれませんが。
posted by 土屋和人 at 18:41| Comment(0) | TrackBack(0) | Excel

2010年01月13日

時間と時刻

私自身もよく混同してしまうのですが、Excelで扱うことができるのは、「時間」というよりも「時刻」のデータです。
もちろんExcelでは時間の合計や差なども求められますが、それはあくまでも「時刻データ」を利用して時間の計算を行っているにすぎません。

たとえば、退勤時刻(例:17:00)から出勤時刻(例:9:00)を引くと、その日の在社時間(例:8:00)が求められます。
しかし、この計算で求められる答えも、Excelから見れば、「8時間」という時間ではなく、「8時」という時刻のデータです。
計算の結果が24時間以内に収まっていれば時間か時刻かなどと悩まなくてもいいのですが、たとえば加算を行った結果が24時間を超える場合、「1900/1/1」のような日付のデータが発生し、時刻のほうは0時から数え直されることになります。

正確に言うと、24時間よりも前の、「9:00」のように時刻だけで表示されているデータも、日付のデータを持っていないわけではありません。
以下は、最近某掲示板に書いたExcelの日付・時刻データについての文章に、少々手を加えたものです。Excelの日時データの扱いを理解している人にしてみれば「今さら」というような話でしょうが、整理する意味も込めて書いておくことにします。

Excelの日付・時刻データの正体は、1日を「1」とする数値です。
整数部分が日付、小数部分が時刻を表しており、1時間は0.04166…(24分の1)になります。
その数値に、日付または時刻の表示形式が設定されているわけです。

日付・時刻データの起点は1900年1月0日0時0分0秒で、数値にするとここが「0」になります。
時刻だけのデータは整数部分を持たないため、通常、数式バーに日付の部分は表示されませんが、実際には1900年1月0日の時刻を表しています。
24時間を超えた場合は整数部が発生し、数式バーには日付と時刻がともに表示されます。

ただし、セル上での表示に関しては、[h]:mmのような表示形式で、この日付部分をすべて時間数に換算して表示することができます。
時間同士の計算であればこのまま普通に計算に使用できますが、その結果を表示するセルにも同様の表示形式を設定する必要があります。

この表示形式を設定した場合も、セル上では「45:30」のように時間数で表示されていますが、数式バーではあくまでも「1900/1/1 21:30:00」のような「日付 時刻」の併記になっています。
(ちなみに、数式バーに表示される日付と時刻の間には、半角スペースが1つではなく2つ入っています。)

なお、たとえば時給×時間数のような計算をしたい場合は、時間の表示されているセルを24倍すれば、1時間を「1」とする数値に換算できます。
posted by 土屋和人 at 14:11| Comment(0) | TrackBack(0) | Excel

2009年10月29日

関数の引数の省略

前回の数式クイズの解説部分で、VLOOKUP関数の第四引数検索の型を省略すると「FALSE」を指定したのと同じになる(つまり完全一致での検索)、と書きました。
これについて少々補足を。

一般に、ヘルプや解説書などを見ると、検索の型を省略するとTRUEを指定したことになる(つまり昇順の表で近似値を含めて検索)、と書かれています。

これは、前にも書いたように、第三引数列番号の後に「,」(カンマ)を付けるかどうかがポイントとなります。

カンマがなければ、Excelはそもそも「その引数が指定されていない」と見なします。
「省略時はTRUE」なので、TRUEが指定されたものとして処理を行います。

一方、カンマがあると、「その引数が指定された」と見なします。
「指定はされたけどそこには何もない」という状態です。
「何もない」場合、Excelはその部分を0(関数によっては空白文字列)として処理します。
たとえば、「=AVERAGE(3,3)」は「3」ですが、「=AVERAGE(3,3,)」や「=AVERAGE(3,,3)」は「2」になります。

VLOOKUP関数の話に戻すと、0はFALSEと等価なので、FALSEが指定されたのと同じ結果になる、というわけです。

省略可能な引数であっても、省略の仕方によってはこのような違いが出てくることは、認識しておいたほうがいいでしょう。
posted by 土屋和人 at 05:49| Comment(0) | TrackBack(0) | Excel

2009年10月16日

数式でラベルを使用する

昨日の数式クイズは、『ビジテク関数・数式』中の間違いの訂正であったのと同時に、実は今日のこのネタの前フリでした。(^^;)

クイズの例では、「名前の作成」機能を使って表の各行・各列に見出しの名前を設定していますが、名前を付けることなく、行・列の見出しを使ってデータセルを特定する方法が、なかったわけではありません。
それが、「数式でラベルを使用する」の設定です。

「ツール」メニューの「オプション」で表示される「オプション」ダイアログボックスの「計算方法」タブでこのチェックボックスをオンにすると、昨日のような表であれば、

=塩ラーメン 新宿支店

という数式で「289,000」という値が求められます。
ただし、この場合の「ラベル」(表の見出し)は、いわゆるセル参照とはちょっと違うので、INDIRECT関数の対象にはならず、昨日の解答例のようなことはできません。

また、

=塩ラーメン

のように行か列どちらか一方のラベルだけを指定した場合は、そのラベルが指定している行(列)で、この数式が入力されているセルと同じ列(行)のセルが参照されます。

ただし、「オプション」ダイアログボックスの表示手順でも気がつかれたかもしれませんが、この設定が可能なのはExcel 2003までです。

不要と判断されたのか、それとも新しい機能との整合性の問題か、Excel 2007ではこの機能は完全に削除されています。
これに相当するVBAの機能であるWorkbookオブジェクトのAcceptLabelsInFormulasプロパティも、2007では非表示になり、使用できなくなっています。

代わりに(?)、2007の「Excelのオプション」ダイアログボックスでは、「数式でテーブル名を使用する」という、似て(もいないか別に^^;)非なる設定が追加されています。
posted by 土屋和人 at 09:13| Comment(0) | TrackBack(0) | Excel

2009年10月01日

作業グループのRangeオブジェクト

久しぶりのExcel VBAネタです。

以前からずっと疑問に思っていて、いまだに解決していないことがあります。
複数のワークシートの同じセルに一括で同じデータを入力したい場合、その複数のシートを選択し(作業グループ)、目的のセル、たとえばB2ならB2を選択して、データを入力します。

この操作をVBAで行うには、まずWorksheetsコレクションのインデックスに配列を指定するか、SelectメソッドをReplace:=Falseで実行して複数シートを選択し、目的のセルを選択したうえで、ActiveCellプロパティで取得したRangeオブジェクトに対して入力操作を行います。
ActiveCellの代わりにSelectionプロパティも使用可で、この場合はセル範囲にも一括入力できます。
入力だけでなく、書式設定の変更などの操作も同様です。

ただし、ActiveCellやSelectionを使わず直接「Range("B2")」などのように指定したのでは、たとえ作業グループの状態であっても、アクティブシートのB2セルだけに入力され、他のシートには入力されません。

このとき、「ActiveCell」で取得したRangeオブジェクトと「Range("B2")」で取得したRangeオブジェクトとでは、いったい何が違っているのでしょうか?

試しにそれぞれのRangeオブジェクトをオブジェクト変数にセットしてローカルウィンドウで見てみても、違いがあるのはわかるのですが、どこがポイントなのかはよくわかりません(ActiveCellのほうが「Rangeクラスの○○プロパティを取得できません」が多い、という程度)。
「Parent」や「Worksheet」を見ても、いずれのRangeオブジェクトも単独のワークシートを返します。

どこが違うのかという疑問もさることながら、私が知りたいと思っているのは、作業グループ状態のRangeオブジェクトを直接取得する方法はないのか、ということです。
いちいちSelectする操作をVBAのコードとして書くのは、ちょっと抵抗もあります。
(作業グループではなくループで処理すればいい、というのは置いておいて)

ちなみに、作業グループ状態のActiveCellやSelectionをオブジェクト変数にセットした後、ワークシートを1つだけ選択し直して作業グループの状態を解除しても、このオブジェクト変数に対して、複数シートの同一セルへの一括入力を行うことは可能です。
ただし、これも入力操作に限れば、という話で、まだ検証不足なので詳しくは書きませんが、書式設定の変更などではいろいろと問題が出てくるようです。

作業グループ状態のRangeオブジェクトの正体や、直接取得の方法をご存知の方は、ぜひお教えいただけるとありがたいです。
posted by 土屋和人 at 07:07| Comment(0) | TrackBack(0) | Excel

2009年09月19日

配列を扱える関数

このクイズの解答で書いたのは、要するにこういうことです。

modesample.jpg

上の例では、単にA1:A10のセル範囲に入力されている値の最頻値ではなく、その範囲の各セルの値に1を加えた数値のグループの中での最頻値を求めています。
A1:A10のセル範囲の中で一番多く登場するのは「1」ですから、それに1を加えた「2」というのは正しい答えです。

では、MODE関数をMAX関数に変えた場合はどうでしょう?

maxsample.jpg

A1:A10のセル範囲の各セルの値に1を加えた数値のグループの中での最大値は「5」のはずですから、この結果は正しくありません。
こういう数式の書き方をした場合、「A1:A10」というセル範囲が指定されていても、実際に参照されるのは、数式が入力されたセルと同じ行にあるA2セルの値だけです。
したがって、そのセルの値に1を加えた「4」が答えとして表示されています。

この数式はまだ対象のセル範囲のセルと同じ行にあるため、こういう形で計算が行われ、エラーにもなっていませんが、たとえばC11セルなどに同じ数式を入力すると、#VALUE!エラーになってしまいます。

上でいうところの「値のグループ」とは、つまり配列です。
上記のMAXを使った数式で、A1:A10のセル範囲の各セルの値に1を加えた数値の配列の中での最大値を求めたい場合は、単にEnterするのではなく、Ctrl+Shift+Enterで、配列数式として確定する必要があります。

このあたりのことは、私のWebサイトのこのページで説明しています。

SUMやMAXも「配列を扱える関数」ですが、その対応の度合いはいわばレベル1といったところです。
MODEは、SUMPRODUCTなどと同じく、いわばレベル2の配列対応関数というわけです。

その機能や数式内での使い方において、SUMやMAX、AVERAGEなどと同じように考えてしまいがちなMODE関数ですが、こうした違いは意識しておいたほうがいいかもしれません。
posted by 土屋和人 at 11:35| Comment(0) | TrackBack(0) | Excel

2009年09月08日

数値ではない数

ExcelやVBAにあまり慣れていない編集者や校閲者の人とのやり取りで、ここは誤解されやすいかも、と感じるのが、「変数」や「定数」が実際にはどういうデータなのか、という点です。

たとえ「データの入れ物」や「データに付けた名前」といった概念的な説明を本文に入れていたとしても、「数」と付くからには、それらのデータは結局「数値」ではないの?と思い込まれてしまうことがあるのです。
なので、たとえば「文字列を表す変数」や「オブジェクトを表す変数」というのが、どこか間違っているような気がしてしまうわけです。

これはExcelのワークシート用語の「定数」でも同様で、たとえばジャンプ機能の選択オプションで「定数」の「文字」を選ぶ操作などについて書くと、「?」となってしまったりします。

でも、まあ、その気持ちはわからないでもありません。
私も、最初にプログラミングの「変数」という概念に触れたときは、その名前(変数名)はもちろん数値ではないし、中身だって必ずしも数値とは限らない、なのに変って……といまいち納得がいきませんでした。

要するに、その概念の呼び名に「数」と付くのが紛らわしいので、最初の段階で、variableやconstantのもっとわかりやすい訳語はなかったのかな、という気もするのですが……
まあ、もともとExcelの用語というよりプログラミングにおける一般的な用語であり、さらに遡れば数学用語でもあるので、今さら不服を言ってもどうしようもないことなのですが。(^^;)

プログラマーの人などからすると「何をいまさら」というような話でしょうが、これからExcelやVBAを学ぼうとする人には、ちょっと引っかかってしまうポイントのような気もします。
概念を理解するうえで、その呼び名というのは、やはり結構重要です。
posted by 土屋和人 at 17:48| Comment(0) | TrackBack(0) | Excel

2009年08月23日

Officeアシスタントと音声機能

Officeアシスタントと音声認識・音声出力の機能については、いつかこれらを使って何か面白いものを作ってみたいと思っていました。
それほど具体的なイメージがあったわけではないのですが、たとえば、子ども向けの教育ソフト的なものとか、ゲームっぽいものなど。

結局、実現しないうちにExcelのバージョンが上がり、両方の機能とも使えなくなってしまったのですが。(^^;)

もともと不評だった(らしい)OfficeアシスタントについてはExcel 2007で機能自体が完全に削除され、音声関連のコマンドもリボンUIには表示されなくなりました。
音声出力に関しては、クイックアクセスツールバーに表示させたり、VBAから使用することはできなくもないのですが、音声認識と音声出力は基本的にOS(Windows Vista)任せになり、しかも日本語の音声合成エンジンは付いていないため、通常は英語の読み上げしかできません。

私自身、正直、どちらの機能も、通常の作業ではほとんど使っていませんでした。
特にOfficeアシスタントは、多くの人と同じく、何かの操作ミスで画面に出してしまったら、軽く舌打ちして即座にオフにしていましたし。

昔のSFドラマなどによくあった、音声でコンピュータに命令し、処理の結果が音声で返ってくるようなインターフェースに対する憧れは多少ありましたが、いざそれに近いことをやってみると、かえって煩わしい気もします。
(現時点では。将来的にはもっとスムーズになるのかもしれませんが)

なくなってしまった今になると、両方の機能とも、あんな使い方をすると面白かったんじゃないか、こんなふうに使うと便利だったんじゃないか、などとときどき思ったりもします。

日本語の音声出力は今後(OSレベルで)サポートされる可能性もあるかもしれませんが、Officeアシスタントが復活する可能性はないでしょうね。

もちろん復活しても普段は使わないだろうとは思いますが(^^;)、できれば削除ではなく、隠し機能的にでも残しておいてくれればよかったのに、と思います。

現状でまだ2003を使っている人は、バージョンアップせず2003を使い続ける、という選択肢ももちろんあるわけですが……上の2つの機能を使いたいという理由だけで断固バージョンアップしない、という人も、まぁいないでしょうね。(^^;)
posted by 土屋和人 at 21:25| Comment(0) | TrackBack(0) | Excel

2009年08月14日

用語集

Excel 2003まではたぶんなかったと思いますが、Excel 2007のヘルプには「用語集」という項目があります。
これまではあまりよく見ていなかったのですが、先日、自分のWebサイトにもその手のコンテンツを追加し、さらに充実させていきたいと思っていることもあって、改めて内容を確認してみました。

で……何というか、これが非常に面白い。(^^;)
某T学会が紹介している書籍と同じように、「本来の意図とは違った楽しみ方」ができます。
基本的には、もともと英語で作成されたコンテンツのローカライズがあまりこなれていないために生じた問題なんですが。

まず、用語集(用語辞典)の項目の分類って、普通、五十音の「あ」「い」「う」……とか「あ」「か」「さ」……みたいな感じで並んだり、あるいは「数字」みたいな括りになると思うのですが、いきなり「3-D」という分類に度肝を抜かれます。

で、そこに入る項目が「3-D グラフの壁面と床面」と「3-D 参照」の2つだけ。
……えーと、普通に「3-D グラフ」という項目はなくていいんでしょうか?

その後は、まあ五十音ではなくて普通にアルファベットの「A」「B」……と続くのですが、まず「A」の「アクティブシート」の説明が

ブックで作業中のシート。アクティブ シートのタブの名前は太字で表示されます。

ふーん。英語版のExcelだとアクティブシートのシート見出しは太字なんですね。
でも日本語版だと書式は変わりませんけど。

その後、「アクティブセル」「アクティブ化」(こんな言い方一般的ですか?)「アドレス」「オートフォーマット」(いや、この機能は2007では使えないんですが)と続いて、その次の項目が「引数」。
さらに「軸」「対応するピボットテーブルリスト」(!)……と、およそ日本語としては「A」とは結びつかない用語が並びます。

知りたい用語の英語訳がすぐ思いつく人ならともかく、日本語の用語名で項目を探したい人は、ずいぶん苦労させられそうです。
「アクティブセル領域」が「C」の分類に入っていたりもするし(current regionだから)。

その他にもいろいろとツッコミどころは豊富なのですが、きりがないので今日のところはこのへんで。
posted by 土屋和人 at 09:34| Comment(0) | TrackBack(0) | Excel

2009年08月05日

定数

このところやってたVBA関連の仕事が、ようやく一区切りつきました。

で、今回改めて「どうしたものか?」と思ったのが、「定数」という言葉の扱いでした。

VBAの本なので、当然、「定数」といえばVBAの組み込み定数やユーザー定義定数のこと……なのですが、Excelのワークシート上の操作では、また違った意味で「定数」という言葉が出てきます。
こちらは、つまり、セルに入力されている、数式でないデータのこと。また、数式に含まれている数値や文字列データなども「定数」と呼びます。

VBAのコードのサンプルでは結構SpecialCellsメソッドを使ったのですが、その引数Typeに指定できる定数xlCellTypeConstantsを、果たしてどう説明するか?

Excel VBAのヘルプを見ると、この定数を指定した場合は「定数が含まれているセル」が取得される、と臆面もなく(^^;)書いてあります。

VBAの本なので、Excel自体にはもともとある程度知識を持っている人が主な読者だとは思うのですが……ただ、ひょっとすると、Excel用語としての「定数」(非数式)というのも、実はそれほど一般的ではないのではないか、という気もしています。
たとえば、数式をその計算結果に変換する操作は、「定数に変換する」ではなく「値に変換する」といいますし。
(この「値」という用語もなかなか厄介ですが……まあそれはまた別の話)
「定数」という用語が出てくる機能は、「条件を選択してジャンプ」(要するにSpecialCells)ぐらいでしょうか?

Excel用語、VBA用語のどちらの「定数」にも初めて出会った読者は、結構混乱してしまうのではないか? という危惧を抱いています。
(一応、それなりに気をつかって書いたつもりですが)
posted by 土屋和人 at 09:33| Comment(0) | TrackBack(1) | Excel

2009年07月22日

微妙な名称変更

Excel 2003から2007になって、機能自体はそれほど変わっていないのに、UIに表示される名称が微妙に変わってしまったコマンド、というのがいくつかあります。

たとえば、
「オートフィルタ」→「フィルタ」
「入力規則」→「データの入力規則」
「集計」→「小計」
など。

「オートフィルタ」は別に「フィルタ」になっても構わないのですが、旧「フィルタオプションの設定」の機能も含めて「フィルタ」と呼んでいたので、こういう機能の総称が必要な時にちょっと困る気がします。
ちなみに、旧「フィルタオプションの設定」は、2007では「詳細設定」……って、これだけでは何の「詳細」なんだかさっぱり(^^;)。

「入力規則」に関しては、2003でもダイアログボックス名は「データの入力規則」だったので、もともとこっちが正式な機能名だったのかな(何を持って「正式」とするか、というのも難しい問題ですが)、という気がなきにしもあらず。

「集計」を「小計」にするのは、なんだか「総計」が除外されてしまったみたいで変な感じです。

まあ、どっちでもいいといえば全部どっちでもいいのですが(^^;)、実は今、VBA関連の本を書いていて結構困っているのが、コードの操作に対応するExcelの機能名を紹介するとき。
AutoFilterオブジェクトはつい「オートフィルタ」と書いてしまうし、Validationオブジェクトは単に「入力規則」としてしまいがちです。
一応「2003対応」という前提ですし、「コマンド名」というより「機能名」ということで見出しなどに入れる場合は、なんだかそれらのほうが納まりがいい気もしてしまうのですが。

ちなみに、Excel 2007のVBAヘルプの「AutoFilterオブジェクト」や「Validationオブジェクト」の項目の解説では、「オートフィルタ」「入力規則」となっています(^^;)。
posted by 土屋和人 at 07:54| Comment(0) | TrackBack(0) | Excel

2009年06月27日

配列の記事の間違い

私のWebサイトのVBAでの配列の受け渡しに関する記事で、結構根本的なミスをやっていました。

バリアント型としてだけでなく、配列としてFunctionプロシージャの戻り値を返すこともできる、ということなんですが。
VBの経験者の方からすると、あるいは常識だったかもしれません。

この記事は、私のサイトの中では、割と検索でやって来る人が多い(らしい)ページなので、非常に申し訳なく思っています。

この点だけでなく、自分の書いた記事でも、時間をおいて読み返すと、正直、ところどころ、微妙だなぁと感じる部分に出くわすことがあります。
他のWebサイトとか本とかをろくに調べず、自分の検証だけで書いているところも多いので、まだ他にも間違っている部分や説明が不足している部分は、結構あるのではないかと思います。

何か気付かれたことがあった方は、あちらの送信フォームからでもこのブログのコメントからでも、お教えいただけるとありがたいです。
posted by 土屋和人 at 09:10| Comment(2) | TrackBack(0) | Excel