やっぱり消えない?

「セルと一緒に消えます」で書きましたが、Excel 2007では、シェイプを配置した下のセルを削除すると、上のシェイプも一緒に削除されるようになりました。
詳しくは「セルと一緒に消えます」をご覧ください。

これは便利!と喜んでいたのですが、消えないケースもあるようです。

1.「矢印」を配置します。ここではわかりやすく、色などの書式を変更していますが、標準の書式でも同じです。また、矢印でなく「直線」でも同様です。


2.シェイプを配置した下のセルを列ごと選択します。ここでは列C:Dです。右クリックして[削除]を実行します。


3.シェイプが消えずに残ります。これはExcel 2003までと同じ挙動です。


何だろうこれは?もし、本来は削除されるはずなのに残るのだとしたらバグでしょうけど、こんなにわかりやすいバグが開発段階で発見されない方が不思議です。もしかしたら仕様なのでしょうか・・・

でも「矢印」以外の、たとえば「四角形」では削除されます。





さらに不思議なことに「矢印」の高さが短いと削除されます。





高さがいくつを超えると削除されなくなるかマクロで試してみましたが、これまた不思議なことにマクロから列を削除するとシェイプも削除されます。「シェイプの下のセルを削除すると、上に配置したシェイプも削除される。ただし、直線と矢印は除く。ただし、シェイプの高さが短いと削除されない。ただし、マクロではシェイプの高さにかかわらず削除される」なんていう仕様は意味がわかりません。これはきっとバグなのでしょう。

ちなみに[セルに合わせて移動やサイズ変更をする]はデフォルトでオンになっています。


重複データの削除(もう少し詳しく)

Excel 2007には重複データを削除する機能が、標準機能として追加されました。おそらく、こうしたニーズが世界中で高かったのでしょうね。どんな機能かは、以前にレビューした下記のページをごらんください。

重複データの削除

さて、この[重複の削除]機能ですが、もう少し詳しく見てみましょう。

■残るのは必ず先頭のデータ
たとえば次のようなリストを例にします。重複するデータは[Name]と[Area]です。わかりやすく、重複データには同じ色をつけています。



[データ]タブの[重複の削除]ボタンをクリックすると次のダイアログボックスが表示されます。今回重複をチェックしたいのは[Name]と[Area]ですから、[Age]のチェックボックスをオフにして[OK]ボタンをクリックします。





ここで注意しなければいけないのは、削除されるのは必ず下に存在するデータだということです。言い方を変えれば残されるのは必ず先頭のデータです。まったく同一のデータが重複していたのなら、どれを残しても問題はありません。しかし、今回のケースのように[Name]と[Area]は重複しているけど[Age]が異なっている場合、これを区別したいときもあるでしょう。完全に同一のデータを削除するとき以外は、慎重に操作する必要があります。

■空いた位置には空白セルが挿入される
[重複の削除]機能は、重複しているセルを削除する機能です。では、削除されたセルはどうなるのでしょう。次のような実験をしてみました。



リストの下に、書式を変更したセルを置きました。[重複の削除]によってセルが削除されると、通常の[セルの削除]と同じように周辺のセルがシフトすると予想したからです。また、もしシフトせずに新しいセルが挿入されるのなら、その新しいセルの書式はどうなるのかを調べました。



結果はブランクセル(空白セル)が挿入されました。周辺のセルがシフトすることもありません。ちなみに、削除されるのはリスト内のセルだけです。行全体が削除されるわけではありませんので、リストの左右に別のデータが入力されていても影響を受けることはありません。

■数式が入力されている場合は注意が必要
リスト内に数式が入力されていた場合はどうでしょう。結論から書くと、最下行でSUM関数やAVERAGE関数などを使っているセルは削除の対象範囲になりません。削除の対象範囲でないのですから、当然削除もされません。ただし、これは関数を使っていた場合です。その数式が、=A1+B1のようにセルの参照式だった場合は削除の対象範囲に含まれます

【関数を使っていた場合】




【参照式を使っていた場合】




削除されてしまったセルを参照式が参照しいた場合、その参照は変化します。リストの内部に数式が入力されていた場合も、理屈は同じです。ただし、削除されたセルを解決するようにインテリジェンスな処理は行われません。

【関数を使っていた場合】




【参照式を使っていた場合】




Excel 2007の新しい[重複の削除]機能は、計算式を含まないリストで実行した方がよさそうですね。カンですが、この機能はあまり使われないような気がします。用途が限定されて、汎用性が乏しいですからね。

