[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『VBAで別ファイルの更新を検知したいです。』(VBA初心者)
Dim dt As Double
Dim mode As Boolean
Dim interval As Integer
Sub StartProcess()
mode = True dt = Now() interval = 10
Call ReloadFolder End Sub
Sub EndProcess()
mode = False End Sub
Sub ReloadFolder()
If mode = False Then End
Range("A1:B1000").ClearContents
r = 1 PathName = "z:\*\*\*\*\" buf = Dir(PathName & "test.xlsx") Do While buf <> "" Cells(r, 1) = buf If FileDateTime(PathName & buf) > dt Then Cells(r, 2) = "更新" End If
buf = Dir() r = r + 1 Loop
dt = Now() - (interval / 60 / 60 / 24) Application.OnTime DateAdd("s", interval, Time), "ReloadFolder" End Sub
上記内容で現在、「名前が適切ではありません:Reload folder」と出てしまいます。
Reload folderの箇所をどう書き換えればいいのかわかりません。
ご教示いただけると助かります。
< 使用 Excel:Excel2010、使用 OS:Windows10 >
ReloadFolder が二つ書かれていると思います。 (xyz) 2024/12/05(木) 20:37:48
伝わりにくいようですね。
そのモジュールに Sub ReloadFolder()というプロシージャが二つ書かれていませんか? まずはその状態から脱出してください。
Dir関数はフォルダ部分にワイルドカードを使うことはできないので、エラーになります。 対象ブックはそんな広範な場所にあるんですか?
そもそもファイルの更新状態を監視する必要性がちょっとわかりませんが、 今の方法よりも、対象ブックをマクロブック.xlsm に変更したうえで、 修正したときに、特定のフォルダにログを書き出すようなマクロを書いたほうがよくないですか? (xyz) 2024/12/05(木) 22:32:09
その状態から脱して同様の効果を発生するコードがわかりません。 ご教示いただければ助かります。
>対象ブックはそんな広範な場所にあるんですか?
会社のファイルサーバー内になります。フォルダがかなり煩雑に枝分かれしています。
>そもそもファイルの更新状態を監視する必要性がちょっとわかりませんが、
該当ファイルが変更あった場合、会社の1部署にかなり影響があるのですが、 変更があっても中々通達がなく業務上支障がでており、何年もお願いや注意をしても 該当ファイルに変更をする人に改善が見られないらしいので今回VBA等で解決できれば ということになりました。
(VBA初心者) 2024/12/06(金) 08:16:31
(もこな2 ) 2024/12/06(金) 08:56:33
>そのモジュールに Sub ReloadFolder()というプロシージャが二つ書かれていませんか? これに対するお応えが分かりません。
(xyz) 2024/12/06(金) 09:22:08
単にコーディングの際のミスで、間違って同一名のプロシージャが二つあるのではないかと疑っています。 どちらかは不要なはずなので、不要なもの(ここに示されていないものでしょうか)を 消せばよいだけかと思っています。 必要なものが二つあるなら、その理由を説明してください。
以下の論点については、広く他の方からコメントを得るのがよろしいかと思います。
「Dir関数はフォルダ部分にワイルドカードを使うことはできない」は 記述が不正確であり、追加説明を要すと思いますが、 今の書き方でエラーが発生することは間違いありません。 そもそも、その都度検索しなくても事前に指定列挙できないのですか?
10秒ごとに監視することが必要なものなんですか? それをOnTimeでやるなら、そのPC一台でずっと立ち上げておく必要があることや、 Excelは他の用途には実質使えないものとなると思います。 なにか別の対応策を検討されたほうがよいと思います。
(xyz) 2024/12/06(金) 09:46:44
>ReloadFolderが複数出る事 ご自分が書いたものではなく、自動で作成されるんですか? よくわからないので、二つの同名プロシージャの内容をそのままこちらにアップしてください。
(xyz) 2024/12/06(金) 10:01:11
Sub StartProcess() 'スタートボタンに登録
mode = True dt = Now() interval = 2 '更新するインターバル(sec)
Call ReloadFolder End Sub
Sub EndProcess() '終了ボタンに登録
mode = False End Sub
Sub ReloadFolder()
If mode = False Then End
Range("A1:B1000").ClearContents
r = 1 PathName = "C:\Users\...\" buf = Dir(PathName & "*.txt") Do While buf <> "" Cells(r, 1) = buf If FileDateTime(PathName & buf) > dt Then Cells(r, 2) = "更新" End If
buf = Dir() r = r + 1 Loop
dt = Now() - (interval / 60 / 60 / 24) Application.OnTime DateAdd("s", interval, Time), "ReloadFolder" End Sub (VBA初心者) 2024/12/06(金) 10:11:23
>ReloadFolderが複数出る事 「複数出る」ことの説明になっていません。不可抗力で出現してしまったという説明ですよね。
参照したコードをそのまま残してしまっていました、と言った説明なら分かりますが、 そういうことではないんですか?
そもそも、10秒前以降に更新したものを抽出するなどという仕様がなぜ必要なのかわかりません。 対象となるファイルの更新年月日を定期的(日に一回とか週一回とか)に バッチ的に取得して、 前回と比較するだけのはなしじゃないんですか?OnTimeなどを使う必要もないと思います。
されようとしていることの趣旨がわからないので、私はこれで失礼します。 他の方からの回答をお待ちください。 (xyz) 2024/12/06(金) 10:40:17
>現在、「名前が適切ではありません:Reload folder」と出てしまいます。
↑は、解決したってことで理解していいのかな?
>ReloadFolderが複数出る事が問題なのはわかった
勝手にコードが生成されてしまうことが問題なのですか?
そんなコードを書いたのですか?
>該当ファイルが変更あった場合、会社の1部署にかなり影響があるのですが、
よくわからないけど、リアルタイムで監視しなくても、
必要なものが必要な時に簡単に探せればいいような気がします。
リアルタイムで監視するならエクスプローラーでやればよいようなきがします。
エクスプローラーが不満なら、他のファイル管理ソフトの導入を検討するのも
ありかと思います。
(まっつわん) 2024/12/06(金) 11:08:56
かぶりましたが、書いたので。
参考にしたのはここでしょうか https://gist.github.com/satoshi71/81c3516acb486c497f99b60f3031c22f
ちょっとコードを眺めただけですが、このマクロを利用することは推奨しましせん。
このコードはReloadFolderを指定秒数毎に実行します。 ReloadFolderが実行されるたびに ・A:B列をクリアします。 ・A列にファイル名を書き出し ・もし、前回実行時以後に更新されていたら、B列に「更新」と書き出します。 10秒毎に実行したら、10秒以上前に更新されたものはチェックされません
「いつからいつまでの間に更新されたのか」を知りたいなら、このコードは適切ではありません
指定した日時以降に更新されたファイルをリストアップする というようにしたほうがいいと思います。
それって、Windowsのエクスプローラーの検索機能でできますよね? (´・ω・`) 2024/12/06(金) 11:25:14
Excelのバージョンがもうちょっと新しければ、データの取得と変換(PowerQuery)で 「フォルダから」でファイル名と更新日時の一覧を取得して、あとはオートフィルタでおしまい
マクロ作成に時間かけるより、Officeアップデートしたほうがいいような気がします (´・ω・`) 2024/12/06(金) 11:50:03
ありがとうございました。
別手法を探してみます。
(VBA初心者) 2024/12/06(金) 14:54:53
特定の1つのファイルの最終更新日時が変わったら、
その日時をリアルタイムで記録したい。
が、やりたいことなのですね?
一応書いてみました。
Option Explicit
Dim mFlg As Boolean
Const mcMyPath As String = "\\Ls220d89c\ls220\新規 Microsoft Excel ワークシート.xlsx"
Const mcInterval As Long = 2
Sub btn始まり()
mFlg = True With ThisWorkbook.Worksheets(1) .UsedRange.ClearContents .Range("A1").Value = "監視中" End With
Call Set記録 End Sub
Sub btn終わり()
mFlg = False ThisWorkbook.Worksheets(1).Range("A1").Value = "中断中" End Sub
Sub Set記録()
Dim s As String Dim r As Range Dim t As Date Dim f As String
If mFlg = False Then Exit Sub With ThisWorkbook.Worksheets(1) Set r = .Cells(.Rows.Count, 1).End(xlUp).Offset(1) End With s = Dir(mcMyPath)
If s = "" Then t = 0 f = "無し" Else t = FileDateTime(mcMyPath) f = "更新" End If
If r.Offset(-1).Value <> t Then r.Value = t r(1, 2).Value = f Beep End If
Application.OnTime DateAdd("s", mcInterval, Now()), "Set記録" End Sub
こんなことを長時間したらどうなるか、不安。。。。
サンプルコードをちょちょっと直したらなんとかなるものでもないので、
マクロを使うときはその覚悟で。。。。
(まっつわん) 2024/12/06(金) 18:04:13
>「名前が適切ではありません:Reload folder」と出てしまいます。 結局、このエラーの件について、納得したにも何も、返答がありません。 そういうやりとりの仕方はよろしくありません。 状況を理解したのかどうか、きちんと発言してください。
(xyz) 2024/12/06(金) 18:24:21
↓の案が良いと思います。
> 今の方法よりも、対象ブックをマクロブック.xlsm に変更したうえで、 > 修正したときに、特定のフォルダにログを書き出すようなマクロを書いたほうがよくないですか? > (xyz) 2024/12/05(木) 22:32:09 (マナ) 2024/12/06(金) 22:29:08
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.