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

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

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

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

Q&A

解決済

3回答

3567閲覧

vbaでのファイル存在チェック

coko1

総合スコア276

VBA

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

0グッド

1クリップ

投稿2016/09/07 06:55

編集2016/09/07 09:04

excelの情報
・パス
・ファイル名
・ファイルサイズ
・タイムスタンプ(ファイル更新日時)
イメージ説明

VBAで上記のようなエクセルを読み込みそこに記載された情報を組み合わせてファイルの存在チェック(excelに記載された情報と全く同じファイルであるかを自動で比較)を行うことは可能でしょうか?

①パスを組み合わせてファイルが存在するかのチェック → 存在しなかった場合は”存在しない”と表示。
②存在した場合、タイムスタンプとサイズが合っているかの比較 → 違っていた場合”内容が違います”と表示
上記をexcelに記載されているファイル分行いたいのです。

まとめるとファイルが存在して、且つタイムスタンプとファイルサイズが同じかどうかを比較して、1つのファイルに対して比較結果(一致or不一致)を表示させたいってことです。

純粋にパスとファイル名を組み立ててファイルの存在をチェックするだけならできたのですが...

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

クリップした質問は、後からいつでもMYページで確認できます。

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

「全く同じファイル」という定義が曖昧ですが、ファイルサイズとタイムスタンプが同じで良いなら、以下の関数で取得できるので比較できると思います。

ファイルサイズ取得:FileLen
タイムスタンプ取得:FileDateTime

VBA

1fn = "c:\xxxx" 2debug.print FileLen(fn) 3debug.print FileDateTime(fn)

投稿2016/09/07 07:06

ttyp03

総合スコア16998

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/09/07 07:55 編集

それらの関数って、 例えばVB.NETやC#.NETでのMicrosoft.VisualBasic命名空間でしか使えなくて、 非.NET環境であるExcelのVBAでは使えない気がします。
ttyp03

2016/09/07 07:58

使えるのは確認済みです。
退会済みユーザー

退会済みユーザー

2016/09/07 08:20

失礼しました
coko1

2016/09/07 09:12

質問に実現したいことを補足してみたのですが、ファイルサイズ取得:FileLen タイムスタンプ取得:FileDateTimeの使用でできそうでしょうか? なんとも他力本願な質問で申し訳ありませんが、お力を貸していただけたら幸いです。
ttyp03

2016/09/08 00:18 編集

今環境がないので間違ってるかもしれませんが、こんな感じで書けると思います。 fn = cells(3,2).value & cells(3,3).value If ファイル存在チェック関数(fn) Then If FileLen(fn) <> cells(3,4).value or FileDateTime(fn) <> cells(3,5).value Then cells(3,6).value = "内容が違います" End If Else cells(3,6).value = "存在しない" End If これは1行分しかやってませんが、ループで行数分回せばいけると思います。 補足 タイムスタンプは実際には秒まで持っているので、Excel上も秒まで持つ必要があります。 もしくは秒は見ないのであれば、FileDateTime関数で取得した値から秒を0秒に置き換えるような処理が必要になります。
guest

0

FileSystemObjectをご存知でしょうか。
GetFile メソッドを駆使すれば、GetFileメソッドで得られたFileオブジェクトfに対して、
f.Sizeでファイルサイズが、f.DateLastModifiedで最終更新日時を取得できます。

VBEでFileSystemObjectの参照設定を行う:FileSystemObjectの使い方
http://www.relief.jp/itnote/archives/fso-vba-references.php

VBAに参照設定を追加すれば、FileSystemObjectが使えます。
ざっくり書くとこうなるでしょうか。

Sub test() Dim fso As Scripting.FileSystemObject Dim f As Scripting.File Set fso = New Scripting.FileSystemObject If fso Is Nothing Then MsgBox "FileSystemObjectが使えない", vbCritical Exit Sub End If Set f = fso.GetFile("C:\xxxx.xls") If f Is Nothing Then MsgBox "ファイルが見つからない", vbCritical Exit Sub End If Debug.Print f.Size '' ファイルサイズ Debug.Print f.DateLastModified '' 最終更新日時 Set f = Nothing Set fso = Nothing End Sub

投稿2016/09/07 07:06

編集2016/09/07 09:39
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

coko1

2016/09/07 09:14

質問に実現したいことを補足してみたのですが、GetFile メソッドの使用でできそうでしょうか?頼り切った質問になってしまって申し訳ないのですが、お力を貸していただけたら嬉しいです。
guest

0

ttyp03さんのアドバイスにあるFileLen、FileDateTimeを使う方法は、下記のページなどに使用例があります。
⇒FileLen、FileDateTimeの使用例

また、m6uさんのアドバイスにあるFileSystemObjectでのファイル日時取得については、下記のページに使用しているサンプルコードがあります。
(紹介したページではGetFileではなくGetFolder.Filesで複数ファイルから1つずつファイル情報を取り出していますが。)
⇒FileSystemObjectでのファイル日時取得

同様にファイルサイズも取得できます。
⇒ファイル情報取得のための各種プロパティ


これらの情報は「VBA ファイル情報の取得」のような検索ワードでぐぐればいろいろ見つかるものです。

今回、この質問をする前にどのくらい情報収集をしましたか?
前回の質問で方針が見えてきて、今回それをさらに具体化したいのだと思いますが、ご自身でできる範囲の情報収集ができていないようです。

他人に答えを求めるだけでは何も身に付きませんので、うるさいことを言うようですが、もう少し自力での情報収集を頑張ってみましょう。

それでも解決できなかったり、検索しても思うような情報が見つからないときは、わかる範囲でサポートしますのでバンバン質問してください。

がんばってください。

投稿2016/09/07 09:53

編集2016/09/08 01:53
jawa

総合スコア3013

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問