Wordのページ数の取得

このQ&Aのポイント
  • Wordのページ数を取得する方法について質問させていただきます。
  • 2バイト文字の検索のコアな部分は出来ているものの、ページ番号の取得が上手くできない状況です。
  • ページ番号を取得する他のオブジェクトやページ単位での処理方法についての代替案をお教えください。
回答を見る
  • ベストアンサー

Wordのページ数の取得

お世話になります。 前回、「Word, Excel, PowerPointで2バイト文字検索」質問させていただいた者です。 http://oshiete1.goo.ne.jp/kotaeru.php3?q=1269218 2バイト文字の検索のコアな部分は出来ているのですが、検索が見つかった場合そのページにジャンプさせることが上手く出来ません。 ページをジャンプさせる方法その物は分かったのですが、オブジェクトからページ番号を取得する方法が分かりません。 テキストは以下のように取得しています(i,jはそれぞれ.count分ループ)。 Application.Documents.Item(i).Words(j).Text Application.Documents.Item(i).Shapes.Item(j).TextFrame.TextRange.Text 下記のオブジェクトからページ番号を取得する方法はございますでしょうか。 Application.Documents.Item(i).Words(j) Application.Documents.Item(i).Shapes.Item(j).TextFrame.TextRange または、逆にページ単位で処理を行い、ページ内にあるオブジェクトを取得する方法はございますでしょうか。 代替の方法がございましたらそちらでも構いません。 以上、宜しくお願い致します。

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

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

>下記のオブジェクトからページ番号を取得する方法はございますでしょうか。 >Application.Documents.Item(i).Words(j) >Application.Documents.Item(i).Shapes.Item(j).TextFrame.TextRange http://oshiete1.goo.ne.jp/kotaeru.php3?q=1269218 そこからは、ページを取ることは不可能だと思います。Word の質問の回答では、みなさん、同じパターンになるようです。(某掲示板にも遣り残しがありました)それは、Text の入れ物であって、その先があります。 私のやり方は、正規表現を使います。最初に、文字列を確保していき、その後で、それを置換でハイライト化していく方法を取ります。 それで、最初、Findメソッドを使うのですが、Excelよりも、何かを付け忘れたりすると、失敗することがあるので、一応、全部、オプションはつけて置きました。 また、今回、正規表現を使っていますが、全ての2バイト文字をサポートしているわけではありませんので、パターンの部分を、その文字の領域に従って書き換えてください。InStr で、取る方法もあるのですが、私は、正規表現のほうがなじみが深いのです。 ここのサイトは、単発回答がほとんどで、もし、何かありましても、私がフィードバックできないことがあるかもしれませんので、あらかじめ、お詫びしておきます。 Option Explicit Sub TwoByteStrFindProc() '参照設定 Microsoft VBScript Regular Expressions 5.5 Dim objRegExp As New RegExp Dim mySelection As Selection Dim Matches As Object Dim Match Dim TowByte() Dim sLength As Long Dim i As Long Options.DefaultHighlightColorIndex = wdTurquoise Selection.HomeKey Unit:=wdStory Selection.EndKey Unit:=wdStory, Extend:=wdExtend Set mySelection = Selection   With objRegExp     .Global = True     .IgnoreCase = True     .Pattern = "[\u3041-\u30FA\u4E00-\u9FA5\uff01-\uff9f]+"     Set Matches = .Execute(mySelection)     sLength = 0   End With   For Each Match In Matches        ReDim Preserve TowByte(i)        TowByte(i) = Match.Value        i = i + 1   Next Match   If Matches.Count = 0 Then MsgBox _   "該当する検索文字が見つかりません", 64: Exit Sub   For i = 0 To UBound(TowByte)    WordHilightProc TowByte(i)   Next   Options.DefaultHighlightColorIndex = wdNoHighlight End Sub Private Sub WordHilightProc(ByVal myStr As String)  Dim myRange As Range  Selection.Find.ClearFormatting  With Selection.Find   .Text = myStr   .Replacement.Text = ""   .Forward = True   .Wrap = wdFindContinue   .Format = False   .MatchCase = False   .MatchWholeWord = False   .MatchByte = False   .MatchAllWordForms = False   .MatchSoundsLike = False   .MatchWildcards = False   .MatchFuzzy = False  End With  With Selection    .Find.ClearFormatting    .Find.Replacement.ClearFormatting    .Find.Replacement.Highlight = True   If .Find.Forward = True Then    .Collapse Direction:=wdCollapseStart    Else    .Collapse Direction:=wdCollapseEnd   End If   .Find.Execute Replace:=wdReplaceOne   If .Find.Forward = True Then    .Collapse Direction:=wdCollapseEnd    Else    .Collapse Direction:=wdCollapseStart   End If   .Find.Execute  End With End Sub

deka_pink
質問者

お礼

