締切済み

macroコードを短縮できるでしょうか。

  • すぐに回答を!
  • 質問No.4173385
  • 閲覧数108
  • ありがとう数3
  • 気になる数0
  • 回答数3
  • コメント数0

お礼率 73% (17/23)

下記のコードで、実行できます。大部分はマクロを記憶し、同じ処理を重ねただけのものです。
目的は、ワードで選択した文字列の中から数字を削除します。
ただし、下記のような場合は削除しません。
【請求項1】、項2、ないし3、いずれか1、【0019】、第3の、

この処理を行うために、差別化しました。
まず、数字を赤字で太字にしました。
次に、上記の、削除しては具合が悪い数字については、明朝で標準に戻すようにしてから、赤字で太字の数字を削除しました。

2000文字を超えるので、途中大幅にカットしました。
以下は、コードです。
~~~~~~~~~~~~~~~~~~~~~~~~
Private Sub 符号削除()
Selection.Find.ClearFormatting
Selection.Find.Font.Bold = True
Selection.Find.Replacement.ClearFormatting
With Selection.Range.Find
.ClearFormatting
.Text = "第1"
.Replacement.Text = ""
.Replacement.Font.Color = 1
.Replacement.Font.Bold = False
.Execute Replace:=wdReplaceAll
End With
Selection.Find.ClearFormatting
Selection.Find.Font.Bold = True
Selection.Find.Replacement.ClearFormatting
With Selection.Range.Find
.ClearFormatting
.Text = "第2"
.Replacement.Text = ""
.Replacement.Font.Color = 1
.Replacement.Font.Bold = False
.Execute Replace:=wdReplaceAll
End With

Selection.Find.ClearFormatting
Selection.Find.Font.Bold = True
Selection.Find.Replacement.ClearFormatting
With Selection.Range.Find
.ClearFormatting
.Text = "又は2"
.Replacement.Text = ""
.Replacement.Font.Color = 1
.Replacement.Font.Bold = False
.Execute Replace:=wdReplaceAll
End With
↓以下、20まで繰り返し
Selection.Find.ClearFormatting
Selection.Find.Font.Bold = True
Selection.Find.Replacement.ClearFormatting
With Selection.Range.Find
.ClearFormatting
.Text = "乃至20"
.Replacement.Text = ""
.Replacement.Font.Color = 1
.Replacement.Font.Bold = False
.Execute Replace:=wdReplaceAll
End With
Selection.Find.ClearFormatting
Selection.Find.Font.Bold = True
Selection.Find.Replacement.ClearFormatting
With Selection.Find
.Text = "1"
.Replacement.Text = ""
.Forward = True
.Wrap = wdFindContinue
.Format = True
.MatchCase = False
.MatchWholeWord = False
.MatchByte = False
.MatchAllWordForms = False
.MatchSoundsLike = False
.MatchWildcards = False
.MatchFuzzy = False
End With
Selection.Find.Execute Replace:=wdReplaceAll
↓以下、9,0まで繰り返し
Selection.Find.ClearFormatting
Selection.Find.Font.Bold = True
Selection.Find.Replacement.ClearFormatting
With Selection.Find
.Text = "9"
.Replacement.Text = ""
.Forward = True
.Wrap = wdFindContinue
.Format = True
.MatchCase = False
.MatchWholeWord = False
.MatchByte = False
.MatchAllWordForms = False
.MatchSoundsLike = False
.MatchWildcards = False
.MatchFuzzy = False
End With
Selection.Find.Execute Replace:=wdReplaceAll

Selection.Find.ClearFormatting
Selection.Find.Font.Bold = True
Selection.Find.Replacement.ClearFormatting
With Selection.Find
.Text = "0"
.Replacement.Text = ""
.Forward = True
.Wrap = wdFindContinue
.Format = True
.MatchCase = False
.MatchWholeWord = False
.MatchByte = False
.MatchAllWordForms = False
.MatchSoundsLike = False
.MatchWildcards = False
.MatchFuzzy = False
End With
Selection.Find.Execute Replace:=wdReplaceAll
End Sub
~~同じ繰返しを短くする部分の正規表現の使い方やloopを指南していただけたら幸甚です。

回答 (全3件)

  • 回答No.3

ベストアンサー率 57% (3570/6233)

こんにちは。

>依田 茂さんと言う方(特許事務所勤務)
Vector にマクロを登録している方ですね。たぶん、その方ご自身の中でされていることであって、ユーザーリクエスとはしないのかもしれません。出版業界で、ツールを出している人もいるのですが、それぞれ分野が違うと、そのルールも異なるようです。少し、調べてみましたが、一般の人にとって、秀丸エディタのマクロがあまり簡単とは言えません。

ただ、基本的に、テキストファイルを処理するものでしたら、MS-Wordのマクロに関わらず、もっと簡単に作れるはずだとは思います。

「正規表現の対照表」では、単なるメタ・キャラクタだけですから、あまり有用性が高いわけではありません。それが最低の基礎知識というところだと思います。

>もっといいものをと考えています。