分析ツールの関数が標準で使える

今までのExcelにはワークシート関数が二種類ありました。ひとつは、いつでも使える標準のワークシート関数。数値の合計を返すSUM関数や、条件分岐にかかせないIF関数などお馴染みの関数群です。もうひとつは分析ツールというアドインを組み込むことで使用可能になるワークシート関数です。分析ツールで提供されるワークシート関数には、指定した範囲内の乱数を返すRANDBETWEEN関数や、インチ・メートル・パスカルなどさまざまな単位を変換するCONVERT関数などがありました。

分析ツールのワークシート関数はアドインとして提供されていましたので、[分析ツール]アドインを組み込まないと使用できませんでした。ところが、Excel 2007では、これら分析ツールのワークシートをアドインを組み込まなくても標準で使用可能になりました。

下図はRANDBETWEEN関数を使っているところです。ワークシート関数のオートコンプリートにも表示されます。





確認のために[アドイン]ダイアログボックスを開いてみましたが、間違いなく組み込まれていません。



[分析ツール]で提供されていたワークシート関数は、複雑な学術計算を行うものが多いですが、中には日常でも便利に使える関数があります。下図はCONVERT関数で摂氏と華氏を変換しているところです。


配列数式での列指定が可能

配列数式を使わない人には関係ない話ですが。
今までのExcelでは、配列数式の参照セルに列全体を指定することができませんでした。
まず普通の配列数式。Excel 2003です。



セルE2には

{=SUM(IF(A1:A8=$D$2,B1:B8,0))}


という配列数式が入力されています。参照しているセル範囲は「A1:A8」と「B1:B8」です。
これを「A列全体」と「B列全体」というように指定してみます。入力されているデータが可変のときは、ついこうやりたくなりますよね。



ところが、配列数式の引数には"列全体"を指定することができませんでした。これがExcel 2007では可能になっています。
こちらも最初は普通の配列数式から。



問題ないですね。続いてExcel 2003ではエラーになった"列全体"の指定です。



というように正しい結果を返してくれます。

ところで、Excel 2007はワークシートの領域が大きくなっています。Excel 2003で"列全体"ということは、ワークシートの行数である65,536個のセルが計算対象となるのに対して、Excel 2007のワークシートは1,048,576行もあります。同じように"列全体"を参照してしまうと、ナント16倍も大きいセル範囲を指定することになります。これは、速度的にどうなんでしょう?いくら配列数式といっても、再計算に一晩かかるようでは使い物になりません。

実際に計測してみました。上で使ったワークシートの計算に要する時間です。なお、Excel 2003は列全体を指定できませんので、65535セルを参照しています。

【Excel 2003】




【Excel 2007】




「計算所要時間」とは、数式が初めて計算(評価)されるときに要する時間です。「再計算所要時間」は、一度計算された数式が二度目以降に行う再計算です。Excelには"スマート再計算エンジン"というのが搭載されていて、一度計算した数式は、その数式に影響を及ぼすセルが変化したときだけ、もう一度はじめから計算をやり直す仕組みになっていますので、二度目以降の再計算は、一度目に比べて非常に高速です。

計測してみると、やはりExcel 2007の方が遅いですね。しかし、無理もありません。「A:A」と「B:B」で合計2,097,152個のセルを参照しているのですから。配列数式に列全体を指定できるようになったからといって、多用すると計算時間も増大するかもしれませんね。

なお、上の計測結果はあくまで"目安"とお考えください。Excelで数式の計算時間を計測するのは、かなりデリケートな作業です。上に書いたように、一度目と二度目以降では計算方法が変わってきますし、数式におけるセルの依存関係を表す"計算チェーン"の構成と再構成も計算時間に影響してきます。さらに、Windowsのキャッシュも無視できません。計測の環境とタイミングによっては、異なる数値が導き出されるかもしれません。そのうち、数式の計算時間を計測するベンチマークでも作って、詳細に検討してみましょう。いずれにしても、列全体を参照した場合は、より多くのセルを参照することになるExcel 2007の方が、若干遅いのは間違いないと思います。

オートフィルタのバグ

某掲示板で教えてもらいました。ここでは、下図のようなリストを例にします。



まず正常な動作から。

1.アクティブセルをA1に置いてオートフィルタを設定します。
 このアクティブセルの位置は重要なポイントです。


