【问题标题】:Move Files to New Directory based on SQL Query Data根据 SQL 查询数据将文件移动到新目录
【发布时间】:2021-01-22 21:01:05
【问题描述】:

希望有人能帮忙:)

我有一个 MS Access 表,其中包含文件名和其他数据示例:
帐户编号、文件名
12345, abc123.pdf

我编写了一个 SQL 来根据帐号对文件名进行排序。示例:Select * from tblTest where AcctNum='12345'

具有这些文件名的文件位于目录中 (C:\Test\<filename>.pdf)

我需要根据我编写的 SQL 移动选定的文件,以将这些文件移动到不同的目录 (D:\Test\FromCode)。文件名 'abc123.pdf' 位于 C:\Test 移动到 D:\test,循环 SQL 结果以根据条件移动文件。

附件是我写的一些 VBA,当我输入确切的文件名时,我可以手动将文件从源复制到目标(如代码中所示,文件名是“abc123”),但我想将其绑定到 mysql 查询记录集并移动将包含 1000 个文件的组。任何人都知道我可以将其与记录集联系起来的最佳方法吗?

感谢您提供的任何指导/帮助。

Sub UpdateDirectory()

Dim objFSO As Object
Dim objFolder As Object
Dim objFile As Object
Dim rs As DAO.Recordset
Dim db As DAO.Database
Dim mysource As String
Dim mydes As String
Dim mysql As String


mysql = "SELECT * from tblTest where ACCTNUM = 123456"
mysource = "C:\Test"
mydes = "D:\Test\FromCode\"


Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFolder = objFSO.GetFolder(mysource)
Set db = CurrentDb
Set rs = db.OpenRecordSet(mysql)


'I want to tie mysql recordset to below to move all files/records based 
'on ACCTNUM. This could result in moving 1000's of files to 
'destination.

 For Each objFile In objFolder.Files
     If InStr(1, objFile.Name, "abc123") > 0 Then
         Debug.Print "yes"
         objFSO.CopyFile objFile, mydes
     Else
         Debug.Print "no"
     End If
 Next

 'clean
Set objFolder = Nothing
 Set objFile = Nothing
Set objFSO = Nothing

End Sub

【问题讨论】:

    标签: vba ms-access


    【解决方案1】:

    这是您的代码,其中有一个有效的答案:可以肯定的是,@June7 是正确的,但将答案放在您的上下文中:

    Sub UpdateDirectory()
    
    Dim objFSO As Object
    Dim objFolder As Object
    Dim objFile As Object
    Dim rs As DAO.Recordset
    Dim db As DAO.Database
    Dim mysource As String
    Dim mydes As String
    Dim mysql As String
    
    
    mysql = "SELECT * from tblTest where ACCTNUM = 123456"
    mysource = "C:\Test" 'Missing backslash - added later
    mydes = "D:\Test\FromCode\"
    
    
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Set objFolder = objFSO.GetFolder(mysource)
    Set db = CurrentDb
    Set rs = db.OpenRecordSet(mysql)
    
    
    'I want to tie mysql recordset to below to move all files/records based 
    'on ACCTNUM. This could result in moving 1000's of files to 
    'destination.
    
    While Not rs.EOF
        sourceFile = mysource & "\" & rs!Filename 'Added a missing backslash
        destFile = mydes & rs!Filename
    
        If Dir(sourceFile) <> "" Then 'If sourceFile exists, then Dir(sourceFile) will return it's name, otherwise empty string
            FileCopy sourceFile, destFile 
        End If
        rs.MoveNext
    Wend
    
    End Sub
    

    【讨论】:

    • 而且我知道我会因为这样说而受到抨击,但是你以 `` 'clean Set objFolder = Nothing Set objFile = Nothing Set objFSO = Nothing``` 结尾不是必需的,因为当解释器看到 End Sub,它会丢弃您在该 sub 期间创建的任何引用。许多人会认为这是一种很好的编码习惯,但恕我直言,这只是不必要的噪音。
    • 感谢六月和斯科特!感谢帮助和方向。执行代码时,它会移动 SQL 在过滤器中找到的第一个文件,但只会循环并移动那个文件;在它遍历整个过滤器之后,我得到了权限被拒绝错误(很可能是因为该文件已经存在)。在我的 debug.print rs!filename 中,我看到同一个文件重复了 100 次。
    • 哎呀!我忘记了 rs.MoveNext 移动到记录集中的下一条记录(就在 Wend 语句之前。已编辑......)。我想这就是我在浏览器中编写代码而不运行它的结果:)
    • 很高兴它成功了。那我可以说服你给这个答案打勾吗?
    • 会做斯科特。附加问题。我一直在尝试根据我的 SQL 过滤器修改代码,因为文件结构发生了变化(而不是文件名,我必须移动文件夹)而不是文件名,我试图根据文件夹名称移动文件夹内容。我有按日期/然后按唯一文件夹名称命名的目录;示例:Test/ ABC1234/ ABC567/ ABD8999 并且我想将带有文件夹名称的文件夹内容移动到不同的位置,我该如何完成?当我更改我的 SQL 和源代码时,它会识别我的新 SQL,但没有移动文件夹和内容。
    【解决方案2】:

    那个 SQL 不是对记录进行排序,而是在过滤。

    如果您不遍历记录,则记录集将毫无用处。如果您不想简单地复制所有文件并且完整的帐号不是文件名的一部分,则需要循环遍历记录集,而不是文件夹。使用文件副本中字段的文件名。不需要 FSO - 可以使用 Access FileCopy 方法。

    ...
    mysource = "C:\Test\"
    ...
    Do While Not rs.EOF
       If Dir(mysource & rs!Filename) <> "" Then FileCopy mysource & rs!Filename, mydes & rs!Filename
    Loop
    

    【讨论】:

    • 如何才能使用基于我的 SQL 过滤器的 MoveFolder 方法?我的要求发生了一些变化,我需要将整个目录移动到基于我的 SQL 过滤器的子文件夹下,而不是移动文件。
    • 我相信这确实需要 FSO。网络搜索会找到像analystcave.com/vba-filesystemobject-fso-in-excel/… 这样的例子。如果您需要更多帮助,请发布一个新问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-06
    • 1970-01-01
    • 1970-01-01
    • 2019-01-02
    • 2021-07-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多