それは同感です。いろいろ検討してみると、私の知っている範疇ですと、Perl に収まりそうな気がします。ただ、Perl は、本来、Unix系のツールで、コマンドラインです。
一旦、組み込めば、後は、スクリプトのリストを書き換えるだけですみます。

入門書:
はじめてのPerl入門 日本理工出版会 戸内 順一 (著)
http://www.amazon.co.jp/exec/obidos/ASIN/4890194940

他の本に比べて簡単で、教科書のような感じです。

ツールは、このようなものがあります。
他のものに比べて、安定しています。

http://homepage3.nifty.com/aokura/#Perlを始めよう!

Perl が習得できなかったとしても、VBAに応用できるようになります。
VBAのPerl系のツールとしては、BASP21の中の、BRegExp というものがあります。

BASP21
http://www.hi-ho.ne.jp/babaq/basp21.html

BREGEXP.DLL
http://www.hi-ho.ne.jp/babaq/bregexp.html
お礼コメント
azuma3chom

お礼率 73% (17/23)

 Wendy02さん、いろいろ調べていただきましてありがとうございます。明細書作りに役立つプログラムを作って見たいと思うようになって、11ヶ月が立ちますが、周りを見ますと、VBAを知っている弁理士や特許技術者は殆どいません。どんなソフトを作れば、便利であるかについて、意識すらしていないようです。今日も、家で仕事をしていて、新しく思いついたものがあります。この質問の、「Private Sub 符号削除()」とは、逆の処理をするソフトです。符号を入れた権利範囲を作りますと、構成要素の取り違いが無く、間違いが生じにくいので、私も、符号を入れた権利範囲を作ります。ですが、権利範囲から符号を外さないと、大手企業の知財部へは納品できません。したがって、
Pivate Sub 符号削除()」のソフトがあったら便利だな、とある日思い立って作りました。
 ところが、他人が作成した明細書に記載された発明についての改良発明を新たに出願したいということで、明細書作成を頼まれることがあります。このとき、効率的な理解ができるようにするために、権利範囲の用語に図面に使われている符合を付けます。このために便利なソフトは、「Private Sub 符号削除()」のソフトが行う処理とは逆の処理を行うソフトです。このソフトは、拒絶理由通知が来たときにも十分に役立ちます。拒絶理由通知に示される引例(先行特許文献)は、4件くらいあります。その、権利範囲を読解するには、やはり、請求範囲の用語と符号との照合による理解が不可欠です。
 このようなことから、新しいテーマが見つかったので、これから毎日、マクロつくりに時間をかけ、躓いた時には、質問を投稿しようと思います。そのときには、宜しくお願いします。
投稿日時 - 2008-08-02 15:00:04
感謝経済、優待交換9月20日スタート
  • 回答No.2

ベストアンサー率 57% (3570/6233)

こんにちは。

しばらく間が空きましたが、
>今度のマクロの狙いは、用語+符号の文書で符号を消すことです。

全体を通してみてみると、正規表現つきエディタなどの応用をしたほうがよいかもしれないなって思います。
正規表現のテキストは、いくつかありますから、それにズバリというものはないのですが、それに近いものは、何社からか出ています。

例:『正規表現 ケーススタディブック』(毎日コミュニケーションズ)\2,200.(税抜)
http://www.amazon.co.jp/exec/obidos/ASIN/4839913870

エディタのマクロ自体は、VB系のものやC言語系のもの、もっと平易なものなど、エディタはいろんな種類のマクロ言語が使われています。

MS-Wordのマクロは、その中では比較的易しいのですが、MS-Wordの問題点は、32MB の制限というだけではなく、見えないアドインやらOLE などいろんなものがつながって、他のトラブルが派生して、大事な書類を損なう可能性があるからです。MS-Wordのマクロは、本格的にコードを書く人が少ないです。(前にも書いたように、Selection.Text を使ったのでは、MS-Wordとしてはあまり意味がないと思います。オブジェクトで扱わなければ、意味がありません。)

なお、私の場合は、納品先より、特許関係は原稿用紙記載義務がありましたが、最初はテキストエディタで、文字数などの数えながら処理をしていき、それを、原稿用紙専用のエディタに移し変えるだけです。WordはMS-Word納品が決まっているもののみ使用します。あまり、MS-Wordを常用しません。JustSytemの製品には良いものがあるとも聞き、展示会でみましたが、校正ツールは、編集者のプロ用のものという印象でした。慣れれば、それも良いのかもしれません。
お礼コメント
azuma3chom

お礼率 73% (17/23)

