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

2009年6月の11件の記事

2009年6月28日 (日)

ワードマクロ本(これ、特におすすめです。)

ようやく見つけました。

最近数ヶ月は、この本でマクロを勉強しています。

「Learning Word Programming」です。

2009/6/28現在では、アマゾンの中古で882円で売られていますね。

僕が4月に購入したときには3500円程度したのですが。。。

同じ著者の「Writing Word Macros」もいいと思います。中古市場では、「Learning Word Programming」に比べてかなり値段が高いですが(2009/6/28現在で3206円)。

この本は、「Learning Word Programming」の改訂版であり、ワード2000までカバーしています。「Writing Word Macros」はワード97対応です。

先日、著者のSteven Roman教授に本の感想(感謝)とともにいくつか質問をして確認したのですが、ワード2002以降のバージョンへの改訂版は出版の予定がないそうです。

残念ではありますが、selection オブジェクトやrangeオブジェクトの基礎を学ぶには、個人的には「Learning Word Programming」で十分事足りています。

Rangeオブジェクトの範囲指定」の記事を書いたときにも、「Learning Word Programming」のP.215,216に書かれていることを参考にしています。

また、P71には、変数の初期化の話が載っているのですが、「変数はすべてが自動で初期化されるけど、ミスをなくすためには明示的に自分で初期化をしたほうがいいよ」というアドバイスが載っています。

こういうことって、プログラミングを初歩的なところから習わないと出会えないようなアドバイスですよね。

プログラミング独習者にとっては、非常にありがたいことです。

この本に出会ったきっかけは、以前紹介したニュースグループです。

このページで「good book」のキーワードで検索するとこの本が紹介されています。

紹介される書籍は、どれも古いものばかりです。

絶版になっているものもあり、中古本をアメリカから取り寄せる必要があるものもあります。

他にも買った書籍があるので、また紹介します。

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

2009年6月27日 (土)

一年前の日付を表示:米国特許法第102条(b)に関連して

中間処理で審査官が提示した引例が、妥当なものであるかの判定ソフトを作成しております。

そのソフトでは、米国特許法第102条(b)でひかれた引例が、出願人の米国への特許出願日前1年より前に、公知となったものかどうかを判定します。

そのときの判断に使う基準日の算出のために書いてみました。

●工夫
入力する日付の書式を間違えると、再度入力画面(inputbox)が表示されるようにしました。

実際に入力できる書式はいろいろとありまして、今年の年月であれば「6/27」と入力するだけで、「2009/6/27」を意味するようになります。

また、「09/6/27」でも大丈夫です。

「98/6/27」であれば、「1998/6/27」と判断されます。

このあたりのルールは、ワード任せであり、パソコンの時計と連動しているように思います。

年末(たとえば、2008/12/20)に、「1/1」と入れると、2008/1/1ではなくて、2009/1/1に間違えられたりしたように記憶しています。

あいまいですみません。

●個別説明
40行から90行で、inputboxを使って日付を入力するコードが書かれています。

なぜ、わざわざvariant形式のデータ変数(varDate)を使って入力をさせて、その後、date形式のデータ変数(myfileD)に入力して変更した理由を説明します。

date形式のものにinputboxでデータを入力すると、キャンセルボタンを押したときにdate形式のデータ変数に""が入力されてしまいます。

つまり何もない状態です。

そうすると、date形式のデータ変数にあわない(想定していない文字列)であるために、その時点でエラーが発生してしまいます。

よって、キャンセルしたいのに、エラー発生(エラーコード13)と判定されてしまうわけです。

エラーは、2005/5/5/5のように、日付が誤入力された場合にも同じエラーコード13が発信されます。

よって、キャンセルボタンが押されたことを、日付のご入力から正確に区別するためには、inputboxで受ける変数のデータ形式がdateであると都合が悪いわけです。

そういう理由から、以下のような長いコードになったわけです。

これは経験則でやっているだけで、別の書き方もあるんじゃないかなと思っていますが、とりあえず今はこういう書き方にしています。

