VBA每日一练(9),VBA如何统计文件夹内的文件数量,文件名,以及按类型统计,按是否有内容统计

1 界定问题

我发现我现在入门阶段,读题经常偏题

这个问题,我觉得可以细化下  

  1. 统计文件夹内, 所有文件个数,filecount?
  2. 统计文件夹内,某种类型的文件个数
  3. 统计文件夹内, 所有文件名,这不有点像 dir吗?
  4. 统计文件夹内,所有非空文件的文件个数
  5. 统计文件夹内,所有某后缀名的非空文件的文件个数
  6. 统计文件夹内,所有非空文件的文件名

 

2 不用fso 用VBA的 文件操作语句

  代码1 正确的代码

Option Explicit


Sub richardliu1()

Dim path1, path2, path3
Dim fd1, f1, f2
Dim k, j

path1 = "C:\Users\Administrator\Desktop\test1"
path2 = "*.*"
path3 = "*.txt"
k = 1
j = 1

fd1 = Dir(path1, vbDirectory)
f1 = Dir(path1 & "\" & path2)


' f1.name只有对象才可以这么使用,由于 f1不是对象,不能这样引用对象的方法的语法
'dir返回的的不是 文件file对象,而只是文件名,VB默认都是文本字符串
'只有fso相关的是对象
Debug.Print "fd1是" & fd1
Debug.Print "f1是" & f1


Open path1 & "\" & f1 For Input As #1
'这里如果只写 open f1 因为路径不完整会报错找不到
Do While Len(f1) <> 0

f1 = Dir
'Debug.Print k
'Debug.Print f1
k = k + 1
Loop
Close #1
Debug.Print k


f2 = Dir(path1 & "\" & path3)
'特别注意,这个dir不能写在 f1的循环前,否则会影响 *.*的判断循环
Debug.Print "f2是" & f2
Open path1 & "\" & f2 For Input As #2
Do While Len(f2) <> 0
f2 = Dir
'Debug.Print j
'Debug.Print f2
j = j + 1
Loop
Close #2
Debug.Print j



End Sub

 

代码1-1:纯粹的错误例子,而且无法运行---放这后面再看看自己为啥这么挫把


Sub robinlee1()  '错误例子,我写的第一个,太烂了,思路混乱
Dim x1, str1

'x1 = FreeFile

str1 = 999
'不知道这么启动循环是不是太山寨,行不行
'*.*这样可以查找所有文件吧?
'如果只是取文件名呢,怎么取
'这是取非空文件,不是取文件数,或文件名把

k = 0

Do While Len(str1)

Open "C:\Users\Administrator\Desktop" & "\*.*" For Input As #1
Input #1, str1
Debug.Print str1
k = k + 1
Close #1
Loop

End Sub

Sub robinlee1()

'先统计*.*的个数
'我的想法是,先dir进这个文件夹,或直接找到这个文件夹,逐一loop所有文件
'文件名不为空那就是有文件
'然后把文件名,文件内容取出来



do while len()

   Open "C:\Users\Administrator\Desktop" For Input As #1
   name1 = #1.name
   
   
   Close #1
Loop


End Sub

 

 

不用fso也可以

Sub jack007()
   
   x1 = FileCount("C:\Users\Administrator\Desktop\test1\")
   Debug.Print x1

End Sub


Function FileCount(cPath As String) As Integer
    cFile = Dir(cPath & "*.txt")
    Do While cFile <> ""
        FileCount = FileCount + 1
        cFile = Dir
    Loop
    Debug.Print FileCount
End Function

 

 

2 用FSO的

代码2:用 fso写很简单

Sub jackma22()

Dim fso
Dim f1


Set fso = CreateObject("scripting.filesystemobject")
Set f1 = fso.getfolder("C:\Users\Administrator\Desktop\test1")
Debug.Print f1.Name
Debug.Print f1.Files.Count

End Sub

如果还有子文件夹多层呢?

 

http://club.excelhome.net/thread-959260-1-1.html

Function FileCount(cPath As String) as Integer

    cFile=Dir(cPath & "*.*")

    Do While cFile<>""

        FileCount=FileCount+1

        cFile=Dir

    Loop

End Function

 

  1. Private Sub CommandButton1_Click()
  2.     fp = "d:\DWG\*.*"
  3.     fn = Dir(fp)
  4.     i = 1
  5.     [b2:b65536].ClearContents
  6.     Do While fn <> ""
  7.         i = i + 1
  8.         Cells(i, 2).Value = fn
  9.         fn = Dir
  10.     Loop
  11. End Sub
  • 2
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 以下是完成此任务的 VBA 代码: ``` Sub MergeExcelSheets() Dim wbDest As Workbook Dim wbSrc As Workbook Dim wsSrc As Worksheet Dim strPath As String Dim strFile As String Dim strFiles As String '设置目标文件夹的路径 strPath = "C:\Users\YourName\Documents\Excel Files\" '获取该文件夹内所有 Excel 文件的名称 strFiles = Dir(strPath & "*.xl*") '创建一个新的工作簿作为合并后的目标文件 Set wbDest = Workbooks.Add '循环遍历每一个源文件 Do While strFiles <> "" strFile = strPath & strFiles Set wbSrc = Workbooks.Open(strFile) Set wsSrc = wbSrc.Sheets(1) '将每一个源文件的第一张工作表复制到目标工作簿的最后一个工作表 wsSrc.Copy After:=wbDest.Sheets(wbDest.Sheets.Count) wbSrc.Close False '继续遍历下一个源文件 strFiles = Dir Loop End Sub ``` 在运行此代码前,请确保替换 `strPath` 变量为您自己的文件夹路径,以确保代码可以正确访问该文件夹内的 Excel 文件。 ### 回答2: 以下是一个将同一文件夹内按文件名排序的Excel的第一张工作表合并的VBA代码: ```vba Sub 合并工作表() Dim 文件夹路径 As String Dim 文件名 As String Dim wb合并 As Workbook Dim wb源 As Workbook Dim ws源 As Worksheet Dim 行号 As Long ' 设置文件夹路径 文件夹路径 = "C:\你的文件夹路径\" ' 替换为你的文件夹路径 ' 创建一个新工作簿用来合并数据 Set wb合并 = Workbooks.Add ' 循环遍历文件夹中的所有文件 文件名 = Dir(文件夹路径 & "*.xls*") ' 只考虑Excel文件(xls和xlsx) Do Until 文件名 = "" ' 打开源工作簿 Set wb源 = Workbooks.Open(文件夹路径 & 文件名) ' 将源工作簿的第一张工作表复制到合并工作簿 Set ws源 = wb源.Sheets(1) ws源.Copy After:=wb合并.Sheets(wb合并.Sheets.Count) ' 关闭源工作簿,不保存更改 wb源.Close False ' 继续下一个文件 文件名 = Dir Loop ' 删除合并工作簿的第一个空白工作表 Application.DisplayAlerts = False ' 禁止显示删除警告 wb合并.Sheets(1).Delete Application.DisplayAlerts = True ' 激活合并工作簿的第一张工作表 wb合并.Sheets(1).Activate ' 设置合并后的工作簿的名称和保存路径 文件名 = 文件夹路径 & "合并工作表.xlsx" ' 替换为你想要的文件名称和保存路径 ' 保存合并后的工作簿 wb合并.SaveAs 文件名 ' 关闭合并工作簿 wb合并.Close ' 清理内存 Set wb合并 = Nothing Set wb源 = Nothing Set ws源 = Nothing MsgBox "合并完成!合并后的工作簿路径为:" & 文件名, vbInformation End Sub ``` 请将上述代码中的`C:\你的文件夹路径\`替换为你要合并文件文件夹路径,并将`文件夹路径 & "合并工作表.xlsx"`替换为你想要合并工作表保存的文件名和路径。执行此代码后,将会在指定的文件夹路径下生成一个合并后的工作簿。 请注意,在执行代码之前,确保没有其他Excel工作簿处于打开状态,以便代码能够正确运行。 ### 回答3: 以下是一个VBA代码,用于将同一文件夹内所有按文件名排序的Excel的第一张工作表合并。 ```VBA Sub 合并工作表() Dim 文件夹路径 As String Dim 文件名 As String Dim 文件类型 As String Dim 目标工作簿 As Workbook Dim 源工作簿 As Workbook Dim 目标工作表 As Worksheet Dim 源工作表 As Worksheet Dim i As Long '设置要合并的文件夹路径 文件夹路径 = "C:\你的文件夹路径\" '设置要合并的文件类型(这里假设为.xlsx文件文件类型 = "*.xlsx" '创建一个新的目标工作簿 Set 目标工作簿 = Workbooks.Add '打开目标工作簿的第一个工作表 Set 目标工作表 = 目标工作簿.Sheets(1) '获取指定文件夹内的所有文件名 文件名 = Dir(文件夹路径 & 文件类型) '循环遍历每个文件 Do While 文件名 <> "" '打开源工作簿 Set 源工作簿 = Workbooks.Open(文件夹路径 & 文件名) '复制源工作簿的第一个工作表到目标工作簿的末尾 Set 源工作表 = 源工作簿.Sheets(1) 源工作表.UsedRange.Copy 目标工作表.Cells(目标工作表.Cells(Rows.Count, 1).End(xlUp).Row + 1, 1) '关闭源工作簿 源工作簿.Close False '获取下一个文件名 文件名 = Dir Loop '保存目标工作簿 目标工作簿.SaveAs 文件夹路径 & "合并工作表.xlsx" '关闭目标工作簿 目标工作簿.Close '显示一个完成消息 MsgBox "已将所有工作表合并到一个文件中。", vbInformation End Sub ``` 在代码中,你需要修改`文件夹路径`变量的值为实际的文件夹路径,以及修改`文件类型`变量的值为要合并的文件类型。然后,运行代码即可将同一文件夹内所有按文件名排序的Excel的第一张工作表合并到一个新的工作簿中,并保存为名为"合并工作表.xlsx"的文件。 请注意,此代码假设你的Excel文件没有密码保护,并且所有的工作表都是以第一张工作表开始的。如果有特殊情况,你需要根据实际需求进行相应的修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值