« 2009年4月 | トップページ | 2009年6月 »

2009年5月の11件の記事

2009年5月31日 (日)

文書の最終段落の文字数の取得

文書中の最終段落に記載されている文字数を取得するマクロです。「wordcount_lastparagraph.dot」をダウンロード

●作用
・英文で実行すると、最終段落の半角英数字の単語数を取得します。

・日本語で実行すると、最終段落の日本語の文字数(句読点も一文字分)を取得します。

・日本語と英語が混ざっている場合には、「半角英数字の単語数」+「日本語の文字数」を取得します。

●想定している用途
英文明細書を作成時、文書の最終段落に記載する要約文(Abstract)の文字数を取得するのに便利です。

●使い方
1.インストール
こちらをご覧ください。

2.対象の文書を開き、Wordcount ボタンをクリック

Word Countということで、WCです。

3.結果を表示します。

Wordcount2

●工夫
・文字が入力されていない段落(改行マークだけ、もしくはスペースと改行マークだけ)は最終段落と特定しません。文字が入力されている段落を文書の末尾から探します。(60~100行)

・文字が入力されていない文書の場合にはエラーメッセージが出ます。(160~180行)

●文字数の取得について

単語数の取得(ツール>文字カウントに対応)するコードが50行目に記載されています。
WordCount = myRange.ComputeStatistics(wdStatisticWords)

最初は以下のコードを使ったのですが、おかしな値を取得してしまいました。
WordCount = myRange.Words.Count 

ニュースグループでword countというキーワードで検索したら、同じ疑問を持っている人がいて、まさしくほしかったコードが記載されていました。解説はこちら

●最終段落の特定について

カーソルを移動せずに処理を行うことを目的としたRangeオブジェクトを用いています。

paraCount = ActiveDocument.Paragraphs.Count
Set myRange = ActiveDocument.Paragraphs(paraCount).Range

今回のマクロでは、特定の文字列を探さずに最終段落を特定することができるので、汎用性が高まりました。

20~110行が最終段落を特定するためのコードです。

●最終段落の特定について(従来の方法:参考)

このマクロは、もともと英文明細書の要約文の語数を数えるために作成したものです。(このときは、ほしい結果が得られなかったため、途中で作成を断念しました。)

英文の出願用明細書では、最後のページに要約(Abstract)を記載します。具体的には、abstract というタイトルの次の段落に要約文を記載します。

なので、文書中の”abstract”のキーワードを探して、その言葉の次の段落から文書の末尾までを、最終段落として選択するプログラムを用いていました。

この場合、”abstract”は、明細書中に1語しかないという前提でしたし、また、要約文が文書の一番最後にあり、それ以降は不要な文字列(メモ)などが残っていない、という前提でした。

こういう前提を知っている自分しか使えないプログラムですね。

まだ、Rangeも知らず、かつ文書中の段落の指定の方法も知らないころでした。

マクロの自動記録を使って、以下のようなコードを利用して、最終段落の特定をしていました。

    Selection.Find.ClearFormatting
    With Selection.Find
        .Text = "abstract"
        .Replacement.Text = ""
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchByte = False
        .MatchAllWordForms = False
        .MatchSoundsLike = False
        .MatchWildcards = False
        .MatchFuzzy = True
    End With
    Selection.Find.Execute
    Selection.MoveDown Unit:=wdLine, Count:=1
    Selection.EndKey Unit:=wdStory, Extend:=wdExtend

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

2009年5月30日 (土)

小飼弾の「仕組み」進化論

「カリスマプログラマー・アルファブロガーが教える、仕事の”本質に迫る”思考法」という帯の文句にひかれて本書を手にしました。

仕事の仕組みを作る場合の心構えの例として、プログラマーの三大美徳「怠慢」、「短気」、「傲慢」の紹介があります。(P51~P71)

これは、プログラムを書く時の心構えを上手に表していると思います。