●質問(どなたかご存じの方、教えてください。)

2回続けて日付の入力書式を間違えると、エラーが表示されます(30行と40行の間にある「ErrReturn:」にコントロールが戻ってくれません)。

理由がわかる方、教えてください。

●プログラム
しかし、やたら長いですね。

もっと短くできるはず。しかし、私みたいに、短く書くすべを知らなくても、なんとかプログラムが機能してほしい結果が得られてしまうところがいいですね。

パソコンの能力が高いので、多少面倒な遠回りの処理をしても、体感速度は全く変わりませんからね。

Sub グレースピリオド()

      Dim varDate As Variant
      Dim myfileD As Date '本願US出願日
      Dim gracePDY As Integer '本願US出願1年前の年
      Dim gracePDM As Integer '本願US出願1年前の月
      Dim gracePDD As Integer '本願US出願1年前の日
      Dim gracePD As Date  '本願US出願1年前の日付
      Dim Message As String
      Dim Title As String

10    On Error GoTo グレースピリオド_Error

20    Title = "US引例の判定"
30    Message = "本願のUS出願日を入力してください。" & vbCr _
                   & "書式: 2009/6/27"

ErrReturn:

40    varDate = InputBox(Message, Title)

50    If varDate = "" Then
60        End
70    Else
80        myfileD = varDate
90    End If

100   gracePDY = Year(myfileD) - 1
110   gracePDM = Month(myfileD)
120   gracePDM = Day(myfileD)

130   gracePD = gracePDY & "/" & gracePDM & "/" & gracePDM

140   MSGBOX "グレースピリオドの基準日は" & gracePD & "です。"

150      On Error GoTo 0
160      Exit Sub

グレースピリオド_Error:

170       If Err = 13 Then
180           GoTo ErrReturn
190       Else
200           MSGBOX "エラーが発生しましたので終了します。"
210       End If

End Sub

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

2009年6月20日 (土)

ダブルスペースの誤記をシングルスペースにするマクロ

英文作成時に役立つマクロの紹介です。「doublespace.dot」をダウンロード

●用途
このマクロが対象としているのは、英文中に間違って記載してしまった連続するスペース二つをスペース一つに書き換えるマクロです。

文章と文章の間のスペース(ピリオドの後のスペース)は対象外です。

昨日、英文中に誤って書かれている二つのスペースを一つのスペースに書き換える作業がありました。

ひとつひとつ探すのは非常に面倒ですよね。とくに書類のページ数が多い場合には目が疲れます。

職場では以下のワイルドカードを使って一つ一つ確認しながら作業をしました。

検索する文字列:([a-zA-A]{1,})__([a-zA-A]{1,})
置換後の文字列:\1_\2

注意!! 上の文字列中の”_”は半角のスペースを示します。

上記置換式は、1文字以上の大文字小文字のアルファベットで挟まれた半角スペース二つを半角スペース1つに置換するものです。

よって、ピリオド、記号、コンマの前後のスペースは置換対象外となっています。

今回紹介するマクロでは、上記の置換方法に基づいた「一括置換」と「個別置換」の二つの方法をとりあげます。

わざわざマクロにする必要もない感じもしますねぇ。。。

●使い方
①テンプレートをインストールします。こちらを参照。

②3つのボタンがツールバーに表示されます。

Doublespace_3  一番左にある[DS一括]が、「ダブルスペースを一括置換するマクロ」に対応します。

真ん中の区切り線から右側の二つのボタンが「ダブルスペースを個別に置換するマクロ」に対応します。

「ダブルスペースを個別に置換するマクロ」は、二つのステップから成り立ちます。

真ん中にあるのが「ダブルスペースを選択するステップ」で、右端のボタンが「選択されているダブルスペースをシングルスペースに変更し、次のダブルスペースを選択するステップ」に対応します。

③対象となる文書を開き、ボタンをクリックします。

④置換されます。

●工夫
①「ダブルスペースを一括置換するマクロ」では、置換したダブルスペースの前後の単語を赤で着色しました。

