Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
12
返回列表 发新帖
楼主: woodas

求从EXCEL表里读取指定列的数据依次创建文件夹

[复制链接]
发表于 2019-11-7 18:02 | 显示全部楼层
回复

使用道具 举报

 楼主| 发表于 2019-11-8 10:05 | 显示全部楼层
爱疯 发表于 2019-11-7 10:58
Sub test()
    Dim fso, tf, A, p$, f$, i%
    Set fso = CreateObject("Scripting.FileSystemObject") ...

版大,如果还想把这个代码加深是否可行:

就是在读取姓名列的时候,当判断姓名文件夹存在同名的情况,跳出一个消息框显示[Y/N],选择Y表示有同名存在并自动为同名的文件夹命名为:姓名-1、姓名-2……,选择N表示已有同名文件夹存在,但跳过并继续下一语句。要实现此种不知代码要怎么修改?

回复

使用道具 举报

发表于 2019-11-8 10:21 | 显示全部楼层
弹出消息框的使用感受可能不好,比如有几十个重名的人 .... 哪怕只5,6个,恐怕就很不好受了吧?
个人觉得最好数据源中增加1列编号(比如交易编号,可确保不重复就行),用于替代姓名来生成文件夹。

所以,要先看源头上可能有怎样的改善,再来想后面的处理方式。
回复

使用道具 举报

 楼主| 发表于 2019-11-8 11:19 | 显示全部楼层
爱疯 发表于 2019-11-8 10:21
弹出消息框的使用感受可能不好,比如有几十个重名的人 .... 哪怕只5,6个,恐怕就很不好受了吧?
个人觉得 ...

嗯嗯,版大说的也是,当重名有多个时,就会不太好受了。

那转换一下思路,是否可以这样:仍然在代码执行前给出一条消息,Y: 自动为该列所有同名字段重命名文件夹; N: 该列所有同名字段只保留第一个姓名;这样就只会在开头提示一次,后面的就交给代码处理了。
回复

使用道具 举报

发表于 2019-11-8 11:41 | 显示全部楼层
        f = p & "\" & A(i, 2)
        If Application.CountIf([b:b], A(i, 2)) > 1 Then f = f & "_" & A(i, 1)
        If fso.FolderExists(f) Then Call fso.DeleteFolder(f)



地址3.rar (21.5 KB, 下载次数: 3)
回复

使用道具 举报

 楼主| 发表于 2019-11-8 12:04 | 显示全部楼层
爱疯 发表于 2019-11-8 11:41
f = p & "\" & A(i, 2)
        If Application.CountIf(, A(i, 2)) > 1 Then f = f & "_" & A(i, ...

真的好佩服版大的思路呀,当同名>1这样一句话就搞定了,简捷工整,酐畅淋漓!!

是鄙人望所不能及也……
回复

使用道具 举报

 楼主| 发表于 2019-11-8 12:35 | 显示全部楼层
本帖最后由 woodas 于 2019-11-8 13:58 编辑
爱疯 发表于 2019-11-8 11:41
f = p & "\" & A(i, 2)
        If Application.CountIf(, A(i, 2)) > 1 Then f = f & "_" & A(i, ...

看了版大的代码,似乎又另有所启发,如果改成:

f = p & "\" & A(i, 2)
        If fso.FolderExists(f) Then f = f & "_" & 1 + 变量  
        fso.CreateFolder (f)

这样可行吗?我不懂VBA语法,可以的话怎么写标准

回复

使用道具 举报

 楼主| 发表于 2019-11-8 13:14 | 显示全部楼层
本帖最后由 woodas 于 2019-11-8 13:57 编辑



回复

使用道具 举报

发表于 2019-11-8 14:35 | 显示全部楼层
woodas 发表于 2019-11-8 12:35
看了版大的代码,似乎又另有所启发,如果改成:

f = p & "\" & A(i, 2)

1)
f = f & "_" & 1 + 数值变量
这里需套1个括号,否则将是字符串和数值相加,会报错
f = f & "_" & (1 + 数值变量)



2)
If Application.CountIf([b:b], A(i, 2)) > 1 Then f = f & "_" & A(i, 1)
改为
If Application.CountIf([b:b], A(i, 2)) > 1 Then f = f & "_第" & i & "行_" & A(i, 1)

虽然加了A(i, 1)后重名几率很小,但不绝对。
为确保绝对不重名,可加上重名数据的行号。加不加A(i, 1)随意。

回复

使用道具 举报

 楼主| 发表于 2019-11-8 16:39 | 显示全部楼层
谢谢版主,不厌其烦的给予解答
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-4-27 06:44 , Processed in 0.325245 second(s), 6 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表