Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VBA基于文件名中的字符串移动文件_Vba_String_File_Filenames_Move - Fatal编程技术网

VBA基于文件名中的字符串移动文件

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

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

我一直在兜圈子,想让
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
语句。