2010年6月26日土曜日

第150回目、複数個のコピー元をある規則性を持った場所にコピーする

○第150回目、複数個のコピー元をある規則性を持った場所にコピーする

 今までのコピーは、あるものをあるところにコピー
          あるものをあるブロックにコピー
          あるブロックのものをあるところにコピー
          あるブロックのものをあるところに複数回コピー
 というものでした。上から、1=⇒1、1=⇒N、N=⇒N、N=⇒N×i、ということを意味しています。
 これで十分だと思うのですが、いろいろやっていくと、コピー元がブロックであり、複数個ある場合があります。N×i=⇒N×iのパターンです。
 具体的には、2列ごとにある4つのブロックを3列ごとにコピーするというものです。コピー先をずらしていくという形もあると思います。

【例1】







【例2】








 次に、1*N=⇒N*iというのもあります。
【例3】




 テーマはお分かりになったでしょうか。飛んだ場所を、飛んだところに、コピーしようということなのです。
 ここでのコピーとは、計算式の場合は移植となり、数値の場合はコピーということにします。

Qus.計算式の移植、計算式のコピーとはどう違うのですか。
=⇒計算式の移植とは、計算式がそのまま移ります。ですから計算値は変わりません。計算式のコピーとは、通常のコピー・ペーストで貼付けるもので、計算式内の座標が原則的に変わります。計算値も変わることになります。ですから移植では、計算式をデータとみなして、そのデータを別のセルに計算式として入れるということになります。
Qus.計算式の移植を選択したということですが、コピーじゃ何か都合が悪いことがあるんですか。
=⇒例1のように、コピー元とコピー先の中での位置関係が違うことを想定しているので、二番目以降の計算式がまったくおかしなものになってしまうからです。
Qus.なるほど思いますが、前提に制約をつければ、コピー系でも有益なものがあるのではないでしょうか。
=⇒コピー元とコピー先の中での位置関係を同じにして、コピー先の間の情報をまったく変えずに飛び飛びでコピーするというのは機能としてはありうるかもしれません。
しかし、間のセルの情報を気にしなければ、全体を指定して一気にコピーすればいいことになります。あまり先々の展開は望めないのではないかと思い、コピー系ではなく、移植系としました。
=⇒なるほど。

 【例1】と【例2】の場合
 0.コピー元の最初のブロックを指定してマクロを実行する。
 1.座標情報の取得
 2.次のコピー元の先頭のセルを指定する。1と2で、たて・横の偏位がわかり、後のコピー元の位置がわかる
 3.コピー回数を入力する
 4.最初のコピー先の先頭のセルを指定する
 5.次のコピー先の先頭のセルを指定する。4と5で、たて・横の偏位がわかり、後のコピー先の位置がわかる
 6.コピー元の計算式を変数にとり、コピー先のセルに入れる(小ループ)
 7.6をコピー回数分繰り返す(大ループ)

 三種の神器ではないが、1.指定場所情報の取得、2座標情報の指定、3.パラメータの指定でほとんど終了になってしまいます。いわゆる、"おわ"ですね。
 コピー元の偏差として、hensa1_xとhensa1_yとし、コピー先の偏差として、hensa2_xとhensa2_yとすればいいでしょう。
 6の小ループは、イメージ的に言えば、1の行数です(列数の場合や行数×列数の場合もあります)。
 7の大ループは、3のコピー回数です。
 計算式の取得(ない場合は値の取得)は
 If Cells(,).HasFormula = True Then
  mm() = Cells(,).Formula
 Else
  mm() = Cells(,).Value
 End If
 計算式の移植は
 Cells(,).Formula = mm()
 または
 Cells(,) = mm()
 上のように、いったん配列の変数に入れなくても、計算式の取得と移植を一気にやる方法もありそうですね。
 すると、
 If Cells(,).HasFormula = True Then
  Cells(,).Formula = Cells(,).Formula
 Else
  Cells(,) = Cells(,).Value
 End If
 となりますが、添え字のコントロールを間違えないようにしてください。

Qus.【例1】と【例2】の使用例を教えてください。事例が思い浮かびません。
=⇒確かに、移植という事例はほとんどないですね。
 一例です。ある制度では、年齢に応じた額を支払うことにしているとします。簡単にするために、毎年支払う金額は年齢と同額とします。60歳の人には60円を、70歳の人には70円をということになります。
 あるとき制度を変更して、今時点で59歳以下の人には、これまでの額の80%、60歳以上の人にはこれまでの額の90%を支払うように制度を改めたとします。
 すると、今後を経過年度別に見ると、年齢が一つ上がっていきますので、90%のグループと80%のグループが斜めに移動していくことになります。
 さてこのような金額表をどうやってスムーズに作ったらいいでしょうか。
 このようなときに威力を発揮します。金額の計算式が複雑であればあるほど威力を発揮します。
Qus.やり方のイメージがわきません。
=⇒別なところで【例2】をやった後に、その結果を【例1】により、計算式を置きたい場所に移植します。
 1.たてに、1~115までの数字を入れます。これは年齢です(場合によっては、-40~115でも結構です)。
 2.その隣の2列に、59歳までは0.8と年齢×前の列の値(0.8)、60歳以上は0.9と年齢×前の列の値(0.9)という計算式を入れます。このとき年齢の列は絶対参照にしてください。
 3.2の列を横に、20組、列コピーします。
 4.例2により、このコピーした20組のうち奇数番の列20列(計算式ではなく、0.8とか0.9という値になっている列)を一つずつ下にずらして移植します。移植先の列は連続でかまいません。すると、四角にはなっていませんが求めたいものができたことになります。
 5.4で求めたもので空きが出てくることがありますが、それは通常のコピーで埋めてください。
 6.5で求めたもので必要な四角形を選択し、例1により、3.の値の場所に移植します。今度は移植先で列の間隔があいています。

Qus.処理対象は計算式ではないではないですか。
=⇒ご指摘はごもっともです。ものごとをわかりやすく単純化したためにこのような例をとりました。ご勘弁願います。
 本論には関係がないのですが、この処理は、計算式を取得して、その計算式を移植するという単純な処理なのですが、処理時間がかなり長いのが気になります。

※今回のテーマとは直接は関係がないように見えるのですが、コピー機能でこんなのに出会いました。スムーズに行うにはどうしたらいいでしょうか。
 たてブロックである計算式があります。それを原型として、コピーしたいのですが、コピー先は6列ずつ離れています(間に5列あるということ。また、コピー先は複数あります)。
計算式中の参照セルは、次の列にして欲しいのです。(単純に次の列にコピーして、その間に5列または5列分のセルを挿入するという方法は、他の部分に影響を与えてしまいます。他の部分に影響を与えないという前提とします)
 さらに、2.参照列の偏差がさまざまだったらどうでしょうか。
=⇒2番目にはまったく手も足も出ないので、今回は考えないことにしますが、一番目はこうしたらどうでしょうかというアイデアがあります。
 1.原型の計算式ブロックのよこに、10列挿入します。(列単位に10個コピーするとします)
 2.その10列に原型の計算式をコピーします。行番号は変わらずに、列番号だけが原則的に一つずれていきます。
 3.この10ブロックを、今回紹介したマクロで移植するのです。移植元は連続列、移植先は6列おきという規則性がありますので、今回のマクロが利用できます。
 4.最後に挿入した10列を削除します。

Qus.なるほどそのようなニーズがあったらとても便利でしょうね。それはさておき【例3】はなんか面白そうなので早く紹介してください。
=⇒長くなりましたので、今回はこれでおしまいにして、次回紹介します。

2010年6月19日土曜日

第149回目、漢字等の入力を早くするには

○第149回目、漢字等の入力を早くするには

 答え=⇒タイピングを早くすればいいのです。それも間違いが少ないようなレベルになるまで努力しましょう。
 
 といっても、疲れてきたときなど、飲んだ後など、タイピングのレベルは落ちてきますよね。誤入力もなかなかなくなりませんよね。
 何とか便利な方法はないのでしょうか?

 ということで私が考えて実際に行っている方法を、一例として述べてみます。
 1.単語登録を活用する。
 2.既に打ち込んだ文章中から同じ漢字等を持ってくる。
 3.単語登録を一括で行う。
 4.よく使う漢字等を再利用しやすくする。
 5.誤入力しやすいものを変換する。

 1.単語登録を活用する。
 これはよくやっている方法ですよね。現在、単語登録数は3000語を超えるほどにまでなりました。結構、便利です。が、読みを忘れてしまったり、登録したのを忘れてしまったりしています。この点はしょうがないですよね。
 ここでのポイントは、読みの設定方法です。
 地球温暖化という単語があったとします。これにどのような読みをつけますか。"ちきゅうおんだんか"では、何をか言わんですよね。
 採用している方法では、基本的には、読みは三文字としています。上の単語の変種として、地球寒冷化というのもありますから、二つに分けて、"ちき+お"としています。
 地球寒冷化の場合は、"ちき+か"とすることができるので、似ていても読みが違うようにすることができるのです(あたまからだと、両方とも"ちきう"となってしまいます)。
 接続詞及び語尾の場合は、"ん+X"としています。
 "ん+し"の場合は、"しかし、"というふうになります。
 "ん+あ"の場合は、"である。"というふうになります。
 登録にむいているのはタイプしにくいものとなりますが、例えば、拗音のあるもの、ぱ行のもの、長音(ー)のあるもの、カタカナの単語などでしょうか。
 この方法は、誰でもイメージがつきやすいと思います。

 2.既に打ち込んだ文章中から同じ漢字等を持ってくる。
 これは、QXマクロとなりますが、すぐ前にある文章群から、漢字等の単語を持ってきて、そのうちから選択して文章に挿入するというものです。
 この場所で、マクロを動かしますと、
 QXマクロ、文章群、漢字等、単語、選択、文章、挿入、
 文章中、
 方法、イメージ
 登録、タイプ、拗音、長音、カタカナ、単語…
 というような単語群が抜き出されます。
 この中から選ぶというのですが、一度選んだものは別に格納しておいて、そちらからも選択できるようにしています。こちらの場合は、選択されたものは一番上に移動するという機能がついています。また、正確ではありませんが、漢字の読みに近いもので限定して表示させることもできます("あ-こ"までとか)。
 長い文字列の場合はメリットとがありますが、タイプしたほうが速いのではないかと思われることが多いです。
 連続処理が基本となっていますので、数パラグラフで、同じ単語が頻繁に出てくる場合は便利です(一括置換えという手もありますが)。

 3.単語登録を一括で行う。
 これは、1の準備作業を楽にするというものです。文中の単語を選択して読みを入れると、単語登録用の形式にしてくれるというマクロです。
 単語登録用の形式とは、
 こんほ 根本的 名詞
 というものです(間はタブでつないでいる)。
 一括して単語登録用の形式にしてしまい、ファイルに追加格納し、そのファイルを読み込んで一括で単語登録をしてしまおうというものです(IMEの辞書ツールのツールのテキストファイルからの登録)。

 4.よく使う漢字等を再利用しやすくする。
 これは現在、構想倒れですが、単語登録の内容を出力したものに、3.の機能で単語をどんどん登録していきます。このファイルを読みこんで、読み(の一部)を入れることによって、その読みを含む単語を表示させ、そこから選択しようというものです。例えば、"ちき"といれれば、"地球温暖化、地球、地球寒冷化など"が出てきてそこから選ぶことができます。
 この機能は、単語登録をしてしまうということをやってしまえば、意味が薄れてしまうということで、現在ほとんど使っていません。

 5.誤入力しやすいものを変換する。
 これは既存のQXマクロで複数語一括変換マクロというのがあるので、それを利用すれば、やることは変換表を作ることだけになります。256組まで登録できるので、かなりのものと思われます。変換表は、拡張子を.TBLとするテキストファイルです。
 変換表は、次の形式となります。
 際m手 きわめて  (間はタブ)
 ※eの入力がぬけてしまった。
 誤入力の癖みたいのがあると思いますので、その都度変換表に追加しています。
※複数語一括変換マクロは下記のページを参照してください。
 REPMULTI
 複数文字列一括置換
 http://www.vector.co.jp/soft/win95/writing/se107231.html

 文章作成での一例
 1.まず、文章を単純に入れていく
 2.5.の誤入力変換マクロでタイプミスの癖を修正する
 3.頻繁に出てくるような単語を文章中の単語から選択し追加していく。
 4.文章をチェックして、間違いの部分を修正する。この際、タイプミスで誤入力変換マクロで対応したほうがいいものは、変換テーブルに変換文字を追加登録します。
 5.文章の中で単語登録したい単語を選んで、一括して単語登録用の文字列をつくり、IMEの辞書機能で一括して単語登録する。

 このようなことで文章を入力していますが、やはり、単語登録とタイピングを正確に早くするほうが一番大事な気がします。
 そうはいっても、タイピングについてはあまり上達していないというのも事実です。そんな時には何かにすがりたくなるものです。

2010年6月6日日曜日

第148回目、連続した年度を簡単に入れられないか

○第148回目、連続した年度を簡単に入れられないか

 たまのことですが、連続した年度を見出しに入れたい時があります。例えば、平成20年度…とかです。
 たて見出しでは、桁数が多いためうるさくなってしまうのですが、横見出しの時は、そうでもないので、ニーズが出てきます。

 1.まず最初のセルに、平成20年度と入れます(B2とします)。
 2.次のセルには、計算で文字列をつくります(C2とします)。
   =left(B2,2) & (MID(B2,3,2) + 1 & RIGHT(B2,2)
 3.この計算を必要なだけコピーします。

 最初のセルに、平成01年度と入れると、一つ目(平成2年度という表示)はいいのですが、二つ目のところにエラーが出ます。
 これは年度が一桁の数値になっているからです。

 これを避けるために、年度の部分をTEXT関数で整形してあげます。
  =LEFT(W23,2) & TEXT(MID(W23,3,2) + 1,"00") & RIGHT(W23,2)

 これを基本として、マクロ化するとどうなるでしょうか。
 マクロ化するのは、表示スタイルをさまざまに選べるという機能をつければいいでしょう。
  平成20年度のスタイル
  H20のスタイル
  20年度のスタイル
  フリースタイル…基にする文字列の頭の文字列の桁数、後ろの文字列の桁数を指定して、真ん中の数値のみ更新していきます。
 これを利用すると、平成20年00月の月を更新したものを作ることができます。

0年目…とかいう経過年度のケースですが、これは、9から10にいくところをどうするか、という問題があります。
どうしたらいいのか考えていたら、アイデアが浮かびました。
すぐ左のセルを使うのではなく、最初のセルを使えばいいのでした。
この場合は、TEXT文で数値を編集する必要がなくなります。

ひるがえって、これまでのものも最初のセルをもとにして計算式を組み立てるという方式にすべきでしょう。

マクロ処理の流れ
1.最初の数値が入っているセルからこれから作り出したいセルまでを指定してからマクロを実行する
2.表示したいスタイルを選択する。
3.指定範囲の情報を取得する。
4.最初のセルに計算式を設定し、値貼付けをして計算式をなくす。
 最初の数字は、セルに書き込まれているものとなりますが、それを変数から定数化するために、値としてセルに貼付けします。
5.次以降のセルに、最初のセルをもとにして、計算式を入れる。

※このような年度をつける処理が、エクセルの基本機能にあるのかどうかは確かめていません。あればこのマクロはほぼ空振りとなります。