「自分でやらない。できるかぎり自動化する」「仕組みはつかってなんぼ」「同じ仕事は繰り返さない」「仕組みのメンテナンスを容易にする」など、心にとめておくと無駄なプログラミングをしなくてもよくなるこつも書かれています。

自分が漠然とたどってきた考え方や、自分が今後成長していきたい方向性がこの本に書かれていると思います。

基本は仕事本なので、当然、プログラミング以外のことが多く書かれています。

それらの中にも、共感できるエッセンスがたくさんありました。

仕組みを上手につくると、時間が短縮できますが、著者は以下のように述べています。

「重要なのは、こうして作り出した時間・余暇を、既存の仕組みを回すために使ってはいけないということです。今までは1日がかりで1000個の製品を作っていたのが、仕組みを改良することで5分の1の時間で1000個作れるようになったとしましょう。だからといって、ここで1日5000個作ろうとしてはいけません。できた80%の余裕は、会社でも個人でも新しい仕組み作りに投資して、未来に備えるべきなのです。」(引用:P25~P26)

こういう考え方好きです。

この本の冒頭に書かれた上記考えを発展させたものがPart6「仕組みの未来」(P200~)に記載されていますが、仕事の枠をこえて社会のあり方みたいな視点になっていて興味深いです。

今まで、Hacks系の仕事本や「仕組み」の仕事本は好きなのでいろいろと読んできました。

これらと比較すると、この小飼弾氏の本書は、具体的なテクニックというよりは思想を重視して書かれているように思います。タイトルは「進化」でしたね。

よって、抽象度が高い分、応用範囲がひろくてためになるなと思いました。

おすすめの一冊です。

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

2009年5月24日 (日)

【解説】フォルダ中のすべてのワードファイルの内容をコピペする

昨日紹介したマクロを作成したときに、いくつか学びがありましたので、メモしておきます。

●文書の内容をコピーする指示

With Documents.Open(FileName:=●, Visible:=False)
       .Content.Copy
       .Close
End With

こんなものが230行から260行にかけて記載されています。

contentというプロパティは、documentオブジェクトのプロパティであって、その文書の内容を示すものです。

rangeにも書き換えられます。処理スピードは同じなんでしょうか?

書き換えて実験してみましたが、違いはわかりませんでした。

上の例では、Documents.Open がファイル名(上の例では●)により特定されて開かれたDocumentオブジェクトを示すので、その後にcontentと記載できるみたい。

Contentを知らなかったときには、以下のようにしていました。

マクロの記録機能で、記録ができます。

Selection.WholeStory ’すべてを選択
Selection.Copy ’選択範囲のコピー

スピード変わるんでしょうか?実験してみましたが、少しの文書を開いたりするのなら、体感速度は変わりませんでした。

すくなくとも、プログラム文が短くなるのですっきりすることは確かですね。

●文字列の入力箇所を文頭(文末)にする指示

270行に以下のような指示があります。(説明用に少し変えてあります)

Activedocument..Range(Activedocument.Range.End - 1, Activedocument.Range.End - 1).Text = ”入力する文字列”

これは、文書の最後の文字から1つめに”入力する文字列”と入力するための指示です。

Range(開始位置, 終了位置)を入力して、対象となる範囲の開始と終了位置の特定ができます。

上記の位置というのは、数値です。文頭から数えて何文字目か?に対応します。

Activedocument.Range.End で、この文書の最終文字の位置を取得できます。

文書全体の最後には、必ず改行マークが入っているので、それをのぞいたものが、実際の文書の最後のカーソル位置ですね。

だから、Activedocument.Range.End - 1のように、なっているわけです。

開始位置と終了位置をともに同じ値にすれば、その特定された範囲とは、何も選択されていない1点(位置)になります。

ちなみに、文頭に文字列を入力するときには、「開始位置も終了位置もゼロ文字目に文字を入力する」という意味で、以下のようにかけます。