よって、一括置換した場合でも、どのスペースを削除したのかわかります。

②「ダブルスペースを個別に置換するマクロ」では、誤作動がないように以下のような条件を加えました。

ダブルスペースが選択されている場合には「選択されているダブルスペースをシングルスペースに変更し、次のダブルスペースを選択」します。(以下の「シングルスペースに置換」の10行目)

このプログラムの考え方は、以前紹介した「参照符号の削除」と同じです。

●プログラム
「ダブルスペースを個別に置換するマクロ」

Sub ダブルスペースを選択()

      Dim myRange As Range
      Dim SE As Long

10    SE = Selection.End
20    Set myRange = ActiveDocument.Range(SE, SE)

30    With myRange.Find
40        .Text = "([a-zA-A]{1,1})  ([a-zA-A]{1,1})"
50        .Wrap = wdFindContinue
60        .MatchWildcards = True
70        .Replacement.Font.Color = wdColorRed
80        .Execute
90    End With

100   If myRange.Find.Found = True Then
110       myRange.Start = myRange.Start + 1
120       myRange.End = myRange.End - 1
130       myRange.Select
140   Else
150       MsgBox "ダブルスペースが見つかりません。"
160   End If

170   Set myRange = Nothing

End Sub

Sub シングルスペースに置換()

10    If Selection = "  " Then
20        Selection = " "
30        Call ダブルスペースを選択
40    Else
50        MsgBox "選択範囲が不適切です。"
60    End If

End Sub

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

「たった3行」エクセルマクロ事典

エクセルマクロの書籍紹介です。

この本のいいところは、「マクロの自動記録」を使って、目的の動作を自動化するマクロつくる方法が多数紹介されている点です。

たとえば、自動記録では、自動記録したときの「選択された特定のセル」をもとにしたプログラムが記録されるのですが、これを「任意の選択範囲」に変更する考え方も記載されています。

このような、基本ではあるけど、汎用性が高くなる知識はありがたいですね。

私は今も、マクロの自動記録機能をよく使います。

なれないうちは、この記録した内容のうちどこをどう使えばいいのか迷うことがありました。

結果、不要なコードもそのまま使っていたこともあります。

自分が使う分には、あまり問題ないのですが、他の人も使える汎用性の高いマクロを作ろうとすると、多少手直し(不要箇所の削除)が必要なことがあると思います。

この本には、そういう点のブラッシュアップ方法に関するヒントがたくさん示されているのでなじみやすいと思います。

あと、不要部分を削除すると、すっきりして美しいですね。

美しさは大切だと思います。読みやすくなるし。

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

2009年6月18日 (木)

なぜワードマクロの書籍は販売されていないのか?

みなさん、突然ですが、なぜワードマクロの本って売っていないのかご存じでしょうか?

「売れないから」というのがとりあえず考えられる答えなんですが、なぜ売れないのでしょうか?

じゃ、なぜエクセルマクロの本はあんなに売られているのでしょうか?

「使う人がいるから」というのも一つの答えですが、なぜ使う人がいるんでしょうか?

エクセルは、どこかの業界で使って普及させたのでしょうかねぇ。

エクセルマクロのことは知っているけど、ワードマクロが存在することすら知らない人が多い。

洋書を見ても、ワードマクロの本って少ないですよね。

だから日本国内だけの話じゃないかもしれないのですが、何かご存じの方いらっしゃったら教えてください。

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

2009年6月15日 (月)

クレームの連番について(US出願において)

先日の記事にて、クレーム番号を連番にするマクロを作成しました。

その中で、PCT出願のUS国内移行時に、予備補正でもとのクレームをすべてキャンセルして、新たなクレームを書き起こすというやり方を紹介しました。

このときに、私が職場で行っている実務の根拠が示せなかったので、調べましたので紹介します。

USPTOのホームページに、補正のルール変更についての一覧ページがあります。こちら