2.A列を「女」で絞り込みます。


3.結果はこうなります。


4.セルB3からセルB7までドラッグして選択します。


5.Deleteキーを押します。


6.A列のフィルタを解除します。


7.絞り込まれたデータだけが削除されています。


今度はバグの操作です。

8.セル範囲A1:A2(タイトル行)を選択してオートフィルタを設定します。


9.A列を「女」で絞り込みます。


10.セルB3からセルB7までドラッグして選択します。


11.Deleteキーを押します。


12.A列のフィルタを解除します。


13.絞り込まれたデータ以外も削除されてしまいます。


この現象はオートフィルタを設定するときに、どのセルを選択していたかによって挙動が異なります。

(A)リスト内の任意のセルにアクティブセルを置いた場合 → 正常
(B)リスト全体(ここではセル範囲A1:B7)を選択した場合 → 正常
(C)タイトル行(ここではセル範囲A1:B1)だけを選択した場合 → 異常
(D)1行目全体を選択した場合 → 異常

となります。
Excel 2003では発生しませんし、オートフィルタ設定時の選択セルによって結果が異なるという仕様は変です。オートフィルタや並べ替えのとき、Excelは対象のリスト範囲を自動的に認識しますが、それに関連したバグと見て間違いないでしょう。

複数ブックごとExcelを終了させる方法

やっと見つけた!Excelの終了ボタン」に書いた複数ブックを開いている状態Excel自体を終了させる方法ですが、もうひとつ発見したので書いておきます。

やり方は簡単です。Shiftキーを押しながらExcelの閉じるボタン[×]をクリックするだけです。これで、開いているすべてのブックを閉じて、Excel自身も終了することができます。

てゆーか、こういうのは、ちゃんとヘルプとかに書いてくれないと、誰も気づかないでしょう。それとも、複数ブックを開いた状態でExcelを終了されたくない大人の事情でもあるのでしょうか・・・

ヘルプの間違い(1)

なんだか"アラ探し"をしているようですが、ヘルプを見ていて間違いに気づきました。これらは、たまたま発見しただけですから、きっと他にも多くの間違いが記述されていると思います。おそらく、Excel 2003のヘルプを継承したままで直していないのでしょう。ただ、Excel 2007のヘルプは基本的に、インターネット経由でMicrosoftのサイトを参照しているだけなので、サイトに登録されているヘルプコンテンツがこっそり修正されるかもしれません。また、ローカルに保存されているヘルプファイルも、最近はOfficeアップデートなどで知らないうちに最新版へと更新されていることもあるようです。いずれにしても、現時点での誤記です。



位置のみ表示はできません」に書きましたが、Excel 2007ではグラフを"位置のみ表示"にすることはできません。オプションダイアログボックスからもオプションが削除されています。ヘルプからも削除して欲しかったですね。



これは恥ずかしい誤記ですね。EndキーではなくEnterキーです。
最後の「Shift+End」ですが、これを「Shift+Enter」と読み替えたとしても正確ではありません。
Shift+Enterキーは、オプションダイアログボックスの[Enterキーを押した後にセルを移動する]の[方向]と逆の方向にアクティブセルを移動します。[方向]で「右」を選択していれば、Shift+Enterキーで入力を確定すると、アクティブセルは左に移動します。

他にも気づいた誤記があったら紹介しますが、どなたか誤記に気づいた方がいらしたら、ぜひ教えてください。ヘルプに限らず、変な日本語や、意味のわからない記述も大歓迎です。責任を持ってMicrosoftに伝えます。

テーブルの行列を入れ替える

テーブルのネタをもうひとつ。
テーブル書式に設定した範囲を、行列を入れ替えてコピーしてみましょう。
テーブルを選択してコピーし、[貼り付け]ボタンの▼をクリックします。



ところが、お目当ての[行列を入れ替える]がグレイアウトして使えません。
テーブルはExcelが内部的に管理している特別な領域ですので、行列を入れ替えてしまうと困るのでしょう。
まぁ、理由はわかりますが、とりあえずデータだけでもコピーしたいところです。
そこで[形式を選択して貼り付け]を実行してみます。



しかし、こちらも[行列を入れ替える]オプションがグレイアウトしています。
テーブルの行列を入れ替えてコピーすることはできないのでしょうか・・・
いえいえ、実は方法があります。
右上の[コピー元のテーマを使用してすべて貼り付け]オプションをオンにすると、[行列を入れ替える]オプションが使えるようになります。



