Excel宏擦除单元格VBA

时间:2017-07-20 14:24:59

标签: excel vba excel-vba directory

我正在尝试创建一个excel宏,列出下一列中的每个文件夹名称及其所有子文件夹,类似于命令提示符树命令。我期待看到的是这样的:

What I expect to see

注意,文件夹2 4和5中没有文件夹,只有文件,我不希望它显示文件。我已经重新打开屏幕更新,所以我可以看到它的作用,它确实列出了没有子文件夹的文件夹在正确的位置,但是然后立即覆盖它们,所以我留下了这个:

What I actually get

这是代码

Sub Example2()
    Dim objFSO As Object
    Dim objFolder As Object
    Dim objSubFolder As Object
    Dim i As Integer, j As Integer

    'Create an instance of the FileSystemObject
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    'Get the folder object
    Set objFolder = objFSO.GetFolder("Y:filepath")

    i = 1
    j = 1

    'loops through each file in the directory and prints their names and path
    For Each objSubFolder In objFolder.subfolders
        'print folder name
        Cells(i + 1, 1) = objSubFolder.Name
        'print folder path
        'Cells(i + 1, 2) = objSubFolder.Path

        For Each objsubsubfolder In objSubFolder.subfolders
            Cells(i + 1, j + 1) = objsubsubfolder.Name
            i = i + 1
        Next objsubsubfolder
    Next objSubFolder
End Sub

1 个答案:

答案 0 :(得分:1)

正如@SJR所指出的那样:如果没有子文件夹,你的循环不会增加 i

在该行之前您需要额外的i = i + 1

For Each objsubsubfolder In objSubFolder.subfolders

旁注:

  1. Always use Long instead of Integer特别是在处理行数时 Excel的行数多于Integer可以处理的行数。

    Dim i As Long, j As Long
    
  2. 您应为所有Cells喜欢

    指定工作表
    Worksheets("SheetName").Cells
    

    避免任何问题。永远不要假设工作表。

  3. 如果您设置.Cells(i + 1, …)的开头而不是.Cells(i, …),那么您可以使用i = 2而不是所有i = 1,这使其更具人性化。