上記のように予備補正にて新たなクレームに書き直すときには、もとのクレーム番号の次の番号から振り直すのですが、この一連の考え方がUSPTOのこのページに記載されています。

F3に、上記の回答が書かれています。

US出願の補正全般については、USPTOのこのページにスライドショートして掲載されているので、参考になるかもしれません。

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

2009年6月13日 (土)

英文クレームの連番処理

英文クレームのクレーム番号を連番に書き直すマクロです。

「renban_EN.dot」をダウンロード 「renban_EN_sample_claims.doc」をダウンロード

●作用
英文クレームにおいて、クレームが記載される段落の先頭にクレーム番号があります。

この番号を「任意の数字」から連番にします。

●開発背景
アメリカに出願した特許の中間処理においては、クレームを削除して書き直す場合、同じクレーム番号ではなく、新しいクレーム番号を書き起こす必要があります。

実務上そうしているので、根拠となる法文はよくわからない(失礼)のですが、MPEPでは714(c)あたりになるのでしょうか。

---------------------------
6/15/2009に根拠を調べました。
こちらをどうぞ。
---------------------------

PCT出願によりアメリカに国内移行するときに、予備補正で米国書式に書き直します。

そのときにPCT出願したクレームを一旦キャンセルして、新しく書式をととのえたクレームに差し替えることをします。

このときに、例えば1~50のクレームをPCT出願した場合、書き直したクレームの番号は51~100が振られます。

単純にこのようになればいいのですが、実際には多項従属を単項従属に書き換えたりするので項数が多くなることもあります。

そこで、番号を振りなおすのが少し手間なので、今回マクロを作ってみました。

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

2.Renban_en [1, 2, 3]というボタンがツールバーに表示されます。

3.連番にしたいクレーム番号の上の行にカーソルをおきます。

Renban_en_2 サンプルファイル(US4,442,749のクレーム)を開いてください。クレームが4つ記載されています。

左の画像でいうと、クレーム1以降を連番対象としたいので、クレーム1の番号が記載されている行のひとつ上の行にカーソルが置かれています。

4.上記の[1, 2, 3]ボタンをクリックして、開始行を入力します。

Renban_en_3 左の画像のようなインプットボックスが表示されます。

今あるクレーム番号「1から4」を「5から8」に変えたい場合には、開始番号として「5」を入力します。

5.番号が自動でふられます。

●使用上の注意
クレーム番号として認識するのは以下の文字列です。(130行参照)

"^13([0-9]{1,}).^t"

つまり、改行された直後(つまり行の先頭)に半角の文字列があり、その直後にピリオドがあり、その直後にタブが入っています。

サンプルテキストの書式の場合にクレーム番号として選択されます。ご確認ください。

●工夫
連番対象とする範囲を指定しました。

範囲指定については、こちらの記事に詳細を書きましたのでご参照ください。

以下のように60行から90行に記載しました。

60行で、現在のカーソルの位置をmyStartに格納しています。
この位置が、毎回の検索の開始位置にします。

また70行で現在文書の最後の位置を格納しています。

以前のブログでも記載しましたが、現在文書の最後には改行記号がありますので、「改行記号の一つ前」が、カーソルが移動しうる最終位置となります。

で、Rangeオブジェクトを用いた検索前には、rangeオブジェクトの範囲をSetRangeによって指定します。(80行、90行)

60    myStart = Selection.Start
70    myEnd = ActiveDocument.Range.End - 1
80    Set myRange = Selection.Range
90    myRange.SetRange Start:=myStart, End:=myEnd

●ヒント
連番にする処理には@を使いました。

これは、以前紹介した墨付き括弧内の数字を連番にするマクロと同じ考え方です。

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

Rangeオブジェクトの検索範囲指定

Rangeオブジェクトの検索範囲を指定するコードです。

●背景
検索をするときに最近多用するようになりましたが、馬鹿の一つ覚えみたいにずっとSelection.Rangeを使い続けました。

その中で、検索するときに、カーソルの位置は見えないけれど、検索を開始している位置があることに気づきました。

