Excel 创建文件夹和子文件夹

Excel 创建文件夹和子文件夹,excel,vba,Excel,Vba,我有一个Excel文件,其中有数百个客户姓名和几条商品编号 我想检查所选客户名称的文件夹是否存在,如果缺少,则创建一个文件夹。 找到或创建客户文件夹后,请检查是否有每个商品编号的文件夹,如果缺少,请创建一个 我发现Scott Holtzman发布的代码似乎可以做到这一切,甚至更多 我引用了Microsoft脚本运行时作为代码请求。 两个“If not”语句都标记为红色,弹出窗口仅显示“Compile error” 我检查了“If not”语句的语法,它似乎是正确的 ”需要引用Microsoft脚

我有一个Excel文件,其中有数百个客户姓名和几条商品编号

我想检查所选客户名称的文件夹是否存在,如果缺少,则创建一个文件夹。
找到或创建客户文件夹后,请检查是否有每个商品编号的文件夹,如果缺少,请创建一个

我发现Scott Holtzman发布的代码似乎可以做到这一切,甚至更多

我引用了Microsoft脚本运行时作为代码请求。
两个“If not”语句都标记为红色,弹出窗口仅显示“Compile error”

我检查了“If not”语句的语法,它似乎是正确的

”需要引用Microsoft脚本运行时
子文件夹()
Dim strComp作为字符串,strPart作为字符串,strPath作为字符串
strComp=Range(“A1”)采用A1中的公司名称
strPart=CleanName(范围(“C1”))表示C1中的一部分
strPath=“C:\Images\”
如果不存在FolderExists(strPath和strComp),则
“公司不存在,所以创建完整路径
文件夹创建strPath&strComp&“\”&strPart
其他的
'公司确实存在,但零件文件夹不存在
如果不存在折叠(strPath&strComp&“\”&strPart),则
文件夹创建strPath&strComp&“\”&strPart
如果结束
如果结束
端接头
函数FolderCreate(ByVal路径为字符串)为布尔值
FolderCreate=True
将fso设置为新的FileSystemObject
如果Functions.FolderExists(path)则
退出功能
其他的
关于错误转到死水中
fso.CreateFolder path“如果路径真的出错了,这会有什么错误吗?
退出功能
如果结束
死水:
MsgBox“无法为以下路径创建文件夹:“&path&”。请检查路径名,然后重试。”
FolderCreate=False
退出功能
端函数
函数FolderExists(ByVal路径为字符串)为布尔值
FolderExists=False
将fso设置为新的FileSystemObject
如果fso.FolderExists(路径),则FolderExists=True
端函数
函数CleanName(strName作为字符串)作为字符串
'将清除零件#名称,以便将其转换为有效的文件夹名称
'可能需要添加更多行以删除其他字符
CleanName=Replace(strName,“/”,“”)
CleanName=Replace(CleanName,“*”,“”)
“等等。。。
端函数
StrComp问题 您不能使用StrComp,它是一个保留字,实际上是一个字符串函数。前几天我在这个问题上浪费了大约15分钟


VBA说:返回一个变量(整数),指示字符串比较的结果。

如果要速记一组代码,请使用MKDIR创建每个级别的文件夹\子文件夹,并传递错误

Option Explicit

Sub main()

    Dim pth As String

    pth = "c:\test\abc\123\test_again\XYZ\01-20-2019"

    'folder may or may not exist

    makeFolder pth

    'folder definitely exists

End Sub

Sub makeFolder(fldr As String)

    Dim i As Long, arr As Variant

    'folder may or may not exist

    arr = Split(fldr, Chr(92))
    fldr = arr(LBound(arr))

    On Error Resume Next
    For i = LBound(arr) + 1 To UBound(arr)
        fldr = Join(Array(fldr, arr(i)), Chr(92))
        MkDir fldr
    Next i
    On Error GoTo 0

    'folder definitely exists

End Sub

看看下面的示例,它显示了使用递归子调用的一种可能方法:

选项显式
次级测试
昏针
暗淡的土耳其人
暗淡浮渣机
暗色纱丽
昏花
sPath=“C:\Test”
aCustomers=数组(“Customer01”、“Customer02”、“Customer03”、“Customer04”、“Customer05”)
a条=数组(“第01条”、“第02条”、“第03条”、“第04条”、“第05条”)
对于每一个在aCustomers中的sCustomer
对于aArticles中的每个sarticles
SmartCreateFolder sPath&“\”&sCustomer&“\”&sArticle
下一个
下一个
端接头
子TestFromSheet()
昏针
暗淡的土耳其人
昏暗的我
Dim j
昏花
sPath=“C:\Test”
使用此工作簿。工作表(1)
aCustomers=.Range(.Range(“A1”),.Range(“A1”).End(xlDown)).Value
aArticles=.Range(“B1:B10”).值
以
对于i=LBound(aCustomers,1)到UBound(aCustomers,1)
对于j=LBound(aArticles,1)到UBound(aArticles,1)
SmartCreateFolder sPath&“\”&aCustomers(i,1)&“\”&aArticles(j,1)
下一个
下一个
端接头
子SmartCreateFolder(sFolder)
作为对象的SO的静态特性
如果oFSO为空,则设置oFSO=CreateObject(“Scripting.FileSystemObject”)
用oFSO
如果不是。FolderExists(sFolder)则
SmartCreateFolder.GetParentFolderName(sFolder)
.CreateFolders文件夹
如果结束
以
端接头
Sub-testarray()
检查并从硬编码数组中为客户和文章创建文件夹,
Sub-TestFromSheet()
从第一张工作表中获取客户和文章,例如,客户范围从A1到最后一个元素,因此其中应该有多个元素,以及设置为固定范围B1:B10的物品,如下所示:


要在创建所有子目录时将现有文件重命名为新位置,可以使用:

File_Name_OLD = File_Pad_OLD & "Test.txt"
File_Pad_NEW = "e:\temp\test1\test2\test3\"
File_Name_NEW = File_Pad_NEW & "Test.txt"

X = File_Pad_NEW
A = 1
Do Until A = 0
A = InStr(X, "\")
Y = Y & Left(X, A)
X = Mid(X, A + 1)
If Dir(Y, 16) = "" Then MkDir Y
Loop
Name File_Name_OLD As File_Name_NEW

这将创建带有子目录的新路径,并将旧文件重命名为新文件。

是VBA函数,重命名变量将是solution@Storax实际上,在通过声明
Dim StrComp
重写内在函数后,可以使用变量
StrComp
,而不受任何限制。编译器甚至停止将其突出显示为保留字。如果一次只有一个客户处于活动状态,如何调整aCustomer数组部分?目前它至少需要2个客户。
aCustomers=Array(“Customer01”)
我有一个客户名称所在的单元格(B7),Array不希望只接受一个值。@HenryR我已经用如何从工作表中获取源数据的示例更新了答案。@omegastripes祝贺优雅的SmartCreateFolder。实际上,通过声明
Dim StrComp
重写内在函数后,可以使用变量
StrComp
,无任何限制。编译器甚至停下来把它突出显示为保留字。@omegastripes:我不明白你在说什么。你能详细说明一下吗?或者提供一个链接。顺便说一句,当我使用'Sub StrCompIssue()Dim StrComp StrComp StrComp=“The StrComp Issue”Debug.Print Str