VBA基于文件名中的字符串移动文件
我们收到的Word文件包含ISO 3个字母的国家代码,作为文件名中的字符串。我们希望将这些文件从保留文件夹移动到按国家名称命名的每个国家的现有文件夹 我一直在兜圈子,想让VBA基于文件名中的字符串移动文件,vba,string,file,filenames,move,Vba,String,File,Filenames,Move,我们收到的Word文件包含ISO 3个字母的国家代码,作为文件名中的字符串。我们希望将这些文件从保留文件夹移动到按国家名称命名的每个国家的现有文件夹 我一直在兜圈子,想让InStr工作起来InStr更可取,因为字符串在文件名中的位置可以更改 有人能告诉我我的代码有什么问题吗?它运行,但什么也不做 还有很多国家/地区文件(60+ISO代码)。对于每个和其他,是否有比更智能的方法 非常感谢 Sub MoveFiles_SpecificFolders() Dim SrepFSO As FileSys
InStr
工作起来InStr
更可取,因为字符串在文件名中的位置可以更改
有人能告诉我我的代码有什么问题吗?它运行,但什么也不做
还有很多国家/地区文件(60+ISO代码)。对于每个和其他,是否有比更智能的方法
非常感谢
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
Sub-MoveFiles\u specific folders()
将SrepFSO设置为文件系统对象
Dim Srep作为文件
将HldFolder变暗为文件夹
Dim HoldingFolder作为字符串
将TargetFolder设置为字符串
作为字符串的Dim Fname
Fname=(HoldingFolder&“*.doc*”)
HoldingFolder=“C:\Users\Temp\Test\”
TargetFolder=“C:\Users\differentitpath\MSfolders\”
设置SrepFSO=New Scripting.FileSystemObject
设置HldFolder=SrepFSO.GetFolder(HoldingFolder)
对于HldFolder.Files中的每个Srep
如果InStr(Fname,“ALB”)为0,则
SrepFSO.MoveFile源:=SrepFSO.GetFile(Srep)_
目的地:=TargetFolder&“阿尔巴尼亚\”和Srep.Name
ElseIf InStr(Fname,“AND”)0然后
SrepFSO.MoveFile源:=SrepFSO.GetFile(Srep)_
目的地:=DestinationFolder&“andror\”和Srep.Name
ElseIf InStr(Fname,“ARM”)0然后
SrepFSO.MoveFile源:=SrepFSO.GetFile(Srep)_
目的地:=DestinationFolder&“亚美尼亚\”和Srep.Name
如果结束
下一个Srep
端接头
以这种方式遵循您的代码:
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循环的后面部分,您将看到一个问题-
如果InStr(Fname,“ALB”)为0,则
->如果InStr(Srep,“ALB”)为0,则应为如果InStr(Srep,“ALB”)为0,则
由于@BigBen和@vityta,更正了代码
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
Sub-MoveFiles\u specific folders()
将SrepFSO设置为文件系统对象
Dim Srep作为文件
将fso设置为新的FileSystemObject
将HldFolder变暗为文件夹
Dim HoldingFolder作为字符串
将TargetFolder设置为字符串
HoldingFolder=“C:\Users\xyz\Test\u docs\”
TargetFolder=“C:\Users\xyz\MSfolders\”
设置fso=CreateObject(“Scripting.FileSystemObject”)
设置SrepFSO=New Scripting.FileSystemObject
设置HldFolder=SrepFSO.GetFolder(HoldingFolder)
对于HldFolder.Files中的每个Srep
如果仪表(Srep,“ALB”)为0,则
SrepFSO.MoveFile源:=SrepFSO.GetFile(Srep)_
目的地:=TargetFolder&“阿尔巴尼亚\”和Srep.Name
ElseIf InStr(Srep,“和”)0然后
SrepFSO.MoveFile源:=SrepFSO.GetFile(Srep)_
目的地:=TargetFolder&“andror\”和Srep.Name
其他仪表(Srep,“ARM”)0
SrepFSO.MoveFile源:=SrepFSO.GetFile(Srep)_
目的地:=TargetFolder&“亚美尼亚\”和Srep.Name
其他仪器(Srep,“GEO”)0
SrepFSO.MoveFile源:=SrepFSO.GetFile(Srep)_
目标:=TargetFolder&“Georgia\”和Srep.Name
如果结束
下一个Srep
端接头
Fname=(HoldingFolder&“*.doc*”)
-这只意味着Fname
是“*doc*”
-您的指令行都不会计算为true。我会将其分解为子任务。创建一个字典,其中3个字母的代码为键,文件夹名称为值。然后在一个循环中,提取代码,从字典中获取文件夹名称并移动文件。谢谢@Kostas K,这一定是下一步,因为我的简单代码正在工作!但下一个问题是Fname
在分配之后从未更改或使用。OP应该使用Srep
@BigBen-必须检查、复制整个过程,但我想你是对的。无论如何,我看到它在这里被使用-If InStr(Fname,“ALB”)
。我想应该是Srep
而不是Fname
…非常感谢大家!它与Srep一起工作
。。。当我使用一致的路径时。非常感谢@cdjf-欢迎您在中使用宏的最终版本。修改宏以避免使用多个ElseIf
语句。