質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

91.87%

  • VBA

    829questions

    VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

  • VB.NET

    544questions

    Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

  • マクロ

    103questions

    定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

vba エクセルページ数 取得 について

解決済

回答 2

投稿 2016/01/27 08:14 ・編集 2016/01/27 10:19

  • 評価
  • クリップ 0
  • VIEW 3,585

sehiro

score 7

下記のプログラムを参考にして、各ブックごとのページ数の合計を出力するには、どうしたら良いでしようか。宜しくお願いします。
各ブックごととは、指定したフォルダ内にある複数のブックです。どうぞ宜しくお願いします。 指定したフォルダ内にあるファイル名とページ数を取得するのが目的です。ファイル名までは出力されますが、ページ数の取得でうまくいかず、下記のプログラムを参考に作成したいと考えております。 
出力イメージ 
テーマ 工程 ファイル名 ページ数 
1     設計     .xlsx 3ページ 
2     設計     .xlsx 2ページ

'=============================================
' ページ数を取得してシート一覧表を作成
'=============================================
Sub ページ数を取得してシート一覧表を作成()

    Dim mysheet As Worksheet    '各シート
    Dim page_sum As Integer     'ページ数
    Dim list() As Variant       'シート名とページ数格納用
    Dim i As Integer            '配列添え字用
    Dim maxi As Integer         '配列最大添え字用

    '-----------------------------------------
    ' シート名とページ数を配列に代入
    '-----------------------------------------
    maxi = 0

    'ブックの各シートごとに
    For Each mysheet In Worksheets

        'シートのページ数取得
        mysheet.Activate
        page_sum = Application.ExecuteExcel4Macro("get.document(50)")

        '配列にシート名とページ数を代入
        ReDim Preserve list(1, maxi)
        list(0, maxi) = mysheet.Name
        list(1, maxi) = page_sum
        maxi = maxi + 1

    Next mysheet

    '-----------------------------------------
    ' 配列をブックに転記
    '-----------------------------------------

    'リストタイトル設定
    Range("A1").Value = "シート名"
    Range("B1").Value = "ページ数"

    '配列転記
    For i = 0 To maxi - 1
        Range("A" & i + 2) = list(0, i)
        Range("B" & i + 2) = list(1, i)
    Next

End Sub

  • 気になる質問をクリップする

    クリップした質問に回答があった場合に通知・メールを受け取ることができます。

    クリップした質問はマイページの「クリップ」タブからいつでも見ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • hsk

    2016/01/27 09:24

    おはようございます。「各ブックごと」とご質問にありますが、自分のブックだけではなくて、どこかほかにある複数のブック(ファイル)について処理を行うと考えて合っているでしょうか?どこかのフォルダ内に入っているブック群でしょうか?もしくは、集計シートに対象のブックのファイル名を書いておいたりするのでしょうか?

    キャンセル

  • sehiro

    2016/01/27 10:15

    おはようございます。質問内容が不足しており申し訳ありません。 各ブックごととは、指定したフォルダ内にある複数のブックです。どうぞ宜しくお願いします。 指定したフォルダ内にあるファイル名とページ数を取得するのが目的です。ファイル名までは出力されますが、ページ数の取得でうまくいかず、上記のプログラムを参考に作成したいと考えております。 出力イメージ テーマ 工程 ファイル名 ページ数 1 設計 .xlsx 3ページ 2 設計 .xlsx 2ページ

    キャンセル

回答 2

checkベストアンサー

0

ご質問の内容、拝見しました。サンプルを作成してみました。説明が冗長でしたらスミマセン...
自分のブック内を参照するときはWorksheetsと書くだけで自分自身のWorkbookオブジェクト(ActiveWorkbookあるいはThisWorkbook)を暗黙的に参照しているのですが
(つまり For Each mysheet In Worksheets は、(省略せずに書くと)内部的には For Each mysheet In Application.ActiveWorkbook.Worksheets のようになっています)
他のブックを参照するときは、OpenAdd関数で明示的に開いて、そこで得たオブジェクト変数から参照や操作を行います。

Option Explicit

Public Sub Sample()
    ' 転記先(アクティブなシート?)をオブジェクト変数myWsにセットしておきます。
    Dim myWs as Excel.Worksheet
    Set myWs = ActiveSheet

    '※ファイルパスは投稿時バックスラッシュ(\)になってしまいましたが、円マーク(¥)です
    Dim folderPath As String
    folderPath = "(フォルダ)\*.xls*"

    ' Dir関数でフォルダ内のファイルを列挙します
    Dim fileName As String
    fileName = Dir(folderPath)

    Do Until (fileName = "")
        ' ブックのファイルパスをxlsFilePathに生成します。
        Dim xlsFilePath As String
        xlsFilePath = folderPath & "\" & fileName

        ' ブックを開き、参照用につかうオブジェクト変数wbへ格納します(念のために、今回はReadOnly=True)
        Dim wb As Excel.Workbook
        Set wb = Workbooks.Open(xlsFilePath, , True)

        ' ブックwbの各シートをFor Eachで列挙して、参照用につかうオブジェクト変数wsに格納して操作します。
        Dim ws As Excel.Worksheet
        For Each ws In wb.Worksheets
            ' ここに、処理(ページ数の計算と、集計セルへの出力)を書きます。
            MsgBox ws.Name
            myWs.Range("A1").Value = "サンプル" ' 例
        Next

        ' ブックの操作が終わったので閉じます。
        wb.Close

        fileName = Dir()    ' これ以上ブックがなければ fileName = ""
    Loop
