[[20240106032705]] 『ダウンロードしたcsvファイルが開いているか確認ax(とと) ページの最後に飛ぶ

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

 

『ダウンロードしたcsvファイルが開いているか確認したい』(とと)

毎日1回更新されるweb上のcsvのファイル(ファイルA)を毎日ダウンロードします。そのcsvファイルの更新された部分を自前のエクセルファイル(ファイルB)に反映させることを考えています。ファイルAの更新カ所は複数あり、必要な部分だけファイルBにVBAで反映させたいと思っています。

お聞きしたいのは反映させる以前の話です。ファイルBを起動し、vbaを作動させるときにファイルAがちゃんと開いている状態を想定しておかないといけないと考えて以下のようにvbaを組んでみました。ただ、これだといつもダウンロードフォルダのファイルA(1)が開いているかどうかの確認しかできません。ダウンロードファイルは毎日ダウンロードするのでファイルA、ファイルA(1)、ファイルA(2)、・・・と続けてできていきます。最新のファイルが開いているか確認したいのです。また、ダウンロードファイルがたまったら削除することも考えています。

どうしたら、その日ダウンロードしたファイルが開いているか確認することができるでしょうか。お知恵をお貸しください。

Public Sub ダウンロードファイルの存在確認()
Const DOWN_LOAD_FOLDER As String = "C:\Users\user\ダウンロード\"
Const fileA As String = "ファイルA"
Dim wb As Workbook
Dim fileName As String
Dim isBookOpen

    isBookOpen = False
    fileName = Dir(DOWN_LOAD_FOLDER & fileA & "*" & ".csv")
    For Each wb In Workbooks
        If wb.Name = fileName Then
          isBookOpen = True
          Exit For
        End If
    Next

    If isBookOpen = False Then
        MsgBox "ファイルAが開いていません"
        Exit Sub
    End If

< 使用 Excel:Excel2016、使用 OS:Windows10 >


 最新のファイル名が判明すれば、それが開いているかの判定は既にできているので、
 最新ファイル名を得る方法をコメントします。

 カッコ内の数値で判定することもできるでしょう。
 ここでは、ファイルのタイムスタンプを見る方法を提示してみました。

 Function 最新CSV() As String
     Const DOWN_LOAD_FOLDER As String = "C:\Users\user\ダウンロード" ' 最後の\を削っていることに注意
     Const fileA As String = "ファイルA"
     Dim fso As Object, file As Object
     Dim latest As Double, modTime As Double
     Dim latestFile As String

     Set fso = CreateObject("Scripting.FileSystemObject")
     For Each file In fso.GetFolder(DOWN_LOAD_FOLDER).Files
         If LCase(fso.GetExtensionName(file.Path)) = "csv" Then
             If file.Name Like fileA & "*" Then
                 modTime = 1 * CDate(file.DateLastModified)
                 If modTime > latest Then
                     latest = modTime
                     latestFile = file.Name
                 End If
             End If
         End If
     Next
     最新CSV = latestFile
 End Function

 Sub test()  ' 動作確認用
     Debug.Print 最新CSV
 End Sub

 なお、ファイルAが固定なら今のままでよいと思いますが、
 今後、変わっていくなら、最新CSV() の引数にそのファイル名を指定する方式が考えられます。
(xyz) 2024/01/06(土) 06:25:15

 DOWN_LOAD_FOLDERの最後の\の有無は関係なかったです。どちらでもOKです。
(xyz) 2024/01/06(土) 07:58:53

ブックとして開いているかどうかに拘られているようですが、【csvのファイル(ファイルA)を毎日ダウンロードします。】が開いているかどうかより、そのファイル自体の【存在チェック】をすればよいのではないでしょうか?

例えばファイル名が【202401060327.csv】のように日付に依存するようなものであればDir関数だけでチェックできますし、そうでないならxyzさんのアドバイスに従って条件(タイムスタンプがマクロ実行と同日のcsvファイル)を満たすものがあるか判定するのでもよいとおもいます。

存在チェックさえしてしまえば、そのあと【マクロでブックを開けば】よくないですか?

    Sub 研究用()
        Dim fileName As String
        fileName = Dir("C:\Users\user\ダウンロード\" & Format(Now, "yyyymmdd") & "*.csv")

        If fileName = "" Then
            MsgBox "csvファイルが存在しません"
            Exit Sub
        Else
            'ブックとして開く処理or適当な所にインポートする処理
            '必要な転記をする処理
            '開いたブックを閉じる処理or作業用の情報を消去する処理
        End If
    End Sub

(もこな2) 2024/01/06(土) 13:30:28


 どうやってダウンロードしてるんでしょう?というのは置いておいて、
 マクロブックのシートにPowerQueryを使ってWEB上のCSVファイルを読み込むようにしておくと
 ThisWorkbook.RefreshAll
 して、該当のシートを見れば良くなります。
 クエリの「バックグラウンドで更新」をOFFにしておかないといけないですが。
(´・ω・`) 2024/01/06(土) 13:43:01

xyz様
教えていただいたコードでうまくいきました。
CreateObjectなど、使ったことがなくてちょっと調べてみてもさっぱりだったので
とりあえずこのまま使わせていただこうかと思います。

(とと) 2024/01/07(日) 01:53:37


もこな2様
残念ながらダウンロードファイル名には日付がないので、
xyz様のコードでやっていこうと思います。
(とと) 2024/01/07(日) 01:55:55

(´・ω・`)様
PowerQueryってどこかで聞いたことはあるんですが、
何分無知なためハードルが高そうに思えてしまい教えていただいたのに
調べもせず申し訳ないです。
(とと) 2024/01/07(日) 01:58:38

 FileSystemObjectは、フォルダ、ファイルなどを操作するための便利な道具と思えばよいでしょう。
 以下のサイトを参考にしてください。
http://officetanaka.net/excel/vba/filesystemobject/index.htm
 一度にすべて理解する必要はないですし、無理です。
 まずは、こうしたことができるのね、レベルで結構。必要に応じて参照のこと。

 以下、主要な部分にコメントをつけましたので、学習用のメモとして見てください。
 なお、通常こうした過剰なメモをつけることはありません。(過ぎたるは及ばざるが如し)

 Set fso = CreateObject("Scripting.FileSystemObject")        'FileSystemObjectを利用できるようにする(おまじないです)
 For Each file In fso.GetFolder(DOWN_LOAD_FOLDER).Files      'フォルダの配下のファイルたちに対して、以下の処理を繰り返す。
     If LCase(fso.GetExtensionName(file.Path)) = "csv" Then  'ファイルの拡張子がcsvなら、
         If file.Name Like fileA & "*" Then                  'ファイル名が   "ファイルA*" (*は任意文字列)なら、
             modTime = 1 * CDate(file.DateLastModified)        'ファイルのタイムスタンプを数値化
             If modTime > latest Then                          'それまでの最新のタイムスタンプ(latest)より新しければ、
                 latest = modTime                                  '次回以降の比較に備え、改めてそれを最新とする。
                 latestFile = file.Name                            '最新のファイル名を記憶。
             End If
         End If
     End If
 Next
 最新CSV = latestFile                                        '結果(最新のファイルのファイル名)を返す
(xyz) 2024/01/07(日) 08:56:30

xyz様
わざわざコメントつけていただいてありがとうございます。
また何かの時に同じような処理が必要になったら見返したいと思います。
(とと) 2024/01/08(月) 03:20:53

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.