書式はコピーされませんが、とりあえずデータだけは行列を入れ替えてコピーできました。


テーブルの左上セルを空欄にしたい

Excel 2007には強力なテーブル機能が搭載されました。今までのリスト機能は、お世辞にも便利とは言えず、とても積極的に活用しようとは思えませんでした。ところが、Excel 2007のテーブル機能は名前が変わっただけでなく、実にさまざまな改良が加えられました。条件付き書式と並んで、Excel 2007の"イチオシ"機能といっても過言ではありません。そういえば、このレビューではまだテーブル機能について紹介していませんでした。書くことが多いので、そのうちじっくり解説します。

さて、非常に便利なテーブル機能ですが、ひとつだけ気に入らない点があります。実際にやってみましょう。

テーブルにしたい表を選択して[テーブルとして書式設定]ボタンをクリックします



範囲の確認で[OK]ボタンをクリックすると、テーブルに変換されます



非常に簡単な操作でテーブルに変換できたのですが、よく見るとセルA1に「列1」という文字が勝手に挿入されてしまいました。邪魔です。ここは空欄でいいんです。元のデータはそうなってたはずです。勝手に変えないで欲しいです。そこで、アクティブセルをセルA1に移動してDeleteキーを押すと・・・削除できない。セルA1の「列1」は消すことができないんです。

もちろん「支店名」など別の文字に書き換えることはできますが、空欄にはできません。実はテーブル機能では、こうしたタイトルが必須なのです。「1月」「2月」や「東京支店」「横浜支店」などのタイトルは、テーブル内を参照するときに使用されます。



上図は、セルE2からテーブル内のセル(ここではA2)を参照する式です。テーブル内のセルA2は、参照式を入力した2行目と「列1」列が交差するセルですので「=テーブル4[[#この行],[列1]]」で表されます。このような参照方法を行うことで、テーブル内での計算式が包括的に管理され、行列の追加や削除、数式の変更などに対して柔軟に対応できます。なお、こうした参照を構造化参照と呼びます。

構造化参照のために、空欄だったセルA1には「列1」という仮の列見出しが入力されました。まぁ、それはわかりますが、それでも、やっぱり、邪魔ですね。無粋です。この「列1」を削除することはできませんが、隠すことなら可能です。半角でも全角でもいいですから、スペースを入れておけばいいんです。ただし、テーブル内の列見出しに、スペースは1つしか指定できませんから注意してください。テーブル内に同じ列見出しは複数存在できないからです。

新しいテーブル機能と構造化参照については、まだたくさんのネタがあります。そのうちじっくり解説しましょう。

Cells.Countがオーバーフロー

マクロでCells.Countを取得しようとするとオーバーフローします。これは、ベータ版で発見して報告したバグですが、製品版でも直っていないようです。残念。

たとえば、次のコードはエラーになります。



オーバーフローしているのは黄色い行です。



これは当然ですね。Long型では入るはずがありません。
しかし、受ける変数をDoubleに変えても



それならバリアント型では



いずれにしてもエラーです。
ここでは、Cells.Countを変数に代入していますが「MsgBox Cells.Count」でも「Debug.Print Cells.Count」でも「If Cells.Count > 1 Then」でもオーバーフローします。
どうやら、そもそもCellsのCountが怪しいようです。
オブジェクトライブラリで調べてみると



なるほど、Countプロパティ自体がLong型で宣言されているのですね。Excel 2007はワークシートの領域が広がりましたので、全セルの合計は17,179,869,184個です。Long型の許容値2,147,483,647を楽に超えています。おそらくこれが原因でしょう。

ちなみに、次のようなコードもオーバーフローします。



ここまでのマクロは標準モジュールに書きました。これをSheet1などのシートモジュールに書くと、エラー表示が異なります。



これではデバッグもできませんね。
もっとも、なぜか次のように明示的にWorksheetオブジェクトを指定してやると、全行数×全列数の計算結果は取得できるようです。理由は調べていませんが、不思議ですね・・・てゆーか、早いとこ直して欲しいです。





Topページへ戻る
calendar
  12345
6789101112
13141516171819
20212223242526
27282930   
<< April 2008 >>
profile

Excel MVP
links
selected entries
search this site.
categories
archives
recent comment
recent trackback
recommend
recommend
recommend
recommend
recommend
others
mobile
※当ブログではPNG形式の画像を使っているため、携帯では画像を表示できないこともあります。