いつも丁寧な解答をありがとうございます。
今回はexcel2010のVBAについて教えて下さい。
やりたいこととしては、フォルダ内にあるすべてのExcelブックのファイル名と各ヘッダーとフッターを一覧表に入力する形で取得したいのです。
用途としては、報告書やファイルの提出前に、提出書類を一纏めにしたフォルダにて各ファイルのヘッダーとフッターを確認し、問題があるファイルのみ修正するといったオペレーションをするためです。
ファイル数がそこそこあり、すべて開いて閉じてを繰り返していると手間なのと、大袈裟かもしれませんが開いたタイミングで何らかの人為的なミスが起こらないとも限らないので自動化できるならしたいです。
web上で調べながら試行錯誤してみたところ、フォルダ内のファイルをすべて開くVBAや、閉じている特定のファイルの特定のシートのセル値を取得するVBA、開いているファイルのヘッダーとフッターを取得するVBAはできました。
ただ、フォルダ内のすべてのファイルを開かずにpagesetupの値を取得することはできませんでした。
考え方として、閉じている特定のファイルの特定のシートのpagesetupでヘッダーやフッターを指定すれば出来るのではないかと思っていたのですが、そもそもの考え方がちがうのでしょうか。
実現することは可能でしょうか。
それとも各ファイルを開いて取得するを繰り返すしかないでしょうか。
解決に繋がるヒントやサイトをご存じの方、教えていただけますでしょうか。
よろしくお願いいたします。
追記:今回はメンテナンス性の観点から使用できる言語がexcelVBAのみとなります。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+2
「ファイルを開かずに」という表現が曖昧ですが、EXCELブックとして開かない、ということでしょうか。
COMを使うことで実際にファイルを開かずに処理することはできそうです。
Dim xlApp As Excel.Application
Dim xlBook As Excel.Workbook
Dim xlSheet As Excel.Worksheet
Dim file As String
file = "c:\temp\test1.xlsx"
Set xlApp = CreateObject("Excel.Application")
xlApp.Workbooks.Open Filename:=file, UpdateLinks:=0
'xlApp.Visible = True ' これを有効にするとEXCELファイルが開かれます
Set xlBook = xlApp.Workbooks(Dir(file))
Set xlSheet = xlBook.Worksheets("Sheet1")
Debug.Print xlSheet.PageSetup.LeftHeader
Debug.Print xlSheet.PageSetup.CenterHeader
Debug.Print xlSheet.PageSetup.RightHeader
xlBook.Close saveChanges:=False
xlApp.Quit
Set xlSheet = Nothing
Set xlBook = Nothing
Set xlApp = Nothing
これは1ファイル・1シートを固定で処理してますが、これをフォルダ内のファイル、ブック内のシートを処理するようにすればよろしいかと思います。
また[ツール]-[参照設定]で、"Microsoft Excel XX.X Object Library" を有効にしておいてください。
XX.Xのバージョンはご自分の環境に合わせてください。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+1
例えば VBScript を使うのはどうでしょう。
ドラッグ&ドロップで使うならこんな感じで。
Option Explicit
Dim args,i,book,sheet
Set xls = CreateObject("Excel.Application")
xls.DisplayAlerts = FALSE
xls.Visible = TRUE
Set args = WScript.Arguments
For i=1 To args.count Step 1
Set book = xls.WorkBooks.Open(args.item(i))
Set sheet = book.ActiveSheet
'
'処理
'
Set sheet = Nothing
Set book = Nothing
Next
Set xls = Nothing
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+1
>閉じている特定のファイルの特定のシートのセル値を取得する
この方法として想定されているのはExecuteExcel4Macroではないかと思います。
確かにこれでファイルを開かずにセルの値を取得することは可能ですが、
(私の知る限りでは)閉じたファイルのヘッダ内容までは取得できないと思います。
ご存知かもしれませんが、ExecuteExcel4MacroはExcelの過去の資産、Excel4.0マクロを実行するものです。
Excel4.0マクロではGET.DOCUMENT(54,[ファイル名]シート名)で指定ファイル名のシートからヘッダ内容を取得(フッター内容は55で取得)できますが、これはあくまで開いているブックが対象となります。
>すべて開いて閉じてを繰り返していると手間
>何らかの人為的なミスが起こらないとも限らないので自動化したい
これが手作業で1つずつブックを開く作業は手間だしリスクもあるので自動化したい、という解釈でよければ、
「ファイルを開かずに」という部分は「画面上に表示されなければリスクは低いのでファイルは開いても構わない」ものとして、ttyp03さん提示の方法で実現できそうです。
⇒xlApp.Workbooks.Openの部分でファイルを開き、xlApp.Visible = Trueをしないことで非表示のままエクセル操作しています。
「速度等を考慮してファイルを開かず処理したい」のであれば、なかなか難しいのではないかと思います。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.38%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2016/06/10 09:13
ファイルを…というのはExcelブックを…という意味で相違ありません。
ご回答いただいた内容でやればいいことがわかってきました。
週明けくらいまで時間がかかるかも知れませんが、ご提示いただいた内容で試してみたいと思います。
また行き詰まったときは教えていただければ幸いです。
2016/06/16 11:17
ご回答頂きありがとうございました。
ご提示いただいた内容を元にいろいろ触ってみて、
なんとかこの部分についてはやりたいことが出来ました。
ご協力いただきありがとうございました。
また質問させていただいた際には宜しくお願いいたします。