End Sub

投稿 2016/01/27 11:04

編集 2016/01/27 11:20

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    以下のような回答は評価を下げられます

    • 間違っている回答
    • 質問の回答になっていない投稿
    • 不快な投稿

    評価を下げる際はその理由をコメントに書き込んでください。

  • 2016/01/27 11:07

    ありがとうございます。参考にさせて頂きます。

    キャンセル

  • 2016/01/27 14:12

    たびたびすいません。下記のvbaで、 ' ここに、処理(ページ数の計算と、集計セルへの出力)を書きます。
    とありますが、今回はブック内の総ページ数のみ、出力したいので、総ページのみ出力するには、どのような処理にすれば良いかもアドバイス頂けないでしようか。宜しくお願い致します。

    ' ブックwbの各シートをFor Eachで列挙して、参照用につかうオブジェクト変数wsに格納して操作します。
    Dim ws As Excel.Worksheet
    For Each ws In wb.Worksheets
    ' ここに、処理(ページ数の計算と、集計セルへの出力)を書きます。
    MsgBox ws.Name
    myWs.Range("A1").Value = "サンプル" ' 例
    Next

    キャンセル

  • 2016/01/27 14:24

    ブックの総ページ数=ブック内の全シートの合計ページ数、で合っているでしょうか?
    でしたら、
    シートを列挙するループの前にpage_sumをゼロクリアして

    page_sum = page_sum + Application.ExecuteExcel4Macro("get.document(50)")

    で、地道に加算していくことになるかと思います。

    調べてみましたら、ほぼズバリのページが見つかりましたよ!

    http://d.hatena.ne.jp/asuka0801/20110605/1307232920

    'ページ数を取得にゃー
    のあたりが、ページ数加算の箇所ですね。

    キャンセル

  • 2016/01/28 02:42

    ありがとうございます。参考にさせて頂きます。

    キャンセル

  • 2016/01/28 12:12

    ブックの総ページが出力されるようになりました。ありがとうございます。後、総ページ出力時に下記のように表示させたいのですが、ページ数の書式設定について教えて頂けないでしようか。宜しくお願いします。

    総ページ数
    3ページ

    キャンセル

  • 2016/01/28 17:14 編集

    セルに Range.NumberFormat プロパティを指定することで、VBAから書式設定が可能です。

    https://msdn.microsoft.com/ja-jp/library/office/ff196401.aspx

    手操作でセルに書式設定(ユーザー定義)する方法と同じ書式指定文字列を指定します。
    ##0"ページ" のような感じでしょうか。

    ちなみに「マクロの記録」機能から、自分が行った実際の操作をVBAのコードに自動生成してくれますので、VBAでどう書けばよいかわからない場合に有用ですよ。

    http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_01_2007.html

    http://kokodane.com/2010/excel2010macro_05.htm

    http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_01.html

    キャンセル

  • 2016/01/29 00:00

    ありがとうございます。「マクロの記録」機能を利用して無事に作成できました。

    キャンセル

0

対象のブックを既に開いているのであれば、シートをループする前にブックをループしてあげればいいと思います。

'ブックのループ
  For Each mybook In Workbooks
      'ブックごとに合計ページ数をリセット
      page_sum = 0
      '取得したブックのシートをループ
      For Each mysheet In mybook.Worksheets

          ・・・

          '合計ページ数にシートのページ数を加算
          page_sum = page_sum + Application.ExecuteExcel4Macro("get.document(50)")

  ・
  ・
  ・

対象ブックを開きながら処理する場合も、やはりシートをループする前に対象ブック数分のループを行い、ブックのオープン・クローズをしながらページ数を加算していけばいいと思います。

'ブックのループ
  For ~ ブック数分のループ
      Set mybook = Workbooks.Open("xxx.xlsx")
      'シートのループ
      For ~ ブック数分のループ
          'ページ数の加算
      Next シート
      mybook.Close
  Next ブック

完成形のコードは提示していませんが、がんばってみてください。

投稿 2016/01/27 10:44

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    以下のような回答は評価を下げられます

    • 間違っている回答
    • 質問の回答になっていない投稿
    • 不快な投稿

    評価を下げる際はその理由をコメントに書き込んでください。

  • 2016/01/27 11:08

    ありがとうございます。参考にさせて頂きます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

ただいまの回答率

91.87%

関連した質問

同じタグがついた質問を見る

  • VBA

    829questions

    VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

  • VB.NET

    544questions

    Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

  • マクロ

    103questions

    定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

閲覧数の多いVBAの質問