Excelは「機能」「関数」「VBA」の3要素で構成されています。この中で最も難しいのはダントツで「関数」です。というか、「関数」を駆使した"数式"ですね。これが一番難しいです。だって、セルの中だけで、しかも1行だけでプログラミングするのですから。最近は、LET関数なんてのも追加されましたので、"数式"内で変数のようなものも使えるようになりました。つまり、難易度がさらに上がったということです。3要素の中で最も簡単なのが「VBA」です。もうね、VBEという開発環境もありますからデバッグもしやすいし、プロパティやメソッド、関数やステートメントなど豊富な道具が揃っています。やろうと思えば、どんなことでも、どうとでもなります。「関数」も「VBA」も大得意の者から言わせていただくと、圧倒的に「関数」>>>>>>>「VBA」です。さて、その「VBA」よりも難しいのが「機能」です。ここで言う「機能」とは、要するにマウスやキーボードでExcelに指示を与えて、Excelが何らかの動作をするという仕組みです。たとえば手動操作でピボットテーブルを作るとか、表示形式を設定するとか、フィルハンドルをドラッグするとか、オートフィルタで絞り込むとかです。なぜ「VBA」より「機能」の方が難しいかというと、覚えることが膨大すぎるからです。ほとんどのExcelユーザーは、この「機能」に関して"知らないこと"が多いでしょう。今回は、そんな「機能」の中でも、誰もが一度はやったことがあるであろう「セルのコピー」に関するお話です。
みなさんは、セルをコピーするときにどうしますか?おそらく、多くの方は「Ctrl + C」でクリップボードにコピーして、コピー先(貼り付け先)のセルを選択してから「Ctrl + V」を押すのでは。ちなみに、この「Ctrl + V」は"貼り付け"という操作です。"貼り付け"とは、クリップボードに保管されているデータを持ってくる操作です。「持ってくる」なんて曖昧な表現をしましたが、"貼り付け"は単純に文字列や数値を代入するだけでなく、画像だったり、書式だったりと、その対象はさまざまです。なので「持ってくる」みたいな言い方をしました。
さて、この「コピー」と「貼り付け」ですが、「Ctrl + C」「Ctrl + V」以外にもショートカットキーが割り当てられているのを知っていますか?「Ctrl + Insert」と「Shift + Insert」です。"Insertキー"はキーボードによっては"Insキー"と刻印されています。
参考までに、「切り取り」は「Shift + Delete」です。
コピーの「Ctrl + C」と貼り付けの「Ctrl + V」は、私の記憶が正しければ、Windows 3.1で実装されたショートカットキーです。私も、それほど多くの経験はありませんが、その前の、Windows 3.0~Windows 1.0時代にはまだ「Ctrl + C」「Ctrl + V」が実装されておらず、その代わりに採用されていたキー操作が「Ctrl + Insert」や「Shift + Insert」などでした。こうした古いキー操作の中には、今のWindowsでも使えるものもあります。さて、Excelでセルをコピーするキー操作は、これだけではありません。たとえば、1つ上のセルをコピーするときは「Ctrl + D」、1つ左のセルをコピーするには「Ctrl + R」で行えます。
これは「フィル」という機能のひとつです。
「下方向へコピー」と「右方向へコピー」にだけはショートカットキーが割り当てられています。「D」は"Down"、「R」は"Right"の頭文字ですね。
ここまでは、主にキー操作によるコピーのしかたをご紹介してきましたが、もちろんマウス操作でセルをコピーすることも可能です。セルの右クリックメニューやリボンに[コピー]や[貼り付け]のコマンドが用意されていますので、それを実行してもいいです。ここでは最後に、ドラッグによるセルのコピーをご紹介します。やり方は簡単です。コピー元のセルまたはセル範囲の「周囲の枠」を、コピー先にドラッグするだけです。ただし、普通にドラッグすると"移動(切り取り→貼り付け)"になってしまいますので、ドラッグするときにCtrlキーを押しておきます。
では、ここからは、セルのコピーに関する不思議な話をしましょう。まずは、動作をご覧ください。何なら、読みながら一緒に操作してみてください。次のようなデータがあったとします。現在のアクティブセルは、セルB2です。
マウスのドラッグや、キー操作などで、セル範囲B2:D4を選択します。
この状態で Ctrl + C を押せば、選択されているセル範囲がクリップボードにコピーされます。
これは普通の動作です。では次。まず、セル範囲B2:D2だけを選択します。
続いて、Ctrlキーを押しながら、セル範囲B4:D4をドラッグします。実行すると下図のように選択されます。
この状態で、先と同じように、Ctrl + C を押します。
選択されているセル範囲がコピーされます。では、同じ手順で、下図のように選択してください。
この状態で Ctrl + C を押すと、
コピーに失敗します。ほかにも、次のような選択ではコピーできません。
コピーできたときと、コピーに失敗したときで、何が異なるのでしょう。
これ、ややこしい話なので、先に結論を言います。Excelでセルをコピーするとき、そのコピー元のセル範囲は長方形でなければいけません。もっと正確に言うと「選択したセル範囲の、左上セルと右下セルを対角としたときの形が長方形」でないと、コピーができないんです。先の、コピーできたときと失敗したときを見比べてみましょう。
【コピーできる形】
【コピーできない形】
Ctrl + Cでコピーできないのですから、当然ドラッグ操作でもコピーできません。できないものは、どんな操作でもできません。この件、ほとんど解説されることがないので、ご存じない方が多いでしょう。さらにこの「長方形でなければならない」というルールは、次の話にも関連してきます。
セルをコピーすると、コピー元セルの情報がクリップボードに格納されます。では、何が格納されるのでしょう。クリップボードの中を表示できる「クリップブック」というツールを使って確認してみます。
上図がクリップブックです。クリップボードの内容をリアルタイムで表示できます。やったことないですけど、クリップボードに格納されているデータを別ファイルとして保存して、あとで読み込むことなどもできるようです。クリップブックは、Windowsに標準で付属するツールです。昔のWindowsには付属していました。すみません、今のWindows 10に付属しているかどうか分かりません。私はいつも、新しいパソコンには以前から使っている実行ファイルをコピーしてショートカットを作成しています。念のため、ちゃんとMicrosoft製です。
では、このクリップブックを使って、Excelでセルをコピーしたとき、クリップボードに何が格納されるのかを確認してみます。まずは、下図のようにセルを1つだけ選択します。
この状態で、Ctrl + Cを押します。
クリップボードに格納されたのが分かります。ちなみにWindowsのクリップボードというのは、めっちゃくちゃ複雑な仕組みです。格納されるのは、ただのテキストデータだけではありません。Excelのセルをコピーすると、次のような種類のデータが格納されます。
クリップボードの[表示]メニューで「ビットマップ」を選択すると、次のように表示されます。
今回コピーしたセルは何も装飾されていませんが、もし塗りつぶされていたり、文字色が変更されていたりすると、それらがちゃんと画像として保存されます。よく、Excelのセルやセル範囲をコピーして、WordやPowerPointなどに"画像形式"で貼り付けますよね。貼り付けられるということは、そのデータがクリップボードに格納されているということです。
さあ、では驚くべき事実をご紹介しましょう。今度は、次のように選択します。
いま選択されている、セルC2とセルC4の2つをコピーするのですが、はたしてクリップボードには何が格納されるのでしょう?これ、ほとんどのExcelユーザーは勘違いしているはずです。結果はこうなります。
ビットマップ(画像形式)で表示すると、こうなります。
今回の操作で、セルC3はコピーの範囲に含まれていません。しかし、そのセルC3もクリップボードに格納されます。上記の「コピー元は長方形でなければいけない」を解説したときの状況でやってみましょう。
何とも不思議な現象です。しかし、なぜこのような仕様にしたのかには、必ず理由があります。"何となく"とか"ウッカリ"ではありません。必然性があるはずです。もちろん、このレベルになれば、真実はMicrosoftしか知りません。われわれは推測するしか手はないんです。なので、私の推測をお伝えします。間違っているかもしれませんし、違う意見もウェルカムです。ヒントは「画像形式も格納される」ということです。Excelのセルや作成したグラフなどをコピーして、別のアプリケーションに画像として貼り付けるというのは、かなり昔のWindowsから実装されていた仕組みです。ですから、Excelのセル範囲をクリップボードにコピーしたとき、その画像形式データも一緒に格納しておきたいです。じゃ、考えてみてください。"非連続"の画像って、作れますか?たとえば上図のようにコピーしたとき、セル範囲B2:D2とセル範囲B4:D4だけの画像って、どうなりますか?2つの画像がピタリとくっついていてはおかしいです。2つのセル範囲の間には余白が必要です。では、その余白はどれくらいの大きさですか?画像なのですから、その余白にも色が必要です。余白は何色ですか?などなど、諸々のことを考えると、選択されていない部分も含めてコピーするという仕様も、ありっちゃありかな~って感じます。さらに、コピーしたセル範囲を画像形式データとしても保管するのなら、その形は長方形でないとマズイですよね。長方形ではない画像って、見たことありますか?そう考えると、コピー元は長方形でなければならない、というルールも何となく納得できます。いずれにしても、非連続のセル範囲をコピーしたとき、間に含まれる"選択していないセル"も、クリップボードにはコピーされるということです。
あれ?でも、ちょっと待ってください。おかしくないですか?だって、変でしょ、それって。じゃ、下図のように選択したとします。
Ctrl + Cでクリップボードにコピーします。クリップボードには、間違いなくセルC3もコピーされています。
アクティブセルを、セルF2に移動します。
Ctrl + Vで貼り付けを実行します。クリップボードに格納されていたセルC3は貼り付けられません。
Windowsの"貼り付け"機能とは、クリップボードに格納されているデータを持ってくる機能です。今回のケースでは、間違いなくセルC3もクリップボードに入っていました。だったら、これを貼り付けたとき、セルC3のデータも貼り付かなかったらおかしいじゃないですか。
これも、Microsoftの開発チームに聞いてみなければ真相は分かりません。でも、推測してみます。てゆーか、今回、クリップボードにコピーされているのは間違いない「セルC3」が、Ctrl + Vの貼り付けで貼り付かなかったのは事実です。じゃ、このときExcelは何をしたのかについて、仮説を立ててみます。
クリップボードは複雑な仕組みです。単純に数値や文字列を格納するだけでなく、アプリケーションごとの固有な情報もたくさん記録されています。もし、Excelがセルをクリップボードにコピーするとき「このセルとこのセルだけを貼り付ける」という情報を記録しているとしたら、それを頼りに貼り付けに該当するセルを決めたのかもしれません。でも、自分で言っておいてナニですが、それは超面倒くさいですw そして、フト思いついたのが「仮説2」でした。ちょっと待てよと。これって、本当にクリップボードから持ってきてるのか~?って。そこで、次のような実験を思いつきました。
Ctrl + Cでセルをコピーした後、Ctrl + Vで貼り付ける前に、セルA1の値を書き換えちゃいます。もちろん、これ手動操作ではできません。セルの値を編集すると、クリップボードがクリアされてしまうからです。でも、VBAなら可能です。やってみましょう。
上図のようなコードを用意しました。これから、マクロのコードを1行ずつ実行してみます。なお、黄色く反転している行は"次に実行される行"です。では、まず最初の「セルA1をクリップボードにコピーする(Ctrl + C)」を実行します。
クリップボードには間違いなく、セルA1がコピーされています。続いて「セルA1の値を変更する」を実行します。セルA1の値を200に変えちゃいます。
セルA1が200に変わりました。念のために、クリップブックで[最新の情報に更新]を実行してみます。
クリップボードの中は変化しませんでした。変更前のセルA1が格納されています。さあ、この状態で最後の「クリップボードを貼り付ける(Ctrl + V)」を実行します。
結果はご覧のとおり。アクティブセルには、クリップボードの内容ではなく、現在のセルA1がコピーされました。Excelは、"貼り付け(Ctrl + V)"を行うと、クリップボードに格納した情報ではなく、コピー元セルの情報を直接Excel内で貼り付けていたんです。
なるほど、もしそうだとしたら納得です。単純に「セルのコピー」と言っていますが、セルをコピーしたとき、貼り付け先に反映されるのは「セルの値」だけではありません。パッと思いつくだけでも「表示形式」「塗りつぶし」「フォント情報」「条件付き書式」「入力規則」「コメント」「スタイル」「保護」「行の高さ」「列の幅」「セルの上に配置したオートシェイプや画像」…キリがないのでやめますが、セルをコピーするには膨大な情報が必要です。それらすべての情報を、一度クリップボードに格納して、貼り付けるときには、その情報からコピー元セルを"再現"して貼り付ける、なんてことは現実的ではありません。だったら、同じExcel内なのですから、Excelの内部機能として「このセルを、このセルと同じ状態にする」を実装した方が、はるかに簡単で便利で安全です。じゃ、何のためにクリップボードへ格納するのでしょう。これも真意は分かりませんが、おそらく「他のアプリケーションで利用するため」ではないでしょうか。試してみましたが、Excelのセルをコピーして、PowerPointのスライドに貼り付けを行うと、PowerPointの表形式が貼り付きます。もちろん、その表はExcelのセルとは異なります。そりゃ当然です。だってPowerPointには「条件付き書式」や「セルのコメント」なんて機能はないのですから。Excelのセルで使われている、すべての情報は必要ないです。だったらクリップボードには、そうしたときに必要な"最低限の情報"だけを格納しておけば済みます。よく、Excelのセルや作成したグラフを他のアプリケーションに貼り付けたとき「Excelと同じようにならない!」と大騒ぎしている人がいますが、そんなの当たり前です。異なるアプリケーションなんですから、正確に再現するのは無理な話です。
今回は、Excelの機能で最もよく使われるであろう「セルのコピー」に関して、ほとんど知られていない制約や、衝撃的な事実などを解説しました。多くのユーザーからExcelの質問を受けますが、その中で「セルのコピーがうまくいかない系」の質問って、意外と多いです。もちろん、細かい内容は千差万別ですが、そうした「セルのコピーがうまくいかない系」の質問に共通して感じるのは、要するに自分が望むようにならないってことです。そしてその自分が望む結果というのは、ここまで解説したような"システムやプログラミング的な仕組みや制約"を無視して、単純にヒトが思うことです。もちろん、ヒトが思ったとおりに動作するシステムやコンピュータがあったら素敵です。いつの日か、そういうSF的な未来が訪れることを期待します。しかし、現在は違います。機械が、ヒトの望どおりに動いてくれるはずがありません。それが現状です。じゃ、どーするかというと、ヒトが機械に歩み寄ります。それが、現在において、効率よく機械を扱う考え方です。しかたありません。現在の機械なんて、そんなものなのですから。だから、Excelと良い関係を築くには"あきらめ"や"納得"が不可欠です。思いどおりにならなかったとしても「そうか~Excelはこれができないのか~しかたね~なぁ、ここは手動でやるか~」みたいな気持ちを忘れないでください。Excelは単なるプログラムです。魔法の杖ではありません。くれぐれも「なんで、こうならないのよ!キーッ」と憤慨したり「これ、きっと誰も知らない裏技があんじゃね?w」みたいな徒労の旅に出ないでください。ExcelはExcelなりに、がんばっているのですからw。