【VBA】fsoを使ったDir関数
File I/OではOneDriveにアクセスできない
Open、Close、Input、Line Input、Print、Write、Get、Putなどの古いファイルアクセスIFでは、OneDriveのフォルダにアクセスできません。これらIFを使っていると、OneDriveとリンクしているフォルダを踏むとエラーが発生しています。
fsoを使った場合の問題点
そこでfsoを使ってファイルへアクセスすることになりますが、この場合の問題としては、Dir()に相当とする関数が存在しており、これまでDir()を使っていたコードの移植性が悪くなってしまいます。特にDir()を繰り返してファイル名を得ているコードはどのように記述していいか頭を悩ませることになります。
fsoを使ったDir関数
そこでChatGTPの手を借りて、Dir関数に相当するDirUsingFSOという関数を書いてみました。
Option Explicit
Dim fso As Object
Dim folder As Object
Dim filesAndFolders As Collection
Dim currentIndex As Integer
Sub InitFSO_Dir(Optional path As String, Optional attributes As Variant)
Dim file As Object
Dim subfolder As Object
Set fso = CreateObject("Scripting.FileSystemObject")
If path = "" Or IsMissing(path) Then
path = fso.GetAbsolutePathName(".")
ElseIf Not IsMissing(attributes) Then
If attributes = vbDirectory Then
Set folder = fso.GetFolder(path)
Else
MsgBox "DirUsingFunction No2 Second argument is wrong " & attributes
End
End If
ElseIf IsMissing(attributes) Then
Dim lastPositionOfDev As Long
lastPositionOfDev = FindLastCharIndex(path, "\")
Dim folderName As String
folderName = Left(path, lastPositionOfDev)
Dim fileName As String
fileName = Right(path, Len(path) - lastPositionOfDev)
Set folder = fso.GetFolder(folderName)
Else
MsgBox "Second parameter Is not vbDirectory"
End
End If
Set filesAndFolders = New Collection
currentIndex = 0
' Populate the files and folders collection
If Not IsMissing(attributes) Then
If attributes = vbDirectory Then
For Each subfolder In folder.SubFolders
filesAndFolders.Add subfolder.name
Next subfolder
Else
MsgBox "DirUsingFunction No2 Second argument is wrong " & attributes
End
End If
Else
For Each file In folder.Files
If file Like fileName Then
' システム属性を判定して、システムファイルの場合はスキップ
If (file.attributes And (vbSystem Or vbHidden)) = 0 Then
If file Like fileName Then
filesAndFolders.Add file.name
End If
Else
'処理なし
End If
End If
Next file
End If
Set fso = Nothing
End Sub
'======================================
Function DirUsingFSO(Optional path As String, Optional attributes As Variant) As String
If path <> "" And Not IsMissing(path) Then
Call InitFSO_Dir(path, attributes)
End If
currentIndex = currentIndex + 1
If currentIndex <= filesAndFolders.Count Then
DirUsingFSO = filesAndFolders.item(currentIndex)
Else
DirUsingFSO = ""
currentIndex = 0 ' Reset index for potential next search in a new directory
End If
End Function
この記事が気に入ったらサポートをしてみませんか?