dポイントプレゼントキャンペーン実施中!

Microsoft Offie Word 2003 (OS; Windows XP)で、
以下のように、数値が羅列されたテキストがあります。

01 05 02 06 42 35 82
22 99 03
10 43 53 72 04 11
21 22 01 34
09 99 33 99 81
32 08 63 58 92 34 71 43

ここで、この数値の中に 99 を含んでいる行の行末に
”発見!”という文字列を追加したいと思っています。
(1行中に複数の 99 があっても行末に1つ”発見!”を追加)

このような結果を得たいのです。

01 05 02 06 42 35 82
22 99 03 発見!
10 43 53 72 04 11
21 22 01 34
09 99 33 99 81 発見!
32 08 63 58 92 34 71 43

サンプルコードを示して頂ければ幸いです。
宜しくお願い致します。

A 回答 (3件)

こんにちは。



どうみても、それは、Word向きの内容ではありません。
できないとは言いませんが、プロパティに現れますが、Wordの一般ドキュメントには、Excelのような「行」という明確な概念がありません。その代わりにに、「パラグラフ(以下のマクロをご覧ください)」というものがあるのですが、それは、「行」とは意味が違います。出来れば、Wordを表(Table)にするか、Excelのワークシートで関数で行ったほうが確実のような気がします。

以下は、Wordのマクロのサンプルです。
なお、999 は、検索の対象外です。あくまでも、99 として検索します。

Sub paraNum()
'末尾に文字を挿入する
Dim aPara As Paragraph
'検索語
Const SRWORD As String = "99"
Selection.HomeKey Unit:=wdStory
Selection.EndKey Unit:=wdStory, Extend:=wdExtend

If Selection.Type = wdSelectionNormal Then
  For Each aPara In Selection.Range.Paragraphs
   With aPara
    If InStr(1, " " & aPara.Range.Text & " ", " " & SRWORD & " ", vbBinaryCompare) > 0 Then
    With .Range
     .MoveEnd Unit:=wdCharacter, Count:=-1
     .Collapse Direction:=wdCollapseEnd
     .InsertAfter Text:=" 発見!"
    End With
    End If
   End With
  Next
End If
End Sub
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

Javaで正規表現検索・置換を行うほうが処理的には簡単なことは
分かるのですが、これだとエディター,ファイル入出力やUndo/Redo等の
GUIを構築する部分が大変だったりしますよね...
個人で使うだけなら、ファイルをダイレクトに処理すれば済む事なんですが、
私以外の人がテキスト編集作業もひとつの環境で行う必要があるので
万人が使い慣れたワードをGUIとして使用するのが良いかと思ったのですが、
個人的にはワードマクロが全く分からないので迷うところです。

もう少し、悩んでみようと思います。

お礼日時:2007/09/11 12:57

こんばんは。



>どうもその機能が貧弱そうなのでJavaで開発することにしました。

一応、これで完結だと思うのですが、もしも、完全に言語で開発するつもりだったら、それなりの言語はいくつもあります。また、WYSIWYG にするつもりで、Wordを選択したなら、それは間違いです。Wordには、もう一つ、ファイルサイズ・32MBの制限が存在しています。また、GUIのコマンドの表示系を整える機能は、VBAには残念ながらありません。

他の言語を扱っている方が、「VBA自体を下にみる」言い方をする人は多いのですが、私自身も、いくつか他の言語は扱っても、VBAに戻ってきて、場合によって悪くない、思いのほか、優れて便利だといわざるを得ない部分があります。特に、複雑な計算を自分で作るよりは、C言語処理を借りた非常にすばらしい演算を使えます。

たぶん、違う言語系からみると、VBAやVBは、曖昧な部分も多いので、分かりにくいのだろうとは思います。ただ、「機能が貧弱」というなら、こちらの未熟さも原因しているだろうということになりますが、私は、そのカテゴリの範囲で、私の知っている範囲で、質問者さんに、何とか満足に結びつけようとします。私は、VBAは、5年ぐらい扱っています。また、Word VBAを扱う人は、ネットの中でもそんなに多くありません。ですから、最後に、こちらの評価はとかもく、そのような全体に関わるような発言には、とても残念だと思います。
    • good
    • 0

こんばんは。



話が良く見えてこない部分があるのですが、もし、テキストファイルでしたら、別にWord自体は不要だと思いますね。WordのVBA やExcelのVBAだけで、表示は必要ありません。

ただ、もう少し突っ込むなら、Windows のWsciptで、RegExpの正規表現を使い、ドラッグ&ドロップで、作ることが出来ます。その正規表現を工夫すれば、複雑なものでも検出すると思います。今は、ファイル名は、出力側には、先頭に「t_ 」が付きます。VBAのほうが簡単ですが、WordもExcelもなしにも出来るというために、書いておきます。なお、全角スペースが入ると、エラーになりますから、気をつけてください。


----------------------------------------------------------------------
'FindNumber.vbs
'エクスプローラからドラッグ&ドロップしてください。
Dim objFso
Dim fname
Dim objTxIn
Dim txOut
Dim objTxOut
Set objFso = CreateObject("Scripting.FileSystemObject")
On Error Resume Next
fname = WScript.Arguments.Item(0)
If Len(fname)=0 Then
MsgBox "ファイルがありません"
WScript.Quit
End if
If objFso.GetExtensionName(fname) = "txt" Then
Set objTxIn = objFso.OpenTextFile(fname)
path = objFso.GetParentFolderName(fname) & "\"
txOut = path & "t_" & objFso.GetFileName(fname)
Set objTxOut = objFso.CreateTextFile(txOut)
Set objRegexp = New RegExp
With objRegexp
.Pattern ="\b99\b"
.Global=True
End With
Do Until objTxIn.AtEndOfStream =True
txTmp = objTxIn.ReadLine()
If objRegexp.Test(txTmp) Then
txOut = txTmp & " 発見!"
Else
txOut = txTmp
End If
objTxOut.WriteLine(txOut)
txOut =""
Loop
objTxOut.Write(txOut)
objTxIn.Close()
objTxOut.Close()
MsgBox("終了")
Else
'CSVファイル以外の場合
MsgBox("テキスト・ファイルをドロップダウンしてください")
End If
Set objFso = Nothing
    • good
    • 0
この回答へのお礼

前にも書きましたが、編集作業の環境も同時に必要なのです。
ですから、Wordのマクロが最適かと考えていましたが、
どうもその機能が貧弱そうなのでJavaで開発することにしました。
ありがとうございました。

お礼日時:2007/09/12 16:36

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!