【问题标题】:VBA move files based on string in filenameVBA根据文件名中的字符串移动文件
【发布时间】:2021-03-29 06:35:40
【问题描述】:

我们收到的 Word 文件包含 ISO 3 字母国家代码作为文件名中的字符串。我们希望将这些文件从保存文件夹移动到每个以国家名称命名的国家/地区的现有文件夹中。

我一直在兜圈子,试图让InStr 工作。 InStr 更可取,因为字符串在文件名中的位置可以改变。

有人可以告诉我我的代码有什么问题吗?它运行,但什么也不做。

还有很多国家文件(60 多个 ISO 代码)。还有比For Each和ElseIf更聪明的方法吗?

非常感谢!

Sub MoveFiles_SpecificFolders()

Dim SrepFSO As FileSystemObject
Dim Srep As File
Dim HldFolder As Folder
Dim HoldingFolder As String
Dim TargetFolder As String
Dim Fname As String

Fname = (HoldingFolder & "*.doc*")

HoldingFolder = "C:\Users\Temp\Test\"
TargetFolder = "C:\Users\DifferentPath\MSfolders\"

Set SrepFSO = New Scripting.FileSystemObject
Set HldFolder = SrepFSO.GetFolder(HoldingFolder)

For Each Srep In HldFolder.Files

    If InStr(Fname, "ALB") <> 0 Then
    SrepFSO.MoveFile Source:=SrepFSO.GetFile(Srep), _
    Destination:=TargetFolder & "Albania\" & Srep.Name
    
    ElseIf InStr(Fname, "AND") <> 0 Then
    SrepFSO.MoveFile Source:=SrepFSO.GetFile(Srep), _
    Destination:=DestinationFolder & "Andorra\" & Srep.Name
    
    ElseIf InStr(Fname, "ARM") <> 0 Then
    SrepFSO.MoveFile Source:=SrepFSO.GetFile(Srep), _
    Destination:=DestinationFolder & "Armenia\" & Srep.Name
    
    End If
    
Next Srep

End Sub

【问题讨论】:

  • Fname = (HoldingFolder &amp; "*.doc*") - 这只是意味着Fname 是"*doc*" - 你的InStr 行都不会评估为真。
  • 我会把它分解成子任务。创建一个字典,其中 3 个字母的代码是键,文件夹名称是值。然后在一个循环中,提取代码,从字典中获取文件夹名称并移动文件。
  • 感谢@Kostas K,既然我的简单代码正在运行,那一定是下一步!

标签: vba string file filenames move


【解决方案1】:

以这种方式遵循您的代码:

Dim HoldingFolder As String
Dim TargetFolder As String
Dim Fname As String

Fname = (HoldingFolder & "*.doc*")

HoldingFolder = "C:\Users\Temp\Test\"

Fname 变量不包含HoldingFolder 的部分。 HoldingFolder 变量应该在引用之前赋值:

Dim HoldingFolder As String
Dim TargetFolder As String
Dim Fname As String
HoldingFolder = "C:\Users\Temp\Test\"

Fname = (HoldingFolder & "*.doc*")

稍后在 For-Each 循环中,您会在这里看到一个问题 -

If InStr(Fname, "ALB") &lt;&gt; 0 Then -> 应该是If InStr(Srep, "ALB") &lt;&gt; 0 Then

【讨论】:

  • 但下一个问题是Fname 在分配之后永远不会更改或使用。 OP 应该使用Srep。
  • @BigBen - 必须检查,复制整个事情,但我想你是对的。无论如何,我看到它在这里被使用 - If InStr(Fname, "ALB")。我猜应该是Srep 而不是Fname...
  • 非常感谢大家!当我使用一致的路径时,它适用于Srep...。非常感谢!
【解决方案2】:

感谢@BigBen 和@Vityata,更正了代码。

Sub MoveFiles_SpecificFolders()

Dim SrepFSO As FileSystemObject
Dim Srep As File
Dim fso As New FileSystemObject
Dim HldFolder As Folder
Dim HoldingFolder As String
Dim TargetFolder As String

HoldingFolder = "C:\Users\xyz\Test_docs\"
TargetFolder = "C:\Users\xyz\MSfolders\"

Set fso = CreateObject("Scripting.FileSystemObject")
Set SrepFSO = New Scripting.FileSystemObject
Set HldFolder = SrepFSO.GetFolder(HoldingFolder)

For Each Srep In HldFolder.Files

    If InStr(Srep, "ALB") <> 0 Then
    SrepFSO.MoveFile Source:=SrepFSO.GetFile(Srep), _
    Destination:=TargetFolder & "Albania\" & Srep.Name
    
    ElseIf InStr(Srep, "AND") <> 0 Then
    SrepFSO.MoveFile Source:=SrepFSO.GetFile(Srep), _
    Destination:=TargetFolder & "Andorra\" & Srep.Name
    
    ElseIf InStr(Srep, "ARM") <> 0 Then
    SrepFSO.MoveFile Source:=SrepFSO.GetFile(Srep), _
    Destination:=TargetFolder & "Armenia\" & Srep.Name
    
    ElseIf InStr(Srep, "GEO") <> 0 Then
    SrepFSO.MoveFile Source:=SrepFSO.GetFile(Srep), _
    Destination:=TargetFolder & "Georgia\" & Srep.Name
    
    End If
    
Next Srep

End Sub

【讨论】:

  • link 中宏的最终版本。修改宏以避免使用多个ElseIf 语句。
猜你喜欢
  • 2011-11-11
  • 1970-01-01
  • 2016-09-26
  • 2015-11-19
  • 2015-10-09
  • 1970-01-01
  • 1970-01-01
  • 2013-11-20
相关资源
最近更新 更多