目に見えないだけにやっかいだと思い、今までは以下のコードを一行書いて、カーソル位置を文頭に移動しました。

Selection.HomeKey unit:=wdStory

結局、カーソルが見えないように処理していたのですが、このコードがあるためにカーソルを移動(画面を移動)する処理が入ることになりました。

別にスピード感として違いはわかりませんが、画面のちらつき(flickering)が増えてしまいます。参考記事はこちら

カーソルの移動を、画面のちらつきなしにする方法が少しわかってきたので、分かる範囲で紹介いたします。

●カーソル移動方法
以下のコードでは、すべてrngをrangeオブジェクトとして定義してあります。

つまり、

Dim rng as Range

がプロシージャの先頭に書かれていると想定してください。

また、以下の例では、Selection.Rangeではなくて、ActiveDocument.Rangeとしてみました。

この違いはうまく説明できませんが、ActiveDocument.Rangeとすると対象とする検索範囲は文書全体になるような気がしています。

■方法1

Set rng = ActiveDocument.Range
rng.Collapse wdCollapseStart

この方法では、2行目で選択範囲を解除してカーソル位置を文頭に移動しています。

Selectionオブジェクトで用いるCollapseと同じ考え方です。

■方法2

Set rng = ActiveDocument.Range
rng.End = 0

これは、2行目で選択範囲の最終位置が先頭になるように指定します。

つまり、選択範囲の先頭も末尾も「0」文字目になる。つまりカーソルが先頭に位置されるわけです。

■方法3

Set rng = ActiveDocument.Range
rng.StartOf Unit:=wdStory, Extend:=wdMove

これは、選択された範囲の最初にカーソル位置を移動させるものです。

Unitで指定したものが「全体」となっているので、文書全体の先頭にカーソルが移動する仕組みです。

■方法4

Set rng = ActiveDocument.Range(Start:=0, End:=0)

これは、Rangeオブジェクトで特定の開始文字位置および終了文字位置を定義するときの記述方法です。

開始位置および終了位置が0文字目になるので、カーソルが先頭にくるわけです。

■方法5

Set rng = ActiveDocument.Range(0, 0)

方法4の簡略形です。

今まで気づきませんでしたが、「ワードで実践」ではこの書き方を多用していますね。

最近は書籍よりもニュースグループとヘルプを参考にしてプログラムを書き続けていましたが、久しぶりに書籍を読むと、今まで分からなかったことが読めるようになっているのでうれしいですね。

■方法6

Set rng = ActiveDocument.Range
rng.SetRange Start:=0, End:=0

方法4,5と同じような考え方ですが、SetRangeを用いて開始位置と終了位置を設定しています。

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

2009年6月 7日 (日)

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

2009/5/10に紹介した翻訳文の比較表作成マクロのアップデートです。

マクロに比較の不備が見つかったので、公開を控えました(2011/03/06)。

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

 


Tablecomparison4

●改善点
・Word2000に対応します。

・比較表のフォーマットをオートフォーマットの「プロフェッショナル」にしました。(「比較表作成」の420行)

・比較するときに([較]ボタンをクリックしたとき)、比較する文字列の大文字か小文字かを区別するようにしました。また、完全一致のみを比較対象とするようにしました。(「日英比較実行」の310行)

例:
(前のバージョン)
日本語中のTh の比較対象として、there is のth が検索されてしまいました。

(今回のバージョン)
日本語中のTh の比較対象として、Th のみが検索されます。「単語の一部のth」や「単独のTh ではあるが、大文字小文字が間違っているth やtH 」は検索されません。

結果、日本語に「番目の」と記載されていて、英語で4th となっている場合には、4th の4は見つけられませんので、ご注意ください。

使うとわかると思います。

●その他変更
コードのマイナーチェンジとしては、「比較表作成」の610行、660行の表現を変えました。

コードが2行減りました。

どうぞご利用ください。

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

2009年6月 6日 (土)

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

先日紹介したコピペマクロですが、フォルダパスの取得を「ファイルを開く」ダイアログボックスからできるようにして、簡単にしました。

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