Activedocument..Range(0, 0).Text = ”入力する文字列”

これがわかると、文字列を入力する際に、カーソル位置を移動する必要がなくなります。

今までは、マクロの記録機能で取得した以下のコードを使っていましたが、今後は不要になりそうです。

カーソルの移動が減ると、処理スピードが上がるそうなので、楽しみです。

文頭に文字列を入力: 
Selection.HomeKey Unit:=wdStory
Selection.TypeText Text:="入力する文字列"

文末に文字列を入力:
Selection.EndKey Unit:=wdStory
Selection.TypeText Text:="入力する文字列"

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

2009年5月23日 (土)

フォルダ中のすべてのワードファイルの内容をコピペする

練習として作ったマクロです。用途は考えていませんが、使えるアイディアがあったら教えてください。

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

●使い方

1.マクロを登録します。登録方法は、こちらをご参照ください。

2.[コピペ]ボタンがツールバーに表示されますので、クリックします。

3.インプットボックスが表示されるので、ファイルを探す対象のフォルダのパスを入力します。

例: C:\Documents and Settings\●●●\My Documents

4.OKをクリックすると、開かれているファイルの文末に、指定したフォルダ内のワードファイルの内容をすべてコピペします。

●作用
・ファイル名を入力、改行を入力、ファイル内容を入力しています。

・ファイル同士の区切りに、「改ページ」を入れています。

●つくった経緯
最近知った以下のコードを使いたくなりました。

With Documents.Open(FileName:=varTMP(i), Visible:=False)
      .Content.Copy
      .Close
End With

テンプレートに記載されたマクロの230行から260行に書かれているのですが、「ファイルを開いて内容をコピーするときに、開いたファイルを見せないようにする」指示がされています。

このコードを見つけた理由ですが、ファイルを開かずにファイルの内容をコピーする方法がないか探しました。

エクセルの場合には、ファイルを開かずにファイルの内容をコピーすることができると思います(うろ覚えですが)。

ここで紹介した「Excel VBA できる大辞典」をぱらぱらとみていたときに出ていたように思います(手元にないので、確認できません)。

ワードでも、同様の機能がないか、例のニュースグループで検索しました。

検索キーワードは、"without opening" と paste です。

結果、このページにたどり着きました。

結論からいうと、「内容をコピーするためにはファイルを開かなければいけないが、ファイルを開く動作を見えないようにすることはできる。」でした。

そして入手したのが、上に書いてあるコードです。

●工夫
フォルダ内のファイルパスを取得するコードは、こちらで使ったものを流用しました。

ファイル名も以下のコードで取得します(160行)。
ファイル名 = Mid(ファイルパス, InStrRev(ファイルパス, "\") + 1)

必要な変数の数を、Redimをつかって再定義しています。
120           ReDim varTMP(1 To FC) As Variant
130           ReDim varNam(1 To FC) As String

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

2009年5月17日 (日)

テンプレートを開く(2)

先日、テンプレートファイル自体を開くプログラム文を掲載しました。

その後、あんなに難しく書かなくてもいいのではないかな?と思えてきて、以下のプログラムを試したら、うまくいきました。

先日このブログにコメントをしていただいた方から教えていただいた、Fullnameを使ってみました。

Sub テンプレートを開く2()

Dim FilePath As String

FilePath = ThisDocument.FullName

Documents.Open FileName:=FilePath

End Sub

簡単ですね。こっちのほうがいいと思います。

今回の発想のポイント

「Documents.Open」というコードだけでもいけるんじゃないのか?という思いつきがありました。

Openって書いてあるし、そのまま開いてくれそうな気がしました。

で、FileName:=の記載にファイルのパスも書き込んでしまえば、前回使った「ChangeFileOpenDirectory」というコードは不要ではないのか?と思ったわけです。

試したらうまくいきました。

最近は過去に作ったマクロをブラッシュアップすることを始めたので、上記のような視点でコードを眺めるようになりました。

selectionオブジェクトをrangeオブジェクトに変えることは、みなさんご存知のとおり、私がよくやっていることです。

他にも、過去のプログラム中の不要なループや分岐を削除したり書き直したりしています。

マクロの記録で調べたコードには、不要な記述が多いので、そういうものも積極的に削除しています。

こういう手直しは、自分の進歩を実感できる部分であり楽しめます。

また、プログラムがブラッシュアップされると、処理速度や処理精度もあがるので一石二鳥ですね。

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

2009年5月15日 (金)

実施例の表示統一マクロ

実施例の表現統一のマクロです。「embodiment.dot」をダウンロード 

日本語の明細書を書いていると、なれない場合には、実施例1と書いたあとに、第2実施例、そして、実施形態3、、、、みたいに表現に揺れが出てしまうことありませんか?

最近、自分で特許明細書を書いたのですが、上記のような表現の揺れが出てしまいました。

また、日本語明細書を翻訳する時にも、上記のような言葉の揺れを見かけることがあります。

また、外国出願において、複数の基礎日本出願を併合して一つの出願とする場合も同じようなことが起こるとことがあります。

たとえば、基礎日本出願のそれぞれで、実施例の表記方法が異なるときに、上記のような表現の揺れが生じます。

今回紹介するマクロは、以下の4つの表現方法を一つの表現にまとめるマクロです(例はFirst Embodimentの場合)。

・第1実施例
・第1実施形態
・実施例1
・実施形態1

●作用
文書に記載された実施例の表現を、選択した一つの表現方法に書き換える

●使い方
こちらの手順にそって、インストールしてください。

②ツールバーに「EB」と書かれたボタンが表示されます。Emb1

③変換対象とする文書を開きます。
Emb3

④ボタンをクリックすると、表現方法の設定画面が表示されます。

Emb2 ④統一したい表現方法を選んで「変換(E)」ボタンをクリックします。

⑤変換された文字列が青文字で表示されます。

Emb4

●工夫
・変換後の文字列の色を青にしたので、変換箇所の確認ができます。

・数字は半角または全角のどちらでも置換対象となります。

・ユーザーフォームを使って、操作を簡単にしました。

・置換処理をrangeオブジェクトを用いて実行するので早いです。

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

テンプレートを開く

以前から、マイブームで、マクロテンプレートを直接開いて、キーワードを入力したりしていました。

このような用途に便利なプログラムです。

今までは、ファイル名や保存先(スタートアップフォルダ、テンプレートフォルダ)を指定していましたが、そのような必要はないんですね。

以下のコードを書けば、その開きたいテンプレートがどのような名前でも、どちらのフォルダに保存されていたとしても、開くことができます。

Sub テンプレートを開く()

Dim FilePath As String
Dim FileName As String

FilePath = ThisDocument.Path
FileName = ThisDocument.Name

ChangeFileOpenDirectory (FilePath)
Documents.Open FileName:=FileName

End Sub

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

2009年5月12日 (火)

段落番号の削除 再改訂版(rangeオブジェクト化)

さて、またしても段落番号の削除マクロの改訂です。「paraRemove_3.dot」をダウンロード 

rangeオブジェクトを用いて、さらにスピードアップ。段落番号が多いほど、その違いを体感できると思います。

2008年12月20日に公開したマクロ(作成自体は、2008年5月ごろ)に較べると、その差は歴然で、自分でもうれしい進歩です。

ここまで体験してしまうと、やっぱりrangeオブジェクトはいいんだなと思います。

selectionオブジェクトを使いこなしてきたら、ぜひrangeオブジェクトに挑戦してください。

なお、今回の改良はselectionオブジェクトをrangeオブジェクトに変えただけでなく、前回プログラムの無駄な部分も削除したりしました。

プログラム文をご覧いただくと、修正点や修正方法がわかると思います。

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

2009年5月10日 (日)

【改訂】翻訳文の比較表作成 

2010/03/06 公開していたマクロの比較に不備がございましたので、公開を控えさせていただきます。

申し訳ありませんが、修正までお待ちください。

2009/6/7にさらに改良版をアップしました。こちら

・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・

先週、翻訳文の比較表を作成するマクロを紹介しました。

今回は、このマクロの改良および改訂をいたしましたので、紹介します。

●改良点

・比較する文字列を選べるようにしたこと(使用方法参照)

●改訂点
・開始段落、終了段落の設定上のバグを除去
・比較表を作成前に「較」ボタンをクリックしたときのエラー対応

●使用方法
前回のマクロを削除してから、今回のマクロをインストールしてください。

インストールの方法はこちら

使い方は、前回のマクロと同じです。

Tablecomp21_2 「較」ボタンをクリックすると、左のような設定画面が表示されるようにしました。

この画面にて、括弧、ハイフン、英字の大文字・小文字など、比較対象としたい文字列を選ぶことができます。

また、文字数もこの設定画面で入力します。

●改定点詳細
・開始段落、終了段落の設定上のバグを除去
(日本語と英語列記のプログラムの40~290行)

先週のマクロでは、開始段落と終了段落の変数のデータ形式をvariantとしていました。

この場合、段落の数が数字として認識されません。

この結果、数値の大きさ比較を適切に行うことができませんでした。

例えば、開始段落に5を入力した後に、終了段落に10を入れた場合、終了段落が開始段落よりも小さいと誤判定されてしまいました。

今回の修正にて、開始段落と終了段落の変数のデータ形式をintegerに変更したところ、正常に判定されるようになりました。

・比較表を作成前に「較」ボタンをクリックしたときのエラー対応
(日英比較実行の最終行)

●工夫
ユーザーフォームで設定した値を引数として日英の文字列比較プログラムで利用しています。

ユーザーフォームの作り方は、こちらで紹介した「かんたんプログラミング」をご覧ください。

私が作ったものはかなり基本的なところなので、本書があれば理解できると思います。

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

2009年5月 4日 (月)

マクロのテンプレートファイルにテンプレートを切り替える

現在実行しているマクロプログラムが記載されているテンプレートに、文書のテンプレートを切り替えるためのプログラム文です。

Dim myFileName as string

myFileName = ThisDocument.Path & "\" & ThisDocument.name
ActiveDocument.AttachedTemplate = myFileName

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

2009年5月 3日 (日)

翻訳文の比較表作成

2011/03/06 公開しているテンプレートの比較方法に一部不備がございましたので、テンプレートの公開を控えさせていただきます。

修正版をお待ちください。

2009/5/10に修正版をアップしました。こちらです。

・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・

日本語明細書と英語明細書の内容を確認するためのマクロです。

win98se + word2000 および winXp + word2003にて動作確認をしました。

●作用

Tablecomp2
①段落ごとに対応表を作成します。

左に日本語明細書の内容、右に対応する英語明細書の内容を表示します。

表を作成する対象となる段落番号を設定することができます。

Tablecomp3
②段落ごとに、記載されている英数字が対応しているかどうか確認します。

左の例では、左の欄の日本語明細書中の青蛍光で表示された文字列は右の英語明細書中に記載されていません。

また、右の英語明細書中の黄蛍光で表示された文字列は左の日本語明細書の文字列と一致するものです。

●使い方
①マクロの登録

登録方法はこちら

保存先は、テンプレートフォルダでも、スタートアップフォルダでもどちらでもかまいません。

Tablecomp1 左のようなボタンがツールバーに表示されます。表示されない場合には、メニューのツール>テンプレートとアドイン(I)を開いて、アドインとして使用できるテンプレート欄の「table_comparison.dot 」というテンプレートのチェックボックスをオンにしてください。

②サンプル文を開く

サンプル文(「sample_text_JP2008-127318.doc」をダウンロード )を開きます。

ダイキン工業さんの特開2008-127318から抜粋させていただきました。化学式が多数記載されており、今回のマクロの効果の確認がしやすいと思います。

③比較表の作成

ツールバーの「表」ボタンをクリックします。

表として作成する段落番号を選びます。メッセージボックスで最初の段落と最後の段落を入力します。入力後、マクロが実行されて表が作成されます。

サンプル文は、34段落ありますので、開始段落を「1」、終了段落を「34」と入力すると、すべての段落を表にすることができます。

明細書中の一部だけを表にする場合には、対応する段落番号を入力します。

たとえば、段落10から段落15までを表にする場合には、開始段落を「10」と入力して、終了段落を「15」と入力します。

Tablecomp4 左が、作成された表の例です。段落1から段落3までの内容を示します。

サンプル文の英語明細書にて、[0001]から[0003]段落は青文字になっているため、作成された表においても英文字が青文字になっています。

また、サンプル文の日本語明細書中の【0003】段落および【0006】~【00011】段落、英文明細書中の[0028]-[0029]段落はデモとして意図的に削除してあります。

その結果、作成された表中には、段落番号が記載されるだけで、内容は空欄になっています。

サンプル文を確認するとわかりますが、英文明細書にて青文字部分の、[0001]から[0003]段落は[0009]と[0010]との間に記載されています。

このような場合でも、問題なく段落の内容を拾い出されます。

④英数字の対応の確認

ツールバーの「較」ボタンをクリックします。

メッセージがあわられて、比較する最大文字数を入力します。

具体的には、CF(CFO(CFCF(CF)O)(CFSOFのような長い文字列まるごとを比較するには、上記文字列の文字数である「33」を入力します。

大きな数を入れれば、文字列そのものを判定してくれますが、その文、比較処理に時間がかかります。

上記のように33文字の文字列がある場合でも、例えば「5」と入力してもかまいません。

この場合には、上記文字列を5文字ずつ7つに区切って、日本語と英語とで比較します。

比較結果をみながら、いろいろとお試しください。

Tablecomp5 差異があれば、その差異があった箇所の数をメッセージボックスで表示します。

Tablecomp6 左の例においては、比較する最大文字数を20文字とした場合の比較結果を示します。

英文中の化学式の記載をわざと誤入力してありますので、その部分が青文字になりました。

青蛍光:英語に存在しない文字列

黄蛍光:日本語と英語ともに存在する文字列

サンプルを実行して確認してください。

⑤蛍光色の削除

ツールバーの「較」のとなりのボタンをクリックすると、比較後の青色と黄色の蛍光色が削除されます。

●留意点

①比較対象の文書の作成方法

比較対象の日本語明細書と英語明細書とを両方とも同じファイルに記載します。作成方法は、サンプル文を参考にしてください。

比較対象の文書を作成する場合には、日本語明細書の最終段落のあとに【0000】(全角)と入力し、英語明細書の最終段落のあとに[0000](半角)と記載します。

②比較対象の文字列

.a-zA-Z0-9)( としています。

日本語明細書の全角英数字をすべて半角に処理した後、上記の文字列を探します。

化学式に対応するように、括弧()も比較対象としました。

●工夫

またしてもrangeオブジェクトを使用しました。

表は、比較対象の文書からコピペを繰り返して作成しているのですが、カーソルの移動をなくしたために、処理スピードがかなり向上し、画面のちらつきも減りました。

●メモ

①テーブルの開始行をタイトル行にして表示を中央よせにする
Doc.Tables(1).Rows(1).HeadingFormat = True
Doc.Tables(1).Rows(1).Range.ParagraphFormat.Alignment = wdAlignParagraphCenter

②選択範囲を半角文字にする
Selection.Range.CharacterWidth = wdWidthHalfWidth

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

« 2009年4月 | トップページ | 2009年6月 »