WORDのマクロでテキストファイルの行数を判断する方法について質問

このQ&Aのポイント
  • WORDのマクロでテキストファイルを読み込み、行数を判断してその回数だけマクロを実行する方法について教えてください。
  • 具体的には、テキストファイルの整形作業のために、行数に基づいてマクロを実行する方法を知りたいです。
  • Webでの検索では詳しい情報が見つからず、マクロを行数分だけ繰り返す方法についてお助けいただきたいです。
回答を見る
  • ベストアンサー

WORDのマクロについて質問です

WORDのマクロで質問です。 WORDでテキストファイルを読み込み、整形する作業があるのですが、 テキストファイルの行数を判断して、その回数だけマクロを実行さ せるようにするには、どうすればよいのでしょうか。 具体的には、 Sub 整形() Selection.Delete Unit:=wdCharacter, Count:=1 Selection.Delete Unit:=wdCharacter, Count:=1 Selection.Delete Unit:=wdCharacter, Count:=1 Selection.MoveRight Unit:=wdCharacter, Count:=5 Selection.TypeText Text:=" " Selection.MoveDown Unit:=wdLine, Count:=1 Selection.MoveLeft Unit:=wdCharacter, Count:=8 End Sub この作業を行数分だけ行うマクロを作成したいのですが、Webで調べて みても、ピンと来るものが見つかりませんでした。 どうかお助けください。

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

こんにちは。 #1,#3の回答者です。 >今、あるソフトで行おうと試みた結果だったのです。 Office があれば、十分ですね。 一応、文字の先頭が、000 のみに対応し、スペースを3個入れるように書き換えてみました。 "000" という条件が必要なければ、rngPara.Text Like "000*" を取り去り    If Len(rngPara.Text) > 8 Then にしてしまってください。 ------------------------------------------------------- Sub 整形2R() Dim para As Paragraph Dim rngPara As Range  Selection.HomeKey Unit:=wdStory  For Each para In ActiveDocument.Paragraphs   Set rngPara = para.Range    If Len(rngPara.Text) > 8 And rngPara.Text Like "000*" Then      rngPara.Collapse Direction:=wdCollapseStart      Selection.MoveRight Unit:=wdCharacter, Count:=3, Extend:=wdExtend      Selection.Delete      Selection.MoveRight Unit:=wdCharacter, Count:=5      Selection.InsertAfter Text:=Space(3)    End If    Selection.Move Unit:=wdParagraph  Next para End Sub #3の回答の場合は、Word専用となると、ちょっと面倒ですね。これが、Excelをお持ちでしたら、そちらのほうがバリエーションが多いので、#3の同じ目的のコードとしては簡単になります。当然、テキストファイルは、そのまま複数でも加工することが可能です。 なお、#3の場合は、 以下の部分を書き換えてくれれば、可能です。  Do Until EOF(inFno)    Line Input #inFno, tmp    If Len(tmp) > 9 Then      tmp = Mid$(tmp, 4)      tmp = Mid$(tmp, 1, 5) & Space(3) & Mid$(tmp, 6)    End If    Print #outFno, tmp    tmp = "" Loop

HEIZO_kun
質問者

お礼

おかげさまで助かりました。 一行、一行マクロ処理をしていたのですが、すべて1Keyで処理することが可能となりました。 本当にありがとうございます。

