ブログトップ

カクレ理系のやぶにらみ

tamm.exblog.jp

時間のある方はお読みください。軽い気持ちで読み始めると頭が痛くなります。

<   2013年 08月 ( 2 )   > この月の画像一覧

 以前、「Excelで住所録をつくる(1)」の中で、カードビュー・シートから当該レコードの相手に対し、メールソフトを立ち上げる手法としてハイパーリンクを用いるとご説明していましたが、誤りがあることがわかりましたので、お詫びして下記のように訂正いたします。

(誤り)
 カードビューに、数式を使ってメールアドレスを表示させたが、これにハイパーリンクを再度設定することはできません。一見ハイパーリンクが設定されているように見え、メールソフトも起動しますが、宛先欄には数式が記述されてしまうので、メールを送ることはできません。

(訂正)
 最もシンプルなやり方として、てデータベース・シートの中にある当該レコードのメールアドレスをクリックするという操作を、数式と単純なマクロを組み合わせて行うというものに訂正しました。

 既にサンプルファイル・ブログの内容ともに正しい方法のものに訂正していますので、既にサンプルファイルをダウンロードされた方は、恐縮ですが今一度ダウンロードしていただきますようお願いいたします。 
 

「Excelで住所録をつくる(1)」
http://tamm.exblog.jp/20557922/


(サンプルファイルの保管先)
http://p.tl/UrYx
by t_am | 2013-08-11 01:48 | Excel のあの手この手
 Excelではセルの中にかなり長い文字列を入力することができる反面、それを一度に全部表示させるというのは面倒ですし、使い勝手もよくありません。そこで、セルの内容をいったんテキストボックスに表示させ、そこに加えた変更を元のセルにも反映させる方法についてご紹介します。


 下図のように、長い文字列が入っているセルをアクティブにしてから、テキストボックスをクリックすると、セルの内容がテキストボックスに反映されます。この例では、セルS2の内容がテキストボックスに表示されています。
 この状態で編集可能なので(修正したものはただちにセルに反映されます)、修正が終わったら元のセルをクリックするか、そのひとつ右のセルをクリックしてください。Home キーを押すと、その行の行頭に移動します。
 なお、テキストボックスの中で改行するときは、Shift + Enter キーを押します。セル内改行(Alt + Enter)とは操作が異なるのでご注意下さい。

c0136904_151281.jpg



(手順)
1.開発タブを有効にします。
 Excel2007の場合、Officeボタンをクリックして、「Excelのオプション」→「基本設定」→「[開発]タブをリボンに表示する」にチェックを入れてオンにします。
 Excel2010の場合は、「ファイル」タブ→「オプション」→「リボンのユーザー設定」で右側にある「開発」にチェックを入れてオンにします。(下図参照)

c0136904_1515584.jpg



2.テキストボックスを配置します。
 下図のように、「開発」タブをクリックしてから「挿入」をクリックし、「Active X コントロール」のうち「テキストボックス」をクリックします。
 
c0136904_1522066.jpg



 次に、ワークシートの適当なところをドラッグすると、下図のようにテキストボックスが挿入されます。このときのテキストボックスは、普段お使いのテキストボックスとは少し異なります。
 また、リボンのところで「デザインモード」がオンになっていることに注意してください。

c0136904_152468.jpg



3.テキストボックスをアクティブセルにリンク付けします。
 今挿入したテキストボックスをダブルクリックします。すると下図のウィンドウが開くので、右の方にある「Change」と表示されているドロップダウンリストを展開して「GotFocus」をクリックしてください。画面上に新たに「Private Sub TextBox1_GotFocus()」という文字列が表示されます。


c0136904_1531089.jpg



c0136904_1533170.jpg


 「TextBox1_GotFocus」というのは、ユーザーがこのテキストボックス(TextBox1という名前がつけられています)をクリックして選択状態になったときのことを指しています。
 なお、その上にある

Private Sub TextBox1_Change()

End Sub


 という2行は不要なので、Delete キーで消しておきます。


c0136904_154378.jpg



 さらに、次のように、真ん中に「TextBox1.LinkedCell = ActiveCell.Address()」という文字列を1行付け足してやります。(下図参照)追加が終わったら、VBAのウィンドウを閉じてもらってもかまいません。

Private Sub TextBox1_GotFocus()

TextBox1.LinkedCell = ActiveCell.Address()

End Sub



c0136904_1543656.jpg
 


 リンク付けそのものはこれで終了です。以外とあっけないことがおわかりいただけると思います。そこで、少しばかりコードの説明をしておきます。

 TextBox1.LinkedCell というのは、テキストボックスと特定のセルをリンクさせるためのプロパティであり、通常はセルの番地をそのまま入力します。そうすることで、指定したセルの内容がテキストボックスに表示され、さらに編集した結果がセルにフィードバックされるようになります。今回は、特定のセルではなく、ユーザーが指定したセル(「アクティブセル」といいます)とテキストボックスをリンクさせるようにしなければならないので、

TextBox1.LinkedCell = ActiveCell.Address()

 というふうに、アクティブセルの番地を求める関数を用いて、テキストボックスのリンクセルプロパティの値がアクティブセルの番地に一致するということにしています。
 すなわち、テキストボックスに表示させたいセルを、ユーザーがクリックしてアクティブにした後、テキストボックスをクリックすることで「GotFocus」の状態になり、リンクセルプロパティに対し、アクティブセルの番地が代入されるわけです。
 なお、リンクプロパティの操作やテキストボックスの大きさの変更は、「デザインモード」でないと行うことができません。


4.テキストボックスの書式を修正しておきます。
 テキストボックスを右クリックして「プロパティ」をクリックするか、リボンの開発タブの真ん中ほどにある「プロパティ」をクリックしてもらうと、下図のようにテキストボックスの「プロパティ」が表示されます。


c0136904_1592327.jpg



 ここでは、「IME Mode」、「MultiLine」「WordWrap」の3カ所のみ変更します。
 まず、「IME Mode」ですが、この値を「4-fmIMEModeHIRAGANA」にします。これはテキストボックスの日本語入力を常にオンにするためのものです。
 「MultiLine」はテキストボックスの内容を複数行にわたって表示させるかどうかを指定するためのプロパティですので、その値を「True」にしておきます。
 最後に、「WordWrap」は文字列を右端で折り返すかどうかの設定ですので、これも「True」にしておきます。そうでないと文字列の折り返しをしなくなるので、セルの内容をテキストボックスに表示させる意味がなくなってしまいます。なお、「WordWrap」をTrueにしても「MultiLine」がTrueになっていないと有効にはならないので注意してください。

 すべての設定が終わったら、「デザインモード」をクリックしてオフにしてやることで、テキストボックスが使用できるようになります。


5.テキストボックスを常に表示させるようにする。
 このようにしてつくったテキストボックスですが、このままだとワークシートをスクロールするとテキストボックスもいっしょに動いてしまうという弱点があります。
 それでは意味がないので、このテキストボックスが常にワークシートに表示させるようにします。
 
 もう一度デザインモードにしてから、テキストボックスをダブルクリックして、VBAのウィンドウを開きます。
 そこで、次の文章を追加(面倒くさいという方はコピペでどうぞ)します。

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

With ActiveSheet
.Shapes("TextBox1").Top = .Cells(ActiveWindow.ScrollRow + 5, ActiveWindow.ScrollColumn + 1).Top
.Shapes("TextBox1").Left = .Cells(ActiveWindow.ScrollRow + 5, ActiveWindow.ScrollColumn + 1).Left
End With

End Sub


 実際には、下図のようになります。


c0136904_1595296.jpg


 SelectionChange とは、シート上で選択範囲が変更されたときのことをさし、アクティブセルを移動させる場合もこれに該当します。
 したがって、このコードは、アクティブセルが移動するたびに、テキストボックスというオブジェクトの上端と左端の位置を指定するためのもので、それぞれ上から5行分、左端から1列分空けたところにテキストボックスを配置せよという意味になります。このとき、「ウィンドウ枠の固定」を行っていると、固定されているところはカウントされません。

 付記
 このコードについては、

http://oshiete.goo.ne.jp/qa/4145549.html?order=asc&isShow=open 

を参考にさせていただきました。Masa2072さんにお礼を申し上げます。


(サンプルファイルについて)
 今回つかったサンプルファイルは、前回使用したものに追加修正を加えています。最新のサンプルファイルをお持ちでない方はダウンロードしてお使いください。

http://p.tl/UrYx
by t_am | 2013-08-04 15:10 | Excel のあの手この手