>今度のマクロの狙いは、用語+符号の文書で符号を消すことです。
マクロをそっくり記憶したものと、正規表現を使って処理できるものとをまぜこぜにしていますが、結構間違いなく、処理できています。コードを見ると、ダサいのですが、しばらくはこのままで行こうかと思います。
正規表現の対照表(http://homepage2.nifty.com/zaco/rexp/rexpt.html)というのを見つけたので、参考にしてジックリ検討します。
なお、依田 茂さんと言う方(特許事務所勤務)とメールでやり取りしたことがありますが、一部の事務所では、秀丸エディタを使っているようです。依田 茂さんがつくられたものは、あまり有用性が低いので、もっといいものをと考えています。
投稿日時 - 2008-07-27 16:45:51
  • 回答No.1

ベストアンサー率 57% (3570/6233)

こんにちは。

基本的には、私は、もうここのカテゴリでは書く意欲自体を失ってしまったのですが、気になった個々の方に関しては、ある程度まで、サポートはさせていただくことにしています。

もし、記録マクロで出来ているのでしたら、そのままお使いになればよいと思います。あえて、コードをまとめようと欲をかいても、こちらの書いたコードが、出来ない-->分からない-->そのまま ということでは、まったく意味がありません。

>2000文字を超えるので、途中大幅にカットしました。

ExcelでもWordでも、VBEditor 内のひとつのプロシージャとしては、一般的に、100行程度までです。
ですから、それ以上の行数では、基本的なマクロの形態を有していない可能性が強いです。その場合は、プロシージャを分散させて、Call マクロ名、とすればよいです。

質問のご要望は、同じような内容のマクロを一つにしてほしいということだと思いますが、残念ながら、ご質問の要点が良く分かりません。分からない部分は、コードを読めということだと思います。それでは、少し乱暴です。それに、本来、マクロの基礎的なものですから、それをする以前の部分が、ネックとなる可能性があるかもしれません。

>削除しては具合が悪い数字については、明朝で標準に戻すようにしてから、赤字で太字の数字を削除しました。

でも、コードを見る限りは、そうはなっていないようです。規定の太字で数字が含まれた文字を削除する、ということでしょうか。

サンプルを示しておきます。「太字」になっている、リストの文字を削除します。

削除したりする内容や仕様が変わるなら、内容を変えて、もう一つ、ループを作ればよいです。

元のコードでは、なぜ、Private ステートメントなど付けたのでしょうか、そういう部分がわかりません。
'-------------------------------------------

Sub 符号削除2()
Dim blFound As Boolean
Dim arData1 As Variant
Dim v As Variant

'一覧のリストを以下に、「,(コンマ)」で切って入れます。

Const fDATA1 As String = "第[0-9],又は[2-9],又は1[0-9],乃至20,[0-9]"
arData1 = Split(fDATA1, ",")
blFound = True

For Each v In arData1
Do
  With Selection.Range.Find
    .ClearFormatting
    .Font.Bold = True
    .Text = v
    .Replacement.Text = ""
    .Format = True
    .Wrap = wdFindContinue
    .MatchCase = False
    .MatchWholeWord = False
    .MatchByte = False
    .MatchAllWordForms = False
    .MatchSoundsLike = False
    .MatchFuzzy = False
    .MatchWildcards = True
    
    blFound = .Execute(Replace:=wdReplaceAll)
  End With
Loop While blFound = True
Next v
End Sub

'----------------------------
お礼コメント
azuma3chom

お礼率 73% (17/23)

>基本的には、私は、もうここのカテゴリでは書く意欲自体を失ってしまったのですが、気になった個々の方に関しては、ある程度まで、サポートはさせていただくことにしています。

こんにちは、Wendy02さん、ちょっとさみしいですね。

>もし、記録マクロで出来ているのでしたら、そのままお使いになればよいと思います。あえて、コードをまとめようと欲をかいても、こちらの書いたコードが、出来ない-->分からない-->そのまま ということでは、まったく意味がありません。

今度のマクロの狙いは、用語+符号の文書で符号を消すことです。
特許明細書は、実施形態の記載欄より上側の部分は符号を入れないことになっています。符号を入れると、裁判で争いになったときに、狭く解釈される恐れがあるからです。ですが、明細書作成中は、符号がないことには、なかなか頭の中に入りません。それで、全文を通じて符号を入れて作成します。クライアントへ送るときに、実施形態の記載欄より上側の部分は符号を全部取り除きます。権利範囲のボリュームが多いときは、符号が半端ではないほど多く入っています。消し忘れも起きることがあります。3,4年経って、出願について審査が行われ、拒絶理由通知がきたときには、自分が書いた文章でもすっかり忘れていて、権利範囲の用語に符号をつけることから、解釈し反論します。ですから、符号を消さない文書もストックしておけば、後々楽になりますが、出願用には符号を外す必要があります。それで、今度のマクロを考えました。マクロ作成は、検索置換のウインドウで部分的の操作してコードを拾って積み重ね、実行を繰り返しましたので、問題なく動きます。ですが、同じ処理を延々と書くのは、どうなのか?、と疑問に思った次第です。それに、権利範囲を30以上書く場合もある(私は20位までです)のでまとめられたらいいと考えていました。1つの出願が1000頁というのも過去にありました。
Wendy02さんの示されたサンプルコードに従って、マクロ記録したコードをいじってみます。
投稿日時 - 2008-07-16 17:08:53
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,500万件のQ&Aを分析して最適な回答をご提案します。

関連するQ&A
このやり方知ってる!同じこと困ったことある。経験を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する

特集


より良い社会へ。感謝経済プロジェクト始動

ピックアップ

ページ先頭へ