その他の回答 (3)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんばんは。 #1 の回答者です。 #1 のマクロは、 × If Len(rngPara.Text) > 5 Then     ↓  If Len(rngPara.Text) > 8 Then に変更してください。 それと、繰り返しますが、Wordには、行の概念が明確ではありませんから、行はあくまでも、目で見たものに対するもので、そのまま、文字列を行ったり来たりしても、うまく行かないはずです。 なお、テキストファイル用のマクロを作ってみました。 '------------------------------------------- '標準モジュール '(Word用) Declare Function GetOpenFileName Lib "comdlg32.dll" Alias "GetOpenFileNameA" _   (lpofn As OPENFILENAME) As Long Type OPENFILENAME   lStructSize As Long   hwndOwner As Long   hInstance As Long   lpstrFilter As String   lpstrCustomFilter As String   nMaxCustomFilter As Long   nFilterIndex As Long   lpstrFile As String   nMaxFile As Long   lpstrFileTitle As String   nMaxFileTitle As Long   lpstrInitialDir As String   lpstrTitle As String   flags As Long   nFileOffset As Integer   nFileExtension As Integer   lpstrdefext As String   lCustData As Long   lpfnHook As Long   lpTemplateName As String End Type Const OFN_PATHMUSTEXIST = &H800 Sub TextArrangement()  Dim lpofn As OPENFILENAME  Dim inFno As Integer  Dim outFno As Integer  Dim Fname As String  Dim outFname As String  Dim rc As Long  Dim tmp As String  With lpofn   .hwndOwner = 0   .flags = OFN_PATHMUSTEXIST   .lStructSize = Len(lpofn)   .lpstrFilter = "Text File(*.txt)" + Chr(0) + "*.txt"   .lpstrFile = String(256, Chr(0))   .nMaxFile = 256   .lpstrInitialDir = CurDir()   .nFilterIndex = 1  End With    rc = GetOpenFileName(lpofn)  If rc = 0 Then Exit Sub  Fname = lpofn.lpstrFile  inFno = FreeFile()  Open Fname For Input As #inFno    outFno = FreeFile()  outFname = "$tmp.txt"  'Tempファイル  Open outFname For Output As #outFno    Do Until EOF(inFno)    Line Input #inFno, tmp    If Len(tmp) > 9 Then      tmp = Mid$(tmp, 3)      tmp = Mid$(tmp, 1, 5) & Space(1) & Mid$(tmp, 6)    End If    Print #outFno, tmp    tmp = ""  Loop   Close #inFno   Close #outFno   Application.Documents.Open FileName:="$tmp.txt", Format:=wdOpenFormatText End Sub

  • okormazd
  • ベストアンサー率50% (1224/2412)
回答No.2

テキストファイルを読み込んで、これをいきなり実行すれば、たぶん、 最初の3文字を削除して、5,6文字目の間にスペースを入れて、1行下にずれて8文字戻る。 6文字目から8文字戻るから、1行目の最後から(段落記号も数えて)2文字目に戻るということか。 なにかの都合なのだろう。 行数分だけ実行するということだが、文字数が足りない行があれば、行数分だけ実行できないかもしれない。8文字戻れないかもしれない。このテキストファイルにはそういう恐れはないのですか。 さて、行数だが、次で取れるけど、実行しているうちに行数が変わってしまう恐れがあるが、その処理は適当に考えて・・・。 Sub 整形() Set temp = Dialogs(wdDialogToolsWordCount) temp.Execute numlines = temp.Lines  '文書の行数 '以下 'For 文などで回数分実行 Selection.Delete Unit:=wdCharacter, Count:=1 Selection.Delete Unit:=wdCharacter, Count:=1 Selection.Delete Unit:=wdCharacter, Count:=1 Selection.MoveRight Unit:=wdCharacter, Count:=5 Selection.TypeText Text:=" " Selection.MoveDown Unit:=wdLine, Count:=1 Selection.MoveLeft Unit:=wdCharacter, Count:=8 End Sub

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.1

こんにちは。 質問する場合は、コードだけで、分かってもらえればよいのですが、出来る限り、マクロの前と希望の形を示してくださいね。こちらの誤解している可能性もないとは言えませんから。 例: Abcあいうえおかきくけこ    ↓ あいうえお かきくけこ ←半角スペースが、「お」と「か」の間に入る >Selection.MoveLeft Unit:=wdCharacter, Count:=8 なお、なぜ、左に8つなのか、この意味が良く分かりません。 ------------------------------------- もし、こういう形でよいのでしたら、こんなマクロになります。 また、Text ファイルの場合は、テキストの中で処理したほうが、速いかもしれません。Wordには、直接、行自体のコンセプトがはっきりしませんので、ちょっとややこしくなります。 Sub 整形2() Dim para As Paragraph Dim rngPara As Range  Selection.HomeKey Unit:=wdStory  For Each para In ActiveDocument.Paragraphs   Set rngPara = para.Range    If Len(rngPara.Text) > 5 Then      rngPara.Collapse Direction:=wdCollapseStart      Selection.MoveRight Unit:=wdCharacter, Count:=3, Extend:=wdExtend      Selection.Delete      Selection.MoveRight Unit:=wdCharacter, Count:=5      Selection.InsertAfter Text:=" "    End If    Selection.Move Unit:=wdParagraph  Next para End Sub

