[[20241205175229]] 『VBAで別ファイルの更新を検知したいです。』(VBA初心者) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『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

>そのモジュールに Sub ReloadFolder()というプロシージャが二つ書かれていませんか?
まずはその状態から脱出してください。
 その状態から脱して同様の効果を発生するコードがわかりません。
 ご教示いただければ助かります。

>対象ブックはそんな広範な場所にあるんですか?

 会社のファイルサーバー内になります。フォルダがかなり煩雑に枝分かれしています。

>そもそもファイルの更新状態を監視する必要性がちょっとわかりませんが、

 該当ファイルが変更あった場合、会社の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


>そのモジュールに Sub ReloadFolder()というプロシージャが二つ書かれていませんか?
>まずはその状態から脱出してください。
ReloadFolderが複数出る事が問題なのはわかったのですが、その後自分なりに書き換えをしましたが動作自体が上手くしなかったのでどのように書き換えれば動作するかをご教示いただければと思います。
よろしくお願いいたします。
(VBA初心者) 2024/12/06(金) 09:53:54

 >ReloadFolderが複数出る事
 ご自分が書いたものではなく、自動で作成されるんですか?
 よくわからないので、二つの同名プロシージャの内容をそのままこちらにアップしてください。

(xyz) 2024/12/06(金) 10:01:11


ネットで別ファイルの更新を検知するVBAというものがあったので
その記入内容を参照しました。
参照元は以下の通りです。
Dim dt As Double
Dim mode As Boolean
Dim interval As Integer

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

officeに関してはdatalizer使用の関係でまだアップデートできません。

ありがとうございました。

別手法を探してみます。

(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.