返事が遅くなってしまい申し訳ございません。 頂いたソースコードを実際に実行して見たのですが、現在の正規表現ではやはり漏れがあるようです。 問題を解決するにはSJISの2バイト文字がUNICODEのどの部分に割り当てられているかを厳密に調査する必要があるように思えましたので、今回はこの検索方法は見送らせて頂きました。 大変ご丁寧なプログラムを御提示して頂いたにも関わらず大変申し訳ございません。 VBScriptを使用した正規表現での検索は他にも応用が利くと思いますので、今回は大変勉強になりました。 ありがとうございました。

関連するQ&A

  • Excel VBA テキストボックスの値の取得

    テキストボックスの値が必要となり参照しようと思い、検索したところdebug.printにある3つの方法がヒットし、試して見ましたが、エラーになります。 テキストボックスの名前にはどれもtxtの文字を含んでいます。 Sub ShapeValue() Dim Shp As Shape For Each Shp In ActiveSheet.Shapes If InStr(Shp.Name, "txt") <> 0 Then Debug.Print Shp.TextFrame.Characters.Text 'オブジェクトは、このプロパティまたはメソッドをサポートしていません。 Debug.Print Shp.TextFrame2.TextRange.Text '指定された値は境界を超えています。 Debug.Print Shp.ShapeRange.TextFrame.Characters.Text 'オブジェクトは、このプロパティまたはメソッドをサポートしていません End If Next Shp End Sub どうすれば取得できるでしょうか?

  • テキストボックスの表示

    VBAを使って、テキストボックスに表示される内容を設定しているのですが、 下記のように記述とOKですが、 Shapes.Range(Array("Text Box 1")).Select Selection.ShapeRange(1).TextFrame2.TextRange.Characters.Text = "test" Selectを抜かして、 Shapes.Range(Array("Text Box 1")).ShapeRange(1).TextFrame2.TextRange.Characters.Text = "test" のように記述するとエラーになります。 原因がよくわからないのですが、なぜなのでしょうか?

  • エクセルVBAでテキストボックスに文字

    Excel2016です。 ワークシート上に配置した、図形の「テキストボックス」に文字を入れるVBAについての質問です。 下記のTEST01では期待通り文字が入りますが、これはテキストボックスをSelectしなければなりません。 TEST02ならSelectせずにOKかと思ったら実行時エラーとなりました。 どのように修正したらよろしいのでしょうか? Sub TEST01()   Sheets(“Sheet1”).Shapes.Range(Array("TextBox 3")).Select   Selection.ShapeRange.TextFrame2.TextRange.Characters.Text = "TEST/TEST/2020"   Selection.ShapeRange.TextFrame2.TextRange.Font.Name = "Meiryo UI"   Selection.ShapeRange.TextFrame2.TextRange.Font.Bold = msoTrue End Sub Sub TEST02()   With Sheets(“Sheet1”).Shapes.Range(Array("TextBox 3"))     .ShapeRange.TextFrame2.TextRange.Characters.Text = "TEST/TEST/2020"     .ShapeRange.TextFrame2.TextRange.Font.Name = "Meiryo UI"     .ShapeRange.TextFrame2.TextRange.Font.Bold = msoTrue   End With End Sub

  • パワーポイントVBAで

    http://q.hatena.ne.jp/1144314367 これと同じような事をしたくて、 Sub TextBoxToDebugPrint() Dim slide For Each slide In ActiveWindow.Parent.Slides Dim shape For Each shape In slide.Shapes Debug.Print shape.TextFrame.TextRange.Text Next Next End Sub を張り付けたのですが、一部の文字は取得できますが、 実行時エラー -2147024809 指定された値は境界を超えています。 と言うエラーが発生し、止まってしまいます。 どもオブジェクトがどういう意味のエラーを出してるのかわからないのですが どういう意味でしょうか?

  • ページ内検索の限界?

    以下のjavascriptを記述してページ内のテキストを検索して移動するという処理をしているのですが、HTMLソースで5万行以降のテキストの検索ができません。 5万行以下のテキストの検索はできるのですが、5万行を超えるテキストを検索すると反応しません。 これはjavascript上の制限事項になるんでしょうか? var fFirst; //はじめかどうかのフラグ var objRange; //TextRangeオブジェクト //検索関数 function Start() { objRange = document.body.createTextRange(); //文字列が空であれば終了 if (document.search_form.txtWord.value.length == 0) { return; } strCheck = document.search_form.txtWord.value; if (fFirst) { fFirst = false; } else { //2度目以降 objRange.move("character", 1); } //セレクトする if (objRange.findText(strCheck)) { objRange.select(); objRange.scrollIntoView(); } }

  • ExcelのデータをPPTにエクスポートしたいです(VBA初心者)

    ExcelのデータをPPTにエクスポートしたいです(VBA初心者) ネット検索などをして、下記の手順でエクスポートすることまではできたのですが、 これだと全てのセルデータがPPTの1つのテキストに入ってしまいます。 希望しているのは、セルごとにエクスポート先の テキストボックスを分けたいのですが、 ここから先が分かりません。 どなたかご教授いただけませんか。 よろしくお願いします。 <Excel> A B C D E 1 会社名(1) 住所(1) 担当者(1) 2 会社名(2) 住所(2) 担当者(2) 3 会社名(3) 住所(3) 担当者(3) <PPT> ・Sheet1 テキストボックス1   会社名(1) テキストボックス2   住所(1) テキストボックス3   担当者(1) ・Sheet2 テキストボックス1   会社名(2) テキストボックス2   住所(2) テキストボックス3   担当者(2) --------------------------------------- Sub ExceltoPowerPoint() Dim objRng As Range Dim varRng As Variant Dim intSNum As Integer Dim i, j As Integer Dim PpApp As PowerPoint.Application Dim PpPrs As PowerPoint.Presentation Set objRng = Worksheets("Sheet1").Range("A1:C5") varRng = objRng.Value Set objRng = Nothing Set PpApp = CreateObject("PowerPoint.Application") Set PpPrs = PpApp.Presentations.Add PpApp.Visible = True intSNum = 1 For i = 1 To UBound(varRng, 1) PpPrs.Slides.Add i, ppLayoutBlank PpPrs.Slides(i).Shapes.AddTextbox msoTextOrientationHorizontal, 0, 0, 710, 540 Next For i = 1 To UBound(varRng, 1) For j = 1 To UBound(varRng, 2) With PpPrs.Slides(intSNum).Shapes(1).TextFrame.TextRange If j = UBound(varRng, 2) Then .Text = .Text & CStr(varRng(i, j)) & vbNewLine intSNum = intSNum + 1 Else .Text = .Text & CStr(varRng(i, j)) & vbNewLine End If End With Next Next For i = 1 To UBound(varRng, 1) With PpPrs.Slides(i).Shapes(1).TextFrame.TextRange .Font.NameAscii = "Arial" .Font.NameFarEast = "MS Pゴシック" .Font.NameOther = "Arial" .Lines(1).Font.Size = 10 '1行目 .Lines(2).Font.Size = 30 '2行目 .Lines(3).Font.Size = 20 '3行目 End With Next MsgBox "処理が終了しました。" Set PpPrs = Nothing Set PpApp = Nothing End Sub ---------------------------------------

  • PowerPoint2003でノートを一括削除するVBA

    調べたところ Sub test() Dim i As Integer i = ActivePresentation.Slides.Count For i = 1 To i With ActivePresentation.Slides(i).NotesPage .Shapes.Placeholders(2).TextFrame.TextRange = "" End With Next i End Sub   というマクロでいけるそうなのですが、幾つか試すと 「実行時エラー '2147188160(80048240)」': Placeholders(不明なメンバー):範囲外の整数2は次の有効な範囲にありません:1から1へ」 というエラーで停まるものがあります。   これの回避方法をご存知の方がいたら教えてください。

  • エクセル2007でVBAが動きません、助けて下さい

    先日、使用していたエクセルを2003から2007に変更した所、 オブジェクトのテキストが読み込めなくなってしまいました。 マクロの記録なども試したのですが、問題が解決せず 困っています。 原因が分かる方が入らしたら、ぜひとも教えてください。 =================================== Sub namae() Dim namae1 As String Dim namae2 As String namae1 = Application.Caller namae2 = ActiveSheet.Shapes(namae1).TextFrame.Characters.Text MsgBox namae2 End Sub

  • Javascriptで生成されたページの情報取得方法

    Javascript初心者です。 ある画面で検索条件を指定して、送信ボタンを押下すると、検索結果をJavascriptで生成したページで表示するサイトがあります。結果はテーブルで表形式に表示されます。 この検索結果をJavascriptかVBscriptで取得したいと考えています。 HTML情報とテキスト情報両方とも取得できたらうれしいです。 document.all(1).innerHTML で取得しても、実際の画面に表示されているHTMLとは異なる情報しか取得できません。 生成後のHTML情報の取得方法をご教授ください。

  • オブジェクト数の取得

    以下のようなテキストボックスがあります。 <input type="text" name="price1[0]"> <input type="text" name="price2[0]"> <input type="text" name="price3[0]"> <input type="text" name="price1[1]"> <input type="text" name="price2[1]"> <input type="text" name="price3[1]"> ・・・・ 添え字は[0]、[1]、[2]・・・となり、 データにより可変となっています。 入力するのは金額なので、数値かどうかのチェックを行いたいのですが、テキストフィールドの個数をどのように取得したらよいかがわかりません。 他のオブジェクトとのからみで、name="price1[]"のように変更することはできません。 (このようにすると、オブジェクト数は取得できるのですが) 上記記述のオブジェクト数の取得方法がわかる方、教えてください。テキストは金額のみなので、テキストフィールド全ての個数でもよいですし、price1[]、price2[]、price3[]各々の個数でもどちらでもよいです。 よろしくお願いいたします。