HEIZO_kun
質問者

補足

早速の回答ありがとうございます。 整形するテキストの元データ-は 00012345____1234567890123456.........(改行) 00012345____1234567890123456.........(改行)            ・            ・            ・ と続く形式で提供されます。 これを取引先のフォームに変換するために 12345_______1234567890123456.........(改行) と言った具合に左の000を削除して右のスペースを3つ増やすという作業 をマクロで組みたかったのです。 会社のパソコンでしたので、シェアウェアなどの高機能テキストエディタ をインストゥールすることができず、今、あるソフトで行おうと試みた結 果だったのです。 説明不足ですみませんでした。 左に8つ戻るのは、「マクロを記録」コマンドでキー操作のままマクロを 作ったために、1つ1つキーを追う形となってしまいました。

関連するQ&A

  • Wordのマクロの繰り返しと停止

    Wordで"XX"の場所に"★"の後にある文字列を挿入、という以下のマクロを記録したのですが、この作業を★がなくなるまで繰り返したいと思っております。どのように記入すればよいでようか? Selection.HomeKey Unit:=wdStory Selection.Find.ClearFormatting With Selection.Find .Text = "★" .Forward = True .Wrap = wdFindContinue .Format = False .MatchCase = False .MatchWholeWord = False .MatchByte = False .MatchAllWordForms = False .MatchSoundsLike = False .MatchWildcards = False .MatchFuzzy = False End With Selection.Find.Execute Selection.Delete Unit:=wdCharacter, Count:=1 Selection.Delete Unit:=wdCharacter, Count:=1 Selection.EndKey Unit:=wdLine, Extend:=wdExtend Selection.Cut Selection.HomeKey Unit:=wdStory Selection.Find.ClearFormatting With Selection.Find .Text = "XX" .Forward = True .Wrap = wdFindContinue .Format = False .MatchCase = False .MatchWholeWord = False .MatchByte = False .MatchAllWordForms = False .MatchSoundsLike = False .MatchWildcards = False .MatchFuzzy = False End With Selection.Find.Execute Selection.Paste Selection.TypeBackspace End Sub

  • ワード2007、ヘッダーのマクロでフォントサイズを変更したい。

    ワード2007、ヘッダーのマクロでフォントサイズを変更したい。 windows7、word2007 ヘッダーにファイル名、ページ数、作成日を表示させるマクロを”マクロの記録”で作りました。 夫々にはフィールドを指定してあります。 Sub header() ' ' header Macro ' ' If ActiveWindow.View.SplitSpecial <> wdPaneNone Then ActiveWindow.Panes(2).Close End If If ActiveWindow.ActivePane.View.Type = wdNormalView Or ActiveWindow. _ ActivePane.View.Type = wdOutlineView Then ActiveWindow.ActivePane.View.Type = wdPrintView End If ActiveWindow.ActivePane.View.SeekView = wdSeekCurrentPageHeader Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, Text:= _ "FILENAME \* DBCHAR ", PreserveFormatting:=True Selection.TypeText Text:=vbTab Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, Text:= _ "PAGE \* ArabicDash ", PreserveFormatting:=True Selection.TypeText Text:=vbTab & " " Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, Text:= _ "CREATEDATE \@ ""作成日 :ggge年M月d日"" ", PreserveFormatting:=True Selection.TypeParagraph Selection.TypeText Text:=vbTab & vbTab & " " Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, Text:= _ "SAVEDATE \@ ""更新日 :ggge年M月d日"" ", PreserveFormatting:=True WordBasic.GoToFooter Selection.TypeText Text:=vbTab Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, Text:= _ "PAGE ", PreserveFormatting:=True Selection.TypeText Text:="/" Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, Text:= _ "NUMPAGES ", PreserveFormatting:=True End Sub 文書本文の文字サイズは13ptですがフッター部は9ptにしたいと思います。 修正する方法を教えて貰えるとありがたいです。 よろしくお願いいたします。

  • wordのマクロでクリップボードの処理

    WORD文書上に、「c:\....jpg」という画像へのアドレスが複数あるとします。そのアドレスを画像に差し替えたいのですがうまくいきません。。 とりあえずマクロでまず「c:\\*jpg」で検索をかけて、文字列をコピー、その文字列を使って図の挿入をしようと思っています。 Sub Macro1() Dim 画像 Selection.Find.ClearFormatting With Selection.Find .Text = "C:\\*jpg" .Replacement.Text = "" .Forward = True .Wrap = wdFindContinue .Format = False .MatchCase = False .MatchWholeWord = False .MatchByte = False .MatchAllWordForms = False .MatchSoundsLike = False .MatchFuzzy = False .MatchWildcards = True End With Selection.Find.Execute Selection.Copy ※クリップボードの内容を変数「画像」へ代入 Selection.Delete Unit:=wdCharacter, Count:=1 Selection.InlineShapes.AddPicture FileName:= _ 画像, LinkToFile:=False, SaveWithDocument:= _ True End Sub 以上が今考えているマクロなんですが、※の部分で変数「画像」へクリップボードから代入をする処理がどうにもうまくいきません。 wordのマクロは初めていじるのでよくわかりません。 どなたかわかる方教えてください。よろしくお願いします。

  • WORD VBA 繰り返し処理

    WORD VBAについて教えてください。 つぎのようなマクロがあり、これを検索する文字列がなくなるまで、繰り返して、処理するようにしたいのですが、どうすればよいのでしょうか? Sub Macro1() Selection.Find.ClearFormatting With Selection.Find .Text = "あ" .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.MoveRight Unit:=wdCharacter, Count:=1 End Sub

  • 指定した行に文字を入力するVBAコードは?

    ワードのマクロで、「上から6行目に文字を入れる」 と言う事をしたい場合は、 ------------------ Sub Macro1() Selection.TypeParagraph Selection.TypeParagraph Selection.TypeParagraph Selection.TypeParagraph Selection.TypeParagraph Selection.TypeText Text:="あああ" End Sub や Sub Macro2() Dim i As Long For i = 1 To 5 Selection.TypeParagraph Next Selection.TypeText Text:="あああ" End Sub ------------------ としなくては駄目でしょうか? エクセルのように、「●行目に文字を入力する」と指定できないかどうかが知りたいです。 オブジェクトブラウザで「Range」を検索したら、Rangeオブジェクトがあったので、 行の指定ができるのかな?と思いました。 ご教授よろしくお願いします。

  • ワードでマクロがうまくいきません。

    よろしくお願いします。 マクロの知識はほとんどないのですが、 「マクロの記録」の機能を使い、ワードで 「スペースを探し出し、そのスペースにアンダーラインを引く。」 ために、 -------------------- 編集ー置換ー 検索する文字列にスペースをタイプ、 置換後の文字列にスペースをタイプ、 オプションの書式で、フォント、下線、一重下線 すべて置換 -------------------- マクロの記録を選択した後、上のように作業しました。 そしてマクロの記録をとめました。 マクロの記録中の操作では、思い通りに置換されるのですが、 次にそのマクロを作動させると、なにもおこりません。 なにか変な操作をしたのか、と五度くらい試したのですが、 やはり動きません。 中身は、↓のようでした。 -------------------- Sub Macro2() ' Selection.Find.ClearFormatting Selection.Find.Replacement.ClearFormatting With Selection.Find .Text = " " .Replacement.Text = " " .Forward = True .Wrap = wdFindContinue .Format = True .MatchCase = False .MatchWholeWord = False .MatchByte = False .MatchAllWordForms = False .MatchSoundsLike = False .MatchWildcards = False .MatchFuzzy = True End With Selection.Find.Execute Replace:=wdReplaceAll End Sub -------------------- どうしてうまく動かないのでしょうか。 教えていただけるとありがたいです。よろしくお願いします。

  • Wordマクロ

    Wordでワイルドカードを使った置換マクロを作ったのですが、 「MatchWildcardsとMatchSoundsLike、MatchAllWordForms、MatchFuzzyは、同時にTrueに設定することはできません。」 というエラーが出てしまいます。 MatchSoundsLike、MatchAllWordForms、MatchFuzzyは、 ソースに書いてないしTrueにもしていません。 どこが悪いのでしょうか? 以下がソースファイルです、よろしくお願いいたします。 Sub substitute() ' Selection.Find.ClearFormatting Selection.Find.Replacement.ClearFormatting With Selection.Find .Text = "[!a-f]{1,}" .Replacement.Text = "@" .Forward = True .Wrap = wdFindContinue .Format = False .MatchCase = False .MatchWholeWord = False .MatchByte = False .MatchAllWordForms = False .MatchSoundsLike = False .MatchWildcards = True .MatchFuzzy = False End With Selection.Find.Execute Replace:=wdReplaceAll End Sub

  • Word2007のマクロについて

    こんにちは。 Word2007のマクロについて質問させて下さい。 ・タイトル行が(16738047)色で、本文が黒文字の日本語の文書があります。 ・タイトル行内でキーワード検索を行いたいです。 ・1個ずつ内容を確認したいので「次を検索」 MsgBoxを使用しています。 以下のコードを実行すると、単語が1個飛ばしに選択されてしまいます。 どこを変更すればいいでしょうか? 教えてください。よろしくお願いします。 Sub タイトル検索() Dim myKW As String 'キーワード myKW = InputBox("検索する文字を入力して下さい") Selection.HomeKey Unit:=wdStory 'カーソルを文頭に移動 With Selection.Find .ClearFormatting .Font.Color = 16738047 .Text = myKW .MatchWildcards = False .MatchFuzzy = False If Len(myKW) = 0 Then Exit Sub If .Execute = True Then Do While .Execute If MsgBox("次を検索", vbokcansel, "確認") = vbOK Then Selection.Find.Execute End If Loop   MsgBox "処理が終了しました。" Else MsgBox "文字はありませんでした。" End If End With With Selection.Find ' 検索・置換のクリア .ClearFormatting: .Replacement.ClearFormatting .Text = "": .Replacement.Text = "" .MatchWildcards = False: .MatchFuzzy = False End With End Sub

  • Wordでマクロを用いたチェックボックスについて

    Word2003までは下記のマクロでチェックボックスを作成することができたのですが、Word2013で作成し実行すると、  実行時エラー'5941'  指定されたコレクションのメンバーは存在しません。 となり作成できません。 デバッグをクリックすると、  Set myRange = Selection.Fields(1).Code の行に印が付きます。 修正方法や、Word2013にてマクロでチェックボックスを作成するコマンドをご存じの方がいらっしゃいましたら、よろしくお願いい致します。 Sub FldCbox()  Dim myRange As Range  '  Set myRange = Selection.Fields(1).Code  '  If myRange.Text = "MACROBUTTON FldCbox " & ChrW(9744) Then   myRange.Text = "MACROBUTTON FldCbox " & ChrW(9745)  Else   myRange.Text = "MACROBUTTON FldCbox " & ChrW(9744)  End If  '  With Selection   .Fields(1).Update   .Fields(1).ShowCodes = False   .SetRange Selection.End, Selection.End  End With End Sub

  • word2007 マクロ

    下記マクロは蛍光ペンの箇所を括弧と空欄で書き換え、穴あき問題にするマクロです。 これを、文字数の分だけ、空欄をつくるにはどうすればいいのか? また、蛍光ペンではなく、赤文字を括弧と空欄で書き換えるにはどうすればいいのか、 教えて頂けたら幸いです。 Sub Macro7() Selection.HomeKey wdStory '文章の最初をカーソル移動 p1: Selection.Find.ClearFormatting Selection.Find.Highlight = True '蛍光ペンを問題にする With Selection.Find .Text = "" '文字は問題にしない .Replacement.Text = "" .Forward = True .Wrap = wdFindContinue .Format = True .MatchCase = False .MatchWholeWord = False .MatchByte = False .MatchAllWordForms = False .MatchSoundsLike = False .MatchWildcards = False .MatchFuzzy = True End With Selection.Find.Execute '検索実行 If Selection = m Then Exit Sub '同じところを繰り返し見つけ出したら終わる x = "(        )" 'カッコで囲む語句を作成(蛍光ペンなし) m = x '終わり判定のため保存 Selection.Delete '一旦消して Selection.InsertAfter x 'カッコつきを挿入。いわば置換 GoTo p1 End Sub

専門家に質問してみよう