Dir関数の注意
Windows由来の問題で3文字より長い拡張子を3文字に切り詰めるらしく、xls
でxlsx
もxlsm
も取れてしまうらしい。ヤバイ。
Office TANAKA - Excel VBA Tips[Dir関数の注意点]ページ数を取得するPageSetup.Pages.CountがExcel2007~2010でバグってる?
改ページプレビューの状態で参照することで正しいページ数が取れるみたい。
Excel 2007 および Excel 2010 で Pages.Count プロパティを取得すると実際の印刷総ページ数と異なる値を取得するシートをSelectした後改ページプレビューにするのが早すぎるとうまく改ページされてない
シートをSelect
した後、ActiveWindow.View
が早すぎる?ようで変な改ページになってしまう。
思いつきでWait
入れてみた。
うまくいかないときもあるしよくわからんけど普通に開いて改ページプレビューしたあと保存するとちゃんと取れる…
Option Explicit '/** ' * getExcelProp ' * 与えられたパスに存在する、与えられた拡張子のExcelについて ' * [ファイル名],[ページ数]のカンマ区切りの形式でString配列を作成する ' * @param filePath ファイルの存在するパス 末尾に\が必要 ' * @param fileType 拡張子 ' * @return [ファイル名],[ページ数]のカンマ区切りString配列 ' */ Function getExcelProp(ByVal filePath As String, ByVal fileType As String) As String() Dim wkBook As Workbook: Set wkBook = Nothing '開くワークブックオブジェクト Dim buf As String 'ファイル名用バッファ Dim page As Long 'ファイル毎の総ページ数 Dim i As Long 'Forのカウンタ Dim retVal() As String: ReDim retVal(0) '戻り値用配列 On Error GoTo Proc_Exit ' 処理速度向上の為非表示 Application.Visible = False ' ダイアログ非表示 Application.DisplayAlerts = False buf = Dir(filePath & "*." & fileType) Do While buf <> "" 'ページ数初期化 page = 0 'ページ数集計 Set wkBook = Workbooks.Open(filePath & buf) For i = 1 To wkBook.Sheets.Count '2010以前のバグ対応のため改ページプレビューに切り替える wkBook.Sheets(i).Select ActiveWindow.View = xlPageBreakPreview 'どっちを書いてもカウントできる page = page + wkBook.Sheets(i).PageSetup.Pages.Count 'page = page + Application.ExecuteExcel4Macro("get.document(50)") Next i '動的に配列増やす(コスト的には微妙…) ReDim Preserve retVal(UBound(retVal) + 1) 'ファイル名,ページ数の形で配列に格納 retVal(UBound(retVal) - 1) = buf & "," & page wkBook.Close Set wkBook = Nothing buf = Dir() Loop Proc_Exit: ' エラー時にクローズできてないワークブックを閉じる If Not wkBook Is Nothing Then wkBook.Close Set wkBook = Nothing End If 'ダイアログ・アプリケーションを表示するように戻す Application.DisplayAlerts = True Application.Visible = True getExcelProp = retVal End Function '/** ' * OutputCsv ' * 文字列配列からCSVを作成する ' * @param varData 文字列配列 ' * @return なし ' */ Public Sub OutputCsv(ByVal varData As Variant) Dim lngFileNum As Long Dim strFileNm As String Dim strOutPutFile As String Dim item As Variant 'ファイル名を現在の日付にする strFileNm = Format(Now(), "yyyymmdd") & ".csv" ' 出力先ディレクトリ設定 ' とりあえずこのExcelファイルと同じフォルダに出力 strOutPutFile = ActiveWorkbook.Path & "\" & strFileNm 'ファイル作成(または追記モードでオープン) lngFileNum = FreeFile() Open strOutPutFile For Append As #lngFileNum ' 配列の中身を一行ずつ追記 For Each item In varData If item <> "" Then Print #lngFileNum, item End If Next item Close #lngFileNum End Sub Sub test() 'OutputCsv (getExcelProp(ファイルパス, "xls")) End Sub