●使い方

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

2.コピー先となるファイルを開きます。
新規文書を開いておけばいいと思います。

文章が書かれているファイルが開かれている場合には、文章の最後からコピペを開始します。

3.ツールバーの[コピペ]ボタンをクリックしてフォルダパスを指定

Copypaste2

左のようなファイルを開くダイアログボックスが表示されます。

このダイアログボックスを使って、コピペしたいワードファイルが含まれているフォルダのファイルを表示します。

表示されているワードファイルのいずれか一つをダブルクリックしたり、ダイアログボックスの右下の「開く」ボタンをクリックして、フォルダパスを指定します。

3.あとは、自動的にフォルダ内のワード文書のコピペをします。

●工夫

前回の記事に記載したフォルダパスを取得するコードをそのままつかっています(40行から130行)

マクロの使い方は前回紹介したとおりです。

70行と180行に、

70         .Name = "*.doc"
180       .FileName = ".doc"

と記載して、ワード文書の表示を指定していますが、

70         .Name = "*.txt"
180       .FileName = ".txt"

とそれぞれ変更するとテキストファイルを指定できます。

拡張子を設定していろいろとお試し下さい。

ワードで開けない種類のアプリケーションの拡張子を記入するとうまくいかないかもしれません。

お楽しみください。

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

選択したファイルのフォルダパスを取得するマクロ

Folderpath 左の「フォルダを開くダイアログボックス」でファイルを選択(ダブルクリック)したときに、選択したファイルが保存されているフォルダのパスを取得するマクロです。

2種類つくりました。

①表示するファイルの種類を指定しない方法です。

この場合には、Dialogs(wdDialogFileFind)という組み込みのダイアログボックスを利用します。

②表示するファイルの種類をワード文書などに指定する方法です。

この場合には、上記のDialogs(wdDialogFileFind)にDialogs(wdDialogFileOpen)のダイアログボックスを組み合わます。

ヒント:以前紹介したニュースグループでDialogs(wdDialogFileOpen) file pathをキーワードにして検索します。

参照したページはこちら

Dialogs(wdDialogFileOpen)を用いて、ファイルを開くことができるや、ファイル名を取得できることは知っていましたが、ファイルパスやフォルダパスが取得できなくて困っていました。

そこで上記のようなキーワードの質問をしたところ、同じような疑問がすでに書かれておりました。

さらに、Dialogs(wdDialogFileOpen)では、ファイルパスは取得できないとの回答と、Dialogs(wdDialogFileFind)を組み合わせたファイルパスの取得のコードが載っていました。

ありがたく参考にさせていただき、下記のように簡単なコードに書き直しました。

ファイルパスの取得方法は、上記の参照ページに載っていますのでご覧ください。

Sub ①ファイルのフォルダパスを取得()

Dim strPath As String
Dim dlgFind As Dialog

Set dlgFind = Dialogs(wdDialogFileFind)

With dlgFind
   
    Select Case .Display
   
    Case -1  'ファイルが選択されたとき
        'FileFind Dialogの更新
        .Update
        'FileFind Dialogからフォルダパスの取得
        strPath = .SearchPath
       
    Case Else  'キャンセルボタンが押されたとき
        End
       
    End Select

End With

MSGBOX strPath

End Sub

以下のプログラムでは、ワード文書のみを表示します。

Sub ②ファイルのフォルダパスを取得()

Dim strPath As String
Dim dlg As Dialog
Dim dlgFind As Dialog

Set dlg = Dialogs(wdDialogFileOpen)
Set dlgFind = Dialogs(wdDialogFileFind)

With dlg
    .Name = "*.doc"
   
    Select Case .Display
   
    Case -1 'ファイルが選択されたとき
        'FileFind Dialogの更新
        dlgFind.Update
        strPath = dlgFind.SearchPath
       
    Case Else 'キャンセルボタンが押されたとき
        End
    End Select

End With

MSGBOX strPath

End Sub

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

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