[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『ダウンロードした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
例えばファイル名が【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
(とと) 2024/01/07(日) 01:53:37
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
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.