Powered By Blogger

暇がない。自力じゃ無理な人はこちらへ。

2014年7月18日金曜日

図形をセルに入力されている値によって自動変更

事例:
ワードアートや図形のテキストをセルの内容によって自動変更する。
これは、数式バーに参照セルを指定してやればOK。
(ただし、ここで直接、数式を使っての文字列合成はできないようだ。あくまでも参照するセルを指定するということ。)

これは単純で解りやすいのだが、図形そのもの、例えば、○を△にするとか、というような変更するとなると・・・あれ?

解決策:
というわけで、今回は、リンクされた図形について。
これは、貼り付けオプションの1つで、コピー元のセルを”図形”として、リンクするという機能だ。

左の例では、D6、D7、D8にAAA・・・、BBB・・・、CCC・・・とそれぞれ入力されている状態で、D6:E8の範囲をコピー(Ctrl+C)、そして、D1:E3の範囲を選択して、貼り付け→その他の貼り付けオプション→リンクされた図形としている。

ちょっと解りずらいが、コピー元が図形としてコピー先にリンクされる。
ここで注意が必要なのは、あくまでも”範囲”が図形としてリンクされるというところ。左の例ではAAA・・・が選択範囲を越えているので、その部分がカットされた図形になっている。






そして、図形なので、こんな感じに色々とデザインできる。















更に、リンクなので、このように、元のセルが変更されると、それに連動して、図形の見た目も変わる。

左の例では、D8の内容をDDD・・・に変更して、さらにD6:E8の範囲にワードアートを新たに貼り付けた。すると、D1:E3の図形にもそれが反映されている。







と、いうような、非常に面白い機能だ。



具体例:
この機能と、名前の定義を使えば、今回の目的を達成できるだろう。
例として、
「セルの値を”右、上、左、下”のどれかを選択すると、それに応じた矢印を表示する」
というような機能を実装してみよう。

1.まず元になる矢印画像を用意して、どこか適当な場所に貼り付ける。
  このとき、実際に画像を表示したいセルと範囲の広さを合わせておく必要がある。
  その理由は前にも言ったように、あくまでも範囲が図形としてリンクされるため。
  今回はA1:A3に矢印画像を表示させる予定なので元の画像を3x1に収まるように調整しておく。















2.元画像を含むような範囲を選択して、この範囲に名前を付ける。
  A6:A8の範囲を選択して”右”という名前を定義する
  この名前は、後の手順7で矢印選択用リストの値として使う。




3.以下同様に、全部の元画像に名前を定義する。




4.元画像の範囲をコピー
 A6:A8の範囲をコピー(Ctrl+C)
















5.実際に画像を表示したい範囲を選択
  A1:A3を選択




6.リンクされた図形を貼り付け
 貼り付け→その他の貼り付けオプション→リンクされた図形



















そうすると、左のように、コピー元の範囲が図形としてリンクされて表示される。












7.選択リストの用意
 セルに直接でも良いが、今回はリストから選択できるようにする。
 下のように、B1に入力規則を適用
 (ここで、リストの値は先に元画像の範囲に付けた名前と同じにしておくこと。こうすることで、手順8で設定する参照範囲の式が簡単になる。)



































なお、入力規則を適用したあと、そのセルは、空欄ではなく、どれかを表示した状態にしておく。(空欄だと、このあとの手順9でエラーが起こるため)








8.表示する画像に名前を付ける。
 矢印という名前を新しく定義して、参照範囲を以下のような式にする。

     INDIRECT(矢印!$B$1)

この式の意味は、セルB1の値が示す参照を示す・・・
分かりにくいな。
要は、B1で選択されている文字列が示す範囲を返す。ということ。
例えば、B1が”右”となっていれば、”右”という文字列が示す、すなわち、”右”という名前の範囲(右という名前が定義されているので)を返すということ。
なお、この新しく定義した名前はまだ、どこにも適用されていない。手順9で使う。



















これを追加したあとの名前の管理ウィンドウはこうなる。











































9.リンクされた図形に名前を適用する。
 さて、いよいよ大詰め。
 リンクされた図形を選択して、数式バーに手順8で定義した名前を入力する。
 こうすると、この”矢印”という名前を遡っていくことにより、元画像のどれかに行き着き、その画像が表示されることになる。





















10.完成

















たまに使おうとするとやり方を忘れていたりするので、ちょっと長くなったが、詳細な手順を書いてみた。これでもう安心だ。

2014年7月17日木曜日

スクリーンショットが撮れない(windowsネタ)

今回はエクセルとは直接の関係はないが、今更ながら新発見したので。

最近よくスクリーンショットを撮る。キーボードの”PrintScrn”、または”Alt”+”PrintScrn”で画面をクリップボードにコピー。そして”Ctrl”+”V”で貼り付け、という操作だ。

しかし最近、この操作でうまく行かない場面に像遇した。
”PrintScrn”キーを押した段階ではウィンドウズからは何の反応もないので、コピーそのものが成功しているかどうかは不明だが、すくなくとも”Ctrl”+”V”で貼り付けようとすると、全然別の画像が現れた。
最初は、”Ctrl”+”C”で別のものをコピーしていた場合に起こるのかと考えたが、どうも違うようだ。
たとえクリップボードに違うものが保存されていたとしても、”PrintScrn”キーを押したときに、それはスクリーンショット画像にちゃんと置き換わっている。


撮りたかったのは、左のような画面なのだが、実際には、ハイライトされているところにはマウスカーソルと”リンクされた図(I)”というポップアップがあった。

その状態で”PrintScrn”キーを押し、エクセルの適当な箇所で”Ctrl”+”V”を押すと、”PrintScrn”キーを押す前にコピーしていた画像が貼り付けられた。
また、”Alt”+”PrintScrn”のために、”Alt”を押すと、その段階で、左のウィンドウそのものが閉じられてしまう。

そして、不思議なのは、マウスカーソルをアイコンに当てる前、”リンクされた図(I)”というポップアップが出ていない状態で”PrintScrn”→”Ctrl”+”V”の操作でちゃんとスクリーンショットが貼り付けられた。(”PrintScrn”を押した段階で、このウィンドウは閉じるので、ダメかと思ったが、大丈夫だった。)


このウィンドウは画像のリンクを貼り付ける操作の途中なのだが、マウスをアイコンに持っていった段階で、コピー先のエリアにはコピーしてあった画像が表示されて、選択された状態になっていた。
これが、関係ありそうなのだが、よくわからない。

とりあえず、このウィンドウのスクリーンショットは撮れた。
本当はアイコンハイライトとポップアップもある画像を撮りたかったが・・・

”しかし、上の画像のアイコンはハイライトされているのはどういうことだ。”
と思った、あなた。中々観察力が鋭い。

実はもう少し調査してみた結果、新発見が。
・・・というほど大袈裟なものではないが、スクリーンショットを撮る方法が他にもあることがわかった。それは、

 ”Windows”キー+”PrintScrn”

更に、この方法で撮ったスクリーンショットはクリップボードだけではなく、マイドキュメント(ピクチャ¥スクリーンショット)にも保存される。

しかし、これでもポップアップは表示されていない。
”Windows”キーを押した段階でポップアップが表示されなくなるためだろう。




まあ、ほぼ目的の画像が撮れたので、これで妥協することにしよう。

今回は、自分がただ知らなかっただけという、無知の表明みたいなものなのだが、あえて公開することにした。新たなスクリーンショットを撮る方法が分かったし。
考えてみれば、ウィンドウズの取説なんて読んだことないな。
きっと、似たようなことは沢山あるに違いない。

2014年7月14日月曜日

貼り付けた図形やワードアートが掴めない!

エクセルでPOP作成。

エクセル方眼紙ならぬ、エクセル台紙的な使い方だが、図形やワードアートをべたべたと貼り付ければ結構複雑なデザインのものも作ることができるので、ごく当たり前に使っている人も多いだろう。本来の使い方とは違うだろうが、これが結構使えたりする。ひょっとしたら、エクセルはPOP作成ソフトだと思っている人も多いかもしれん。

複雑なデザインのものを作ろうとすると、必然的に、何重にも絡み合った図形を相手に格闘することになる。ここで便利なのがグループ化機能だ。関連する図形をグループ化してまとめておくことにより、管理が容易になる。しかしそれが逆に仇になってしまうことも・・・

一度配置した図形を微調整する。ごく普通にやる操作だ。その図形はグループ化されていたので、そのグループごと位置を微調整する。これもやるだろう。しかし、このとき、このグループをマウスで掴もうとしても掴めない!なんて経験はないだろうか?

1つ1つの図形を掴むことは全く問題ない。グループごと掴めるものもある・・・
何か納得いかない。

正に謎の動きだったので、調査してみた。
結果は・・・

いくつかのグループを更にグループ化していた場合、そのグループ全体は選択・操作できるが、その下のグループは、グループ単位で選択できない。


左の例で説明すると、グループ2と3から構成されているグループ1があるとする。そして、構成要素の1つのグループ2は更に、文字と吹き出しという2つの図形で構成されている場合を考える。

この場合、グループ1全体は選択して移動や変更の操作ができるが、グループ2や3を個別に選択して操作することはできない。しかし、グループ2を構成している文字や吹き出しは単独で選択でき、操作可能となっている。














バグか?
まあ、バグと言えなくもないと思うが、おそらく、これが仕様だろう。
2007より前のバージョンでは、そもそもグループの個々の図形は選択することすらできなかった(記憶では)ことを思えば、使いやすくなったとも言える。

しかし、痒いところに手が届いてないというか・・・
惜しい。

解決策:
グループ化解除してから操作する。
無計画にグループ化しない。
更に、図形やグループにわかりやすい名前を付けておけば、オブジェクトの選択ウィンドウを表示させたときに、わかりやすいだろう。

























2014年7月11日金曜日

セルの内容をコピーしてるだけなのに、何故か再計算に入るエクセル

今回はVBAネタ。
シートに配置したフォームボタンを使って、ある範囲のセルの内容を別シートのセルの範囲にコピーする。
これだけなんだが、ボタンをクリックすると、カーソルが青いリングに変わって、何やら裏でやっているらしくて、なかなか戻ってこない。よく見ると下のステータスバーに「再計算・・・」というようなメッセージが、何度も現れては消えている。
これは?コピー先を参照しているセルはないはずだが?


原因調査

というわけで、どういう場合にcalculateイベントが発生しているか、ちょっと調査してみた。

1.まず、VBAのコード部分について、
 セルの内容をコピーするというコードだったので、セル操作に関するコードを色々とためしてみた結果、

 A.セルの内容を変更するようなコードでイベント発生
 Range("A1").Value = 1
 といったような操作でイベント発生。一方、幅や色を変更といった操作では、イベントは発生しなかった。

 B.対象となるシートにはよらない
 ことが判明。例えば、シート1、2、3とあり、内容が変更になるシートが”シート3”だったとしても、”シート1”、”シート2”でも、calculateイベントが発生する。

 ただし、A、Bとも、後述する特定の種類の数式がそのシートに記述されていることが条件。

2.数式部分について。
 再計算が発生しているので、どこかの数式が悪さをしているのだろう。ということで、数式を色々と試してみた。その結果、calclateイベントが発生したのは、
 
 日付/時刻関連 NOWTODAY
 検索/行列関連 OFFSETINDIRECT
 情報関連 CELLINFO

上記の関数を使用した場合、イベントが発生した。よく使うIF、SUM、INDEX、MATCHといった関数は問題ない。
(ただし、全部の関数は試していないので、これ以外にもあるかも)
すなわち、上述したように、これらの数式が記述されているシート内のセルに対して、その内容を書き換えるような処理が行われた場合、calclateイベントが発生する。
(実際に問題になったエクセルではINDIRECT関数を使用していた。)

解決策

さて、いろいろと解ってきたが、なぜ、こうなるかは不明のまま。
ちょっと解りそうにない。
とは言っても、なんとかしなくては使い物にならない。
上記の関数を使用しないというのも、1つの手ではあるが、そうもいかない。
そこで思い出したのが、エクセル自体の設定で、再計算を自動かマニュアルに変更できることだ。
イベント発生をコントロールする”Application.EnableEvents”はよく使うが、再計算についても同様の処理ができるのでは?
ということで調べた結果、やはりあった。

 Application.Calculation = xlCalculationManual

このコードを、セルの内容を書き換える処理の前に入れてやれば良い。
そうすると、calclateイベントは発生しなくなる。
終わったら、

 Application.Calculation = xlCalculationAutomatic

として自動に戻しておくことも忘れずに。


根本原因は不明なままなので、ちょっと不完全燃焼だが、しょうがない。
今回はこのくらいにしておこう。


2014年7月10日木曜日

条件付き書式のルールに数式を使う場合の注意

今回は、まさに小ネタに相応しい話だ。それは、

今でも時々間違うこともあるのだが、条件付き書式にルールを記述するとき、イコールを忘れて、


































としてしまうことがある。
この場合、エクセルがご親切にも、="C3>100"と変換してくれる。こんな感じ。

































当然これだとうまく機能しない。警告もなにもないので、小一時間悩むハメになる。
正しくは、こうだ。

































または、この例のような簡単なルールなら、「指定の値を含むセルだけを書式設定」で、
































と、こうする方がいいだろう。

でも、="C3>100"としたくなるよね。こっちの方が正しそうに見えてしまうのはなぜだろう?

2014年7月8日火曜日

必須入力のセルにちゃんと入力されているか確認したい。

事例:
ある部長の悩み。
各課から毎月の報告がエクセルファイルで送られてくるのだが、何も入力されていない箇所がちらほらと・・・。これはゼロ?何も無し?ってことか?それとも入力忘れ?
空欄だとどっちかわからんだろ。ゼロもちゃんと入力しろと何回言い聞かせても、一向に改善しない・・・

一番の解決策は部下の教育というか意識改革。だが、そうは言っても人間だれしも忘れることはある。未入力箇所が簡単に発見できれば、その方が良い。

解決策:
今回は比較的ポピュラーなテクで対応できるだろう。

 条件付き書式
 ある条件に従って、セルの書式、つまり、フォントの色や背景色、罫線などを変えられるという機能だ。
 今でこそ、当然のように使っているが、最初にこの機能を知ったときには感動したものだ。
 条件付き書式にも色々とパターンがあるので、どれを使えば適切なのか、悩むところだが、今回はぴったりなのが用意されている。すなわち、

 ”指定の値を含むセルだけを書式設定”でデフォルトでは”セルの値”となっている箇所を”空白”にすれば良い。書式自体はお好みで。

具体例:
下の表でC3~C6に必ず何か入力されている必要がある場合。














C3~C6の範囲がセレクトされている状態で、条件付き書式→新しいルールとする。










これ以外にも方法はある。
セルの値 次の値に等しい =""



































また、数式を使用して、書式設定するセルを決定(日本語が分かりにくいが、要は条件を数式で指定するだけ。利点は関数が使えること)を使うという手もある。
*注意:セルの指定は相対参照で1番先頭のセルを指定する。$を付けて絶対参照にすると、そのセルの値で、範囲全体の条件が決まってしまう。


































結果:














となり、未入力箇所がはっきり確認できる。



******************************************************************************

追加:
さて、これでいいんだが、場合によっては(若しくは多くの場合かも)、入力データは”数値”でないとダメ”。という場合には、これでは対応できない。
そこで、このような場合には、
ISNUMBER関数を使うと良い。今回は数値が入力されていないだから、NOTも合わせて使う。


































結果:













これでいいだろう。

条件付き書式には、これ以外にも多くの機能があり、使ってみないとよくわからないものも多い。
条件付き書式は頻繁に使うと思うので、これについては、また機会を見て書いていくことにしよう。


2014年7月7日月曜日

印刷範囲をいくつかのパターンから選択したい

予定通りに、今回も同じく印刷範囲について。

事例:
複数の表が同じシートにあるが、訳ありで、どれかの表を印刷するときは、他の表は、一緒に印刷したくない。1回だけなら、手動で印刷範囲指定でもいいが、何度もとなると面倒くさい。それに印刷範囲を指定出来ない人に、印刷だけ頼む場合も。
やっぱり簡単に印刷範囲を切り替えられると便利。

解決策:
下のような2つの表がある場合を考えてみる。

  A B C D E F G
1

         
2
3 表1       表2    
4 AAA BBB CCC   EEE FFF GGG
5 1 1 1   1 1 1
6 2 2 2   2 2 2
7 3 3 3   3 3 3
8 4 4 4   4 4 4
9 5 5 5   5 5 5
10 6 6 6        
11 7 7 7        
12 8 8 8        
13 9 9 9        
14 10 10 10        
15              
これも名前の定義
Print_Area
でなんとかなるだろう。

1.表1のエリアと表2のエリアをそれぞれ名前を定義しておく。
2.表1の名前と表2の名前をセレクトできるように、入力規則にリストを設定したセルを配置する。
3.Print_Areaの参照範囲に、2でセレクトされている名前によって、1で定義した名前のどっちを使うか切り替えるような式を入力する。

というような感じだろう。

具体的には
1.表1と表2の名前の定義
 名前の定義で、
 表1・・・・名前:表1、参照範囲:$A$3:$C$13
 表2・・・・名前:表2、参照範囲:$E$3:$G$9
 とする。
2.印刷範囲選択用のセルを配置。
 適当なセルを選び、データの入力規則の設定で、
 入力値の種類:リスト
 ドロップダウン リストから選択する:チェック
 元の値:表1,表2
 とする。
3.名前の定義にPrint_Areaを設定。
 参照範囲の式としては、IF関数で切り替えるようにしよう。
 名前:Print_Area
 範囲:シート
 参照範囲:

  IF(Sheet1!$B$1="表1",Sheet1!表1,IF(Sheet1!$B$1="表2",Sheet1!表2,Sheet1))

 なお、$B$1は表選択用のセル。

 ちなみに、Sheet1などのシート名はエクセルが勝手につけてくれるようだ。
 ここでは、何も選択されていなかった場合にシート全体を印刷範囲とするために、入れ子の中のIF関数の偽の場合に必要なので、明示的につけある。
 ・・・・のはずだったが、ためしに省略してみたら、それでも印刷範囲は全体になった。

 結局こういうことだ。
  IF($B$1="表1",表1,IF($B$1="表2",表2,))
 と入力すると、エクセルが勝手に

  IF(Sheet1!$B$1="表1",Sheet1!表1,IF(Sheet1!$B$1="表2",Sheet1!表2,))

 とシート名をつけてくれる。

これで、$B$1セルでリストから表1か2を選択すれば、印刷する表を切り替えることができるようになる。なお、全体を印刷したい場合は、$B$1でDeleteキーを押してクリアすれば良い。

また、前回のようなOFFSET関数を組み合わせれば(表1、2の名前の定義の参照範囲にOFFSET関数を使うということ)、データ数によって表1、2それぞれの範囲を可変にすることもできるだろう。

さて、次回はどんな内容にしようか?

2014年7月6日日曜日

印刷範囲を自動的に変えたい。

事例:
長い行数の表だが、データが入っているのは、上の方の一部の行だけ。しかも、その行数は決まっていない。
ような表を印刷する場合、そのまま印刷すると、表のデータが入っていない部分も印刷されてしまい、紙の無駄になる。見にくいし。
そこで、通常データが入っている行数に応じて、手動で印刷範囲を変更して印刷するわけだが、これは面倒くさい。これが自動で勝手に変わってくれると、非常にありがたい。

解決策:

ポイント:
まずは、基本事項。
名前の定義で名前を

 Print_Area

とすることにより、その参照範囲が印刷範囲となる。
で、この参照範囲にIF関数や、OFFSET関数を使って、範囲を可変にするような式を入れてやれば良い。

具体的にどうするのか?
例えば、下のような表を印刷するときに、数値が入力されていない、罫線だけの部分は印刷したくない。というような場合。

A B C D
1
2 表1
3 項目A 項目B 項目C 項目D
4 1 1 1 1
5 2 2 2 2
6 3 3 3 3
7 4 4 4 4
8 5 5 5 5
9 6 6 6 6
10 7 7 7 7
11 8 8 8 8
12 9 9 9 9
13 10 10 10 10
14        
15        
16        

この場合、
OFFSET関数を使って印刷範囲を自動変更する。
という方針がいいだろう。

OFFSET(基準, 行数, 列数, [高さ], [幅])

なので、基準として、印刷範囲の左上端のセルを指定して、行数と列数はともに0としておけば、後は基準からみた高さと幅が印刷範囲となる。
そこで、

OFFSET(印刷範囲の左上端,0,0,高さを求める式,幅を求める式)

の形になる。

印刷範囲の左上端
この例だと$A$1。

幅を求める式
おそらく固定幅の場合がほとんどだと思われるので、固定値でいいだろう。
この例だと、D列までなので、4だ。

高さを求める式
これについては、データの一番下の行の位置を求める必要があるが、これには色々と方法があると思うが、今回は、
 1.必ずデータが入力されていることが予想される、最初の列の空白以外の行数を求める。
 2.表に含まれない、見出しより上の行の数を計算に含めるため、見出しより上の空白の数を求める。
 3.2つを足して、全体の印刷範囲の行数とする。
というやり方でやる。

 まず1。
  COUNTA($A:$A) ・・・  *ここで、$A:$AはA列全体を指す(A:Aでも同じ) これが一番のツボかも。

 次に2。
  COUNTBLANK(OFFSET($A$1,0,0,MATCH("項目A",$A:$A,0),1))
  MATCH関数で、見出し行を検索して、OFFSET関数で範囲指定。最後にCOUNTBLANKで空白行をカウント。

 最後に2つを足して、
 COUNTA($A:$A)+COUNTBLANK(OFFSET($A$1,0,0,MATCH("項目A",$A:$A,0),1))
 これが、印刷範囲の高さを求める式となる。


結局、印刷範囲を求める式は、
OFFSET($A$1,0,0,COUNTA($A:$A)+COUNTBLANK(OFFSET($A$1,0,0,MATCH("項目A",$A:$A,0),1)),4)


最後の締めは、これを実際に名前の定義に設定する。

1.名前をPrint_Areaとする。
2.参照範囲に上の印刷範囲を求める式を入力する。(=を忘れずに)

以上、たぶん機能すると思うが、動かねーよ!みたいな事があれば、連絡してくれれば、ありがたいです。

次回予告:

同じく印刷範囲について、
「印刷範囲をいくつかのパターンから選択したい」

事例:
複数の表が同じシートにあるが、訳ありで、どれかの表を印刷するときは、他の表は、一緒に印刷したくない。1回だけなら、手動で印刷範囲指定でもいいが、何度もとなると面倒くさい。それに印刷範囲を指定出来ない人に、印刷だけ頼む場合も。
やっぱり簡単に印刷範囲を切り替えられると便利。



みたいな場合について。