« 2009年3月 | トップページ | 2009年5月 »

2009年4月の5件の記事

2009年4月25日 (土)

【改良】キーワードが掲載されたページを取得する

以前、「キーワードが掲載されたページを取得するマクロ」を紹介いたしました。

今回は、ご要望をいただいた中で一番多かった「取得ページをテキストで書き出してほしい」という点で改良してみました。

使い方は、前回のマクロと同じですが、結果の表示方法を変えました。また、プログラムの構造もシンプルに変えました。

あと、今回もrangeオブジェクトで作ってあります。

「pagesearch2.dot」をダウンロード

●使い方
ダウンロードしたマクロをスタートアップフォルダに保存してください。(保存方法は、こちら

表示されるボタンと機能は前回のマクロと同じです。

●改良点

Pagesearch20
・キーワードと記載ページ番号を別ファイルに表示(一覧表にします)
・重複するページ番号を削除

●表の書き方
940行以降に記載しました。
とりあえずマクロの記録でコードを書き出してみて、必要と思われるところだけを使いました。

このコードだと、表の罫線は無色になります。印刷されません。

その後、表のセルに項目名と取得情報を入力しています。

940       ActiveDocument.Tables.Add _
              Range:=Selection.Range, _
              NumRows:=Cnt + 1, NumColumns:=2
950       ActiveDocument.Tables(1).Cell(1, 1).Range.Text = "キーワード"
960       ActiveDocument.Tables(1).Cell(1, 2).Range.Text = "ページ番号"
             
          '取得情報の入力
970       For i = 1 To Cnt
980           ActiveDocument.Tables(1).Cell(i + 1, 1).Range.Text = patNum(i)
990           ActiveDocument.Tables(1).Cell(i + 1, 2).Range.Text = pageNum(i)
1000      Next i

●重複ページ番号の削除
200行から800行です。このコードは美しいですね。

自分で考えたのではありません。以前紹介したニュースグループに投稿して、回答をいただいたものをアレンジしてみました。

回答をいただいたページはこちら。あっという間に、プロの方からの回答が得られるので、ありがたいですね。みんなで活用しましょう。

ここで回答してくれる方は、自分の本名や所属する会社名を出されている方がいます。それだけに信憑性が高い気がします。

●工夫
前回のプログラムから大幅刷新しました。

ワイルドカードを使用する場合と通常の検索の場合とで、同じプログラムを利用します。

wildというフラグを立てて、判定するようにしました。(340行~380行)

●キーワード
Left$ 文字列から不要項目を削除するときに使っています。(710行)
ActiveDocument.Tables.Add 表作成

| | コメント (0) | トラックバック (0)

2009年4月18日 (土)

selectionオブジェクトをrangeオブジェクトに書き換える

最近は、rangeオブジェクトを使うようにしています。

rangeオブジェクトの利点を少しずつ理解してきました。

先週紹介したマクロでは、selectionを使わなかったために、選択した範囲をmySuperRangeとmyRangeとの二つの変数に保持することができました。

意図的にプログラムを書いたわけではなくて、知らずに使っていた結果として、上記のような機能をうまく使っていました。

通常、selectionを使うときには、「選択される文字列はカーソルの動きに影響される」と理解するとイメージしやすくなると思います。

例えば、「2009年4月18日」という文字列が文中に示されていて、「2009年」を選択したあとに、カーソルを別の場所に移動させると、「2009年」の選択は解除されます。

selectionオブジェクトで文字列を選択すると、同様のことがおこります。

つまり、選択範囲は常にカーソルと連動しますので、次の文字列を選択すると、前回選択したものは保持されません。

さて、今日は、上記のようなselectionでの検索とrangeでの検索の違いを少し体験できるプログラムを書いてみました。

まだ、学んでいる途中ですので理解不足もありますが、ひとまず自分が理解している範囲で説明したいと思います。

●プログラム概要
同じ動作をするマクロを4つの表現で書いてみました。

<作用>
「任意の全角数字一桁以上の文字列」+「年」の組み合わせを検索して、検索結果を表示させます。

例文として「2009年4月18日」と文章中に書いてください。

プログラムを実行すると、検索結果として「2009年」とメッセージボックスに表示されます。

<プログラム種類>
プログラム1:マクロの記録をもとにselectionを用いて書いたもの
プログラム2:プログラム1をrangeで書き換えたもの
プログラム3:プログラム2を簡潔に書き直したもの
プログラム4:プログラム3を別表現に書き直したもの

●プログラム1

Sub selection_test_1()

10    Selection.Find.ClearFormatting
20    With Selection.Find
30        .Text = "([0-9]{1,})年"
40        .Replacement.Text = ""
50        .Forward = True
60        .Wrap = wdFindContinue
70        .Format = False
80        .MatchCase = False
90        .MatchWholeWord = False
100       .MatchByte = False
110       .MatchAllWordForms = False
120       .MatchSoundsLike = False
130       .MatchFuzzy = False
140       .MatchWildcards = True
150   End With
160   Selection.Find.Execute

170   MSGBOX Selection

End Sub

10~160行で、検索して、170行で結果表示をしています。

検索するコードは、マクロの記録機能を使いました。

これを、rangeオブジェクトに書き換えます。

書き換えるコツは、こちらのページの5件目のコメントをご覧ください。

●プログラム2

Sub selection_test_2()

      Dim myRange As Range

10    Set myRange = Selection.Range

20    With myRange.Find
30        .Text = "([0-9]{1,})年"
40        .Replacement.Text = ""
50        .Forward = True
60        .Wrap = wdFindContinue
70        .Format = False
80        .MatchCase = False
90        .MatchWholeWord = False
100       .MatchByte = False
110       .MatchAllWordForms = False
120       .MatchSoundsLike = False
130       .MatchFuzzy = False
140       .MatchWildcards = True
150   End With

160   myRange.Find.Execute

170   MSGBOX myRange

180   Set myRange = Nothing

End Sub

とりあえず、rangeオブジェクトに書き換えました。

単純に、selectionをselection.rangeとしただけです。

また、rangeで検索する場合には、検索窓の設定と連動しないこともメリットのひとつです。

通常、selectionでマクロを書くと、マクロで使った検索文字列や書式の設定が、手動で検索をする場合の「検索と置換」画面の設定に反映されてしまいます。

または、前回手動で「検索と置換」画面で設定した検索条件が、マクロを実行するときに反映されてしまいます。

よって、selectionでマクロを書く場合には、前回の検索と置換の条件を一旦初期化(クリア)する必要があるわけです。

しかし、rangeオブジェクトの場合には、「検索と置換」のフォーマットの初期化の必要がありません。

よって、1番目のプログラムの10行目のに記載されている「検索フォーマットの初期化」のコード 

10    Selection.Find.ClearFormatting

を削除しました。

実行すると分かりますが、カーソルは移動せず、かつ、見つけた文字列を選択していないのですが、検索結果が表示されます。

(文書中に対応する文字列がない場合には、メッセージボックスは空欄になります)

180行のmyRangeを解除する方法は、他のプログラムを見たら書いてあったので、自分もそれをまねしています。

●プログラム3

Sub selection_test_3()

      Dim myRange As Range

10    Set myRange = Selection.Range

20    With myRange.Find
30        .Text = "([0-9]{1,})年"
40        .Forward = True
50        .Wrap = wdFindContinue
60        .MatchWildcards = True
70    End With

80    myRange.Find.Execute

90    MSGBOX myRange

100   Set myRange = Nothing

End Sub

必要と思われる要素だけに削りました。

selectionの場合にも、マクロの記録で作成したコードから、必要なものだけを記載してプログラムをスリム化することができます。

この場合のスリム化の方法は別の機会に書きます。今回は、rangeのスリム化だけ説明します。

rangeでのスリム化のポイントは、今回はワイルドカード検索なので、その旨を指示しています(60行)。

あと、全文検索にして(50行)、カーソルの移動方向を下向き(40行)にしています。

●プログラム4

Sub selection_test_4()

      Dim myRange As Range

10    Set myRange = Selection.Range

20    With myRange.Find
30        .Execute _
           findtext:="([0-9]{1,})年", _
           MatchWildcards:=True, _
           Wrap:=wdFindContinue, _
           Forward:=True
40    End With

50    MSGBOX myRange

60    Set myRange = Nothing

End Sub

書き方の参考例です。

プログラム3の20行から70行の内容を、プログラム4では、20行から40行にまとめてあります。

同じ検索の条件を別の書き方にする一例です。

「Microsoft Visual Basicのヘルプ」(VBEでF1ボタンを押すと表示)やニューズグループの例文を見て学びました。

自然言語(英語や日本語)には、同じ意味を伝える文章であっても、わかりやすいものとわかりにくいものがあります。

プログラム言語にもわかりやすい、わかりにくい、があると思います。

当然、読み手の知識量にもよりますが。。。まだ私には読めないプログラム文がたくさんあります。

今回の例ではわかりやすさはあまりかわらないかもしれませんが、冗長か簡潔かという点での違いでしょうか。

あと、書く際に、手間が省けますね。

プログラムが複雑になると処理速度にもかかわることみたいですが、上記の程度であれば、気にする必要はないですね。

| | コメント (0) | トラックバック (0)

2009年4月12日 (日)

上付き数字に変換マクロ

Superscript 左図のように、数式や単位で出てくる10^-15やcm^3を上付きの数字にします。

「scriptchange.dot」をダウンロード

●作用および使用事例
"^"(ハットマーク)の直後に記載されている半角の数字および"-"(マイナス記号)を、上付きの数字に変換します。

たとえば、翻訳ソフトで英文を作成した場合に、英文テキストに書式情報を追加できないことがあります。

具体的には、「The翻訳」という機械翻訳ソフトの中では、生成された英文に下線をひいたり、上付き文字に変換したりすることができません。

よって、「The翻訳」で英文を作成する場合には、上付き文字部分に”^”などの記号を残しておき、ワードファイルにテキストをコピーしてから、一括で上付き文字に変換します。

●使い方
1.マクロをインストール(方法はこちら)をすると、 ツールバーに以下のようなボタンが表示されます。Superscript2

2.上付きにしたい数字の直前に"^"(ハットマーク)を記入した文書を用意します。

Superscript3

3.[上付]ボタンをクリック

4.結果が表示されます。

Superscript4

上付きに変換された文字は黄色に着色されます。

また、ハットマークの直後に半角数字か半角マイナス記号がない場合(図では半角スペースがある場合)には、ハットマークが青色に着色されています。

5.[蛍光色削除]ボタンをクリックすると、蛍光色が削除されます。
このときに削除されるのは、以下のいずれかの条件を満たす文字列だけです。

よって、文中に別の用途でつけた蛍光色は残ります。

(条件1)蛍光着色され、かつ上付きの半角数字および半角マイナス記号

(条件2)蛍光着色された半角ハットマーク

●プログラムの考え方
以下の手順で、プログラムを組みました。

①半角のハットマークを探す

②上記①の判定がYESの場合、ハットマークの直後に半角数字もしくは半角マイナス記号があるかを判定

③上記②の判定がYESの場合、(1)ハットマークを削除して、(2)ハットマーク直後の一連の半角数字および半角マイナス記号(例えば、”-15”など)を蛍光黄色の上付き文字にする

④上記②の判定がNOの場合、上記①で見つけたハットマークを蛍光青色に着色する(数字を伴わない単独のハットマークとしてあとで確認するため)

●工夫
1.確認用に着色
上記の③と④にて着色処理を入れたので、処理した場所を確認できます。また、この着色は一括して削除できます。

2.カーソル移動を減らしました!
rangeオブジェクトを使用しました。mySuperRangeで、ハットマークを検索し、myRangeで半角数字を検索しています。よって、ハットマークの削除や着色、または半角数字の上付き処理など、カーソルを移動せずにできるようになりました。

●rangeオブジェクトについて
今回のマクロでは、あえてrangeオブジェクトを使用しましたが、selectionオブジェクトを使っても同様のことができます。

rangeオブジェクトを使ったからといって、この程度のプログラムでは体感速度が上がるわけではありません。

今は、自分の練習のためにrangeオブジェクトを使っています。

rangeオブジェクトを使ってプログラムを短くすることができるみたいなので、いろいろと試しているわけです。

マクロのプログラマの方の中には、rangeを覚えることが大切、とおっしゃっている方もいますが、まだ、私にはその違いを体感するほどのプログラミングができていません。

私たちのような初心者は、まず、selectionオブジェクトに慣れることが大切だと思います。

selectionオブジェクトなら、カーソルの動きが見えるので、デバッグがやりやすいですね。

また、検索・置換の画面と連動し、かつマクロの記録と連動するので、独学もやりやすいと思います。

| | コメント (0) | トラックバック (0)

2009年4月11日 (土)

MZ-Tools(マクロ作成用のフリーウェア)の紹介

これは便利です。

http://www.mztools.com/v3/mztools3.aspx

MZ-Toolsというフリーウェアですが、VBE(マクロのエディタソフト)での編集作業が簡単になるようないろんな仕組みがあります。

例えば、私がよく使うのは、エラー時の対応文 (On Error Goto というコードですね。)の自動作成と行番号の自動入力です。

これだけでも、うれしいです。

そのほかにも、定型句を登録しておいて簡単に入力することができたり、ヘッダーに署名を入れたりとあります。

メッセージ画面の簡易作成機能(MsgBox Assistant)は逸品です。文字化けするときもありますが、それも無視できるくらい、うれしさが大きいです。

ものすごく大きな事をしてくれるわけではないのですが、かゆいところに手が届く感じがすごく美しいですね。

自動で生成されるコードもシンプルで好きです。

あと、Review Source Codeという機能は、プログラム中で使われていない変数を表示してくれます。

私のように、コピペで使いまわすといらない変数が定義されていたりしますので、きれいに書き直すことができます。

一般的には、変数を無駄に定義すると、メモリを余分に使ってしまうのでよくないのですが、私のプログラム程度なら、あんまり問題ないと思われます。

なお、このソフトの名称のMZは、アニメのマジンガーゼットからつけられたようです(こちらに記載あり)。

| | コメント (0) | トラックバック (0)

2009年4月 4日 (土)

墨付き括弧内の数字を連番にするマクロ

【】(墨付き括弧)内の数字を連番にふりなおすマクロです。「renban.dot」をダウンロード

日本の特許出願では、定型の書式がありますね。

例えば、段落番号を【0001】などのように墨付きカッコ内に全角数字4桁にして記載するとか。

中間処理の段階でも【手続補正1】などのように、項目ごとに墨付き括弧で囲います。

今回は、墨付き括弧でくくられた名称の番号を連続番号に書き換えるマクロを紹介します。

●使い方
テンプレートをスタートアップフォルダもしくはテンプレートフォルダに保存します。(登録方法はこちら

Renban 左のような「【番号】」のボタンがツールバーに表示されます。

このボタンをクリックしてマクロを起動すると、インプットボックスが表示されますので、検索するキーワードを入力します。

Renban2 たとえば、【特許文献1】、【特許文献2】、、、と連番を振りたいときには、2を選択してください。

●作用
文書中(明細書中)に、

【特許文献1】特開2000-12345号公報
【特許文献2】特開平12-12345号公報
【特許文献3】特開2006-12345号公報

などのように、同じカテゴリーの墨付き括弧で複数の項目を記載する場合があります。

このときに、途中で【特許文献1】の次に、別の特許文献を記載する場合、以下のように番号を振りなおす必要があり手間です。

【特許文献1】特開2000-12345号公報
【特許文献2】特開2005-12345号公報
【特許文献】特開平12-12345号公報
【特許文献】特開2006-12345号公報

このマクロは、このようなときに、たとえば、

【特許文献1】特開2000-12345号公報
【特許文献@】特開2005-12345号公報
【特許文献2】特開平12-12345号公報
【特許文献】特開2006-12345号公報

といれたとしても、マクロを実行すれば、以下のように番号が続き番号に変更されます。(変更された部分を強調するために着色しましたが、実際には色は変わりません)

【特許文献1】特開2000-12345号公報
【特許文献】特開2005-12345号公報
【特許文献】特開平12-12345号公報
【特許文献】特開2006-12345号公報

なお、上記では、「」を仮の番号として入れましたが、「@」以外に全角数字であれば何を入力してもかまいません。

●工夫
①【手続補正1】、【非特許文献1】、、、など、さまざまな場面で、連番の必要がでてきますので、どのようなものにも対応できるように、inputboxを使ってみました。(プログラムでは、10~170行に対応)

inputboxで項目を選択するのは、かつてこちらに記載しましたので、そのまま例文を利用しています。

②初めて、rangeを使った検索・置換プログラムを作成してみました。

最近なんとなく例文をみながら試しています。まだ、よくわかっていないところもあり理解はあいまいですが、とりあえず動くものを作りました。

誤動作があった場合にはご連絡ください。

③プログラムの実行前・実行後でカーソル位置が変わらないようになっています。(180,190,470,480行)

④全角文字の入力方法を試してみました。(390、400行)

●キーワード
StrConv(Num, vbWide)
Set myRange = Selection.Range
Select Case
InputBox

| | コメント (0) | トラックバック (0)

« 2009年3月 | トップページ | 2009年5月 »