2010年11月28日日曜日

第161回目 こんな処理はどうしたらいいの?移植の変化技、ずらし移植

○第161回目 こんな処理はどうしたらいいの?移植の変化技、ずらし移植

 ずらし移植って、何?
 ブロック単位の複数個移植で、移植先が列・行ともずれていくものです。
 特にイメージしやすいのは、移植先が1行ずつ上がって(または、下がって)いく例でしょうか。
 当該列の5行から20行までの和
 当該列の6行から20行までの和
 当該列の7行から20行までの和
 当該列の8行から20行までの和
 当該列の9行から20行までの和
 これが5列ありました。
 これを違う場所に、
 最初の列には、5行空白行をつけて移します。
 次の列には
 空白行が4行
 当該列の5行から20行までの和
 当該列の6行から20行までの和
 当該列の7行から20行までの和
 当該列の8行から20行までの和
 次の列には
 空白行が3行
 当該列の5行から20行までの和
 当該列の6行から20行までの和
 当該列の7行から20行までの和
 当該列の8行から20行までの和
 当該列の9行から20行までの和
 ……
 となるものです。
 
 この処理の結果では、同一行に、例えば、
 当該列の5行から20行までの和
 次の列の6行から20行までの和
 その次の列の7行から20行までの和
 その次の列の8行から20行までの和
 その次の列の9行から20行までの和
 というふうに並びます。
 
 今までも同じのような問題がありましたが、今回は、移植元、移植先の列の飛びも可能となっている点が新しくなります。
 このような操作が何回もあるとたまらないので作ってみたということです。基本はコピー版と同じですね。
 
 実行の手順です。
 まず移植のひとつのブロックを指定してから実行です。
 次の移植元へのとび数を指定します。2列ごとに移植元がある場合は、2と入力します。
 移植の回数を入力します
 移植先のブック、シートを指定します
 移植先の一番目のセルを指定します
 次に移植する先のセルを指定します。このとき3列先で1行下のセルを指定します。
 この関係で、3番目以降の移植の場所を計算で求めて自動的に処理を行います。

 □同じ場所でできますか。
=⇒できます。ただしずれていくので、もとの計算式が消えない箇所が出てきます。それを消すのは階段状に消すことになるので、手間になります。
 違うところに移植して、それを再度通常移植するという処理がいいと思います。


 

2010年11月13日土曜日

第160回目 QXマクロ、30行上下の漢字またはカタカナ文字列を抽出

○第160回目 QXマクロ、30行上下の漢字またはカタカナ文字列を抽出

 文章をうっていくと、同じ用語が頻繁に出てくることがあります。文字数が少なければそうでもないのですが、多くのキータッチを必要とするものについては、面倒くさくなってしまいます。これを何とかしようという発想です。
 通常の操作では、重複している部分を除いて入力して、後でコピーしてくる、というのではないでしょうか。
 今回考えるマクロでは、すでに入力した文字列を取得し、一覧表の形で表示しその中から選択して、文章に入れてしまおうというものです。
 これまで入れた文章を見てみると、"重複"という漢字が、入力しにくそうですね。これをもう一度入れなければならないという時に、威力(?)を発揮します。
 後で起き替えたい場所には数字をうっておきます。そしてマクロを動かします。すると、次のようになります。
 「この1では、」
  ↓
 「この重複では、」

 さて、取得する文字列としては、漢字系、カタカナ系、数字系が考えられます。特に、人名などのカタカナは再入力が面倒くさいものではないでしょうか。
 数字系については、イメージがつきずらいと思いますが、こういうことです。
 QXマクロの中には、この式を計算するというマクロがあります。
 計算式を入れていき、計算をさせます。その結果を後の行で使いたいというときに、使用します。
20*5=100
30*6=180
 この合計はというときに、100と180を持ってくることができるのです、通常は桁数が大きく、数字がランダムなのとても便利です。
 また、1カタカナ系では、人名のように、途中に・があったり=があったりしますので、その部分を含めて取得します。
 "ヴィンセント・ヴァン・ゴッホ"の場合は、まとめて、"ヴィンセント・ヴァン・ゴッホ"を取得とするという意味です。カタカナ系には、英文字も含めていますので、プログラムの中での変数名のつなぎとして使っている記号(_)も含めて取得する必要があります。tate_hensaなどが例です。
 ニーズにもよりますが、カッコで囲まれた部分という取得の仕方もあります。
 さらに別機能として、選択した文字列をファイルに保持しておくというのもあります。
 したがって、いままでに選択したものから選ぶか、文書中の文字列から選ぶかの選択ができるということです。これは便利な機能です。
 
 基本的に考えてみると、このマクロの目的は、いかに早く文字を打てるか、ということになると思います。そう考えると、一番の方法は、キータッチの能力を上げることということになります。
 試してみると、四文字程度の文字列の場合はメリットがありますが、2文字程度のものは直接打ってしまった方が速いと思います。
 マクロの起動、置き換えたい場所への移動、文字列一覧からの選択という操作が必要となりますので、意外と時間がかかり、何でもかんでもこの方法でやるというのは、メリットはそれほど大きくなく、かえって時間がかかるということではないかと思います。
 選択した文字列をファイル化するというのは、ハイパーコピデルでやったことなのでこの機能は省略します。
 
 今回のマクロのポイントは、
 1.文字列の初めと終わりを何で判断するのか
 2.一度にどのくらいの文字列数を取得するのか
 3.文字列の取得の方向(上に向かって取得するのか、下に向かって取得するのか)
 4.取得する文字列の字数の条件(何文字以上とか)
 5.同一文字列の取得を避ける
 6.選択文字列(別に保管される)の重複を避ける
 
 1.文字列の初めと終わりを何で判断するのか
 一行単位でテキスト取得し、一文字ずつ調べていきます。
 普通は、初めて漢字が出てきた場合が始まりで、漢字以外のものになった時に終了と考えます。
 しかしながら、
 輸入・輸出
 ヴィンセント・ヴァン・ゴッホ
 平成20年度
 神聖ローマ帝国
 テキスト取得
 2009年
 ルイ16世
 2007
 上記の例では、どのような文字列を取得しますか。
 "輸入"と"輸出"の二つ
 "ヴィンセント・ヴァン・ゴッホ"の一つ
 "平成20年度"の一つ
 "神聖ローマ帝国"の一つ
 "テキスト取得"の一つ
 "2009年"の一つ
 "ルイ16世"の一つ
 "2007"だけでは取得しない
 とするのが普通でしょうか。
 
 初めの判断は、初めて漢字がでてきた場合、または、初めてカタカナが出てきた場合、または、初めて数字が出てきた場合となります。
 終わりの判断は漢字系とカタカナ系で違います。
 特殊記号の取り扱いですが、漢字で始まった場合は、特殊記号(この例では"・")が出てきたら、それは終わりと判断します。カタカナで始まった場合は、まだ継続すると判断します。特殊記号には「」、句読点、・、カッコ、+-*/、小数点、等号などがありますので、それぞれでとあり扱いを区分することが必要です。
 漢字で始まった場合は、特殊記号が出てきたら、終了。カタカナで始まった場合は、ある特殊記号が出てきても継続とするという感じでしょうか。
 
 2.一度にどのくらいの文字列数を取得するのか
 最初は、40個の文字列を取得して、それ以上のものは、再取得機能を付けて、取得するということにしていましたが、長い文章だと、かなり前にあるものは何回も再取得をしなければならなく、面倒になったので、1回限りの800個としました。
 また、同様に保管する文字列の個数も800個としました。800個を越えた場合は、一番古いものをなくしていきます。
 
 3.文字列の取得の方向
 上方向、下方向を切り替えることができるという機能を付けるというのも考えられますが、上方向だけでいいのではないでしょうか。

 4.取得する文字列の字数の条件(何文字以上とか)
 二文字以上としました。これはマクロの中をちょっと変えることで、三文字以上でも、四文字以上でも可能になります。
 
 5.同一文字列の取得を避ける
 この機能は、当然必要でしょうね。
 
 6.選択文字列(別に保管される)の重複を避ける
 この機能は、当然必要でしょうね。
 
 
 

2010年11月6日土曜日

第159回目 範囲に名前を付ける。その名前を使った処理のメリット及び課題

○第159回目 範囲に名前を付ける。その名前を使った処理のメリット及び課題

 第157回目で紹介した機能
 1.指定した範囲を、指定したセルに名前として書き込む
 2.名前のあるセルを指定して、その範囲を選択する。
 3.名前がつけられた範囲を全部表示させて、その中から必要な場所に飛ぶ。

メリット
 範囲印刷が簡単にできます。列行を挿入等しても、範囲は自動的に変わってくれます。
 指定範囲が簡単に選択できます。その後のコピーなどの処理につながります。
 名前の付いた場所を、範囲選択することができるので、場所の移動ができます。
 
課題
・選択した範囲を修正できないか。
 印刷範囲を修正したいという場合があります。また、印刷以外の処理では、処理範囲が異なる場合が考えられます。
 例えば、印刷ではタイトルは必要だが、罫線を設定する場合は、タイトル部分は不要で表部分のみでよいということがあります。この場合、二つの範囲に別々の名をつけるという対応方法も考えられますが…=⇒数が多くなるのは覚えるのが大変です。

 タイトル部分だけではなく、終わりの部分(例えば、欄外の注など)も除外することもあります。
 そこで、終わりの部分はShiftを押しながらカーソルで変えられようにします。

 範囲の修正
 0.名前がはいっているセルにカーソルをおいて実行
 1.該当範囲を選択し、選択座標情報を取得する。
 2.範囲の修正1 1-0とか、除外列・行数を指定する。その範囲を指定して終了。
 3.範囲の修正2 カーソルを動かしてその範囲を修正し、終了。
 
 2.です。
 選択範囲座標の情報から、入力した除外列行数の値を元に、修正します。列は最終的には列番号で考えます。
 除外列行数を分解しそれぞれの数値を取得します。
 それらによって、新しい範囲の列番号-行番号が求められます。列番号から列記号に変換して新しい範囲を指定します。
 
 3.です。
 選択範囲の座標を初期値として、座標を入力できるapplication.inputboxを出します。
 カーソルを動かして新しい範囲を指定します。
 Shiftを押しながら指定すれば、末尾が変わります。
 Shiftを押さなければ、最初の場所からの指定になります。この場合は、指定したい先頭位置を指定した後に、Shiftを押しながら末尾を指定することになります。
 指定が終わったら、Enterキーを押して新しい範囲を指定します。
 
 プラスとして、先頭のセルを指定して、列行数を指定することによって、指定範囲を決める、さらにカーソルでの調整ができる、というマクロも考えられます。
 これは、上の、2.範囲の修正1、3.範囲の修正2の利用で簡単にできます。

2010年11月3日水曜日

第158回目 壁カレのデータがダブってしまった

○第158回目 壁カレのデータがダブってしまった

□壁カレでなんですか?

 これから入っていきましょう。
 壁カレのヘルプから
 壁カレ3 使用説明
 このソフトウエアは壁掛けカレンダーをイメージしたフリーのカレンダースケジューラです。
 最大12ヶ月のカレンダーを表示し、様々な情報を、カレンダー内に表示します。
 単なるカレンダーとしても、LANで予定を参照することも出来ます。
 つまり、予定、記録などを書き込めるカレンダーソフトです。
 
□何が問題だったのですか?
 過去のデータ(6年前)を見たくなったので、現在の壁カレにデータを読み込みました。その分だけであれば問題はなかったのですが、元に戻すのがめんどくさかったので、現在のものに付加するという操作をしました。
 すると、当然のことながら、ある期間のデータがダブってしまいました。
 その当時の月間レポートを打ち出すと、同じ予定、記録がダブっていたということです。
 (このときの目的は、6ヶ月間ほどの月間レポートをつくり、その中からある業務に関連するものだけを抜き出そうとすることでした。)
 壁カレの元データから削除する必要があるので、元データを出力してそれを削除する必要が出てきました。
 
□どのようにして削除したのですか?
 1件1件手作業で削除していったのですが、さすがにばかばかしくなってしまいました。
 
□これは、月間レポートを出した後のことになると思いますが、関係ない業務のものも手作業で削除したのですか?
 これある程度、自動化しました。置換え機能で、完全に関係ない文字列を指定して、その文字列を含んでいる行を削除したのでした。これはワイルドカードでやれば簡単ですね。(*○○××*をヌルに置き換えるようにすれば、その行は改行のみになってしまいますね)
 
□本題のものはどうしたのですか?
 QXマクロで専用のマクロを作りました。今までのものから使えそうなマクロをベースにして、30分ほどでできました。
 処理の流れのです。
 0.処理したい先頭にカーソルを置いて実行
 1.1行を取得し、頭の28文字分の文字列をもとに、以下の文の中で同一文字列があるかどうかを検索する。
 2.同一文字列があった行については、行そのものを削除する。文末まで繰り返す。
 3.先頭に戻り、先頭の次の行から1-2を繰り返す。
 4.文末まで処理を繰り返す。
 
□マクロ作成はスムーズに行ったのですか?
 スムーズにいったのですが、当然ながらバグがありました。
 途中に、カラ行に近い行(先頭に○だけがある行など)があって、そこで取得した文字列をもつ行を片っ端から削除してしまいました。(記録は、先頭に○を付して書いていくという形式になっているので、以下の記録がほとんど全部削除されてしまいました)
 これの解明には、さらに20分ほどかかりました。
 
□どういう対応したのですか?
 取得した文字列が5文字以下のものは、削除の元となる文字列の対象外としました。
 昔のデータを追加した壁カレのデータは、7000行以上もあったので、途中でこんなものもあったのでしょうね。頭が働きませんでした。
 
□マクロの正味の行数としてはどのくらいになったのですか?
 コメント行を含めて40行あたりです。
 
□今回のマクロのニーズ度はどうかは知りませんが、こんなに簡単にできるといいですね。
 そのとおりだと思います。今回は、マクロに切り替えるまでに時間があったので、メリットとしてはどうかとは思いますが、まずマクロのほうが早いのでは、と思うことは必要ですな。