【问题标题】:Excel loop stops workingExcel 循环停止工作
【发布时间】:2016-02-24 10:01:52
【问题描述】:

我构建了一个 Excel 宏,它从选定文件夹(包括任何子文件夹中的 XLS 文件)中的所有 XLS 文件中获取第一张工作表,并将工作表复制到新工作簿中的单个工作表上。该代码在大多数情况下似乎工作正常,我打算使用它将数千个 Excel 工作表合并到一个文件中。

但是问题是循环在某个时候停止工作,没有引发错误。有时是几百个文件,有时更多。但是这个过程似乎不可靠,我不知道为什么。

这是我的代码(我调用 Merge 宏,然后调用 DoFolder Sub):

Sub Merge()
    Dim FileSystem As Object
    Dim HostFolder As String
    HostFolder = "C:\XLSfiles"
    Set FileSystem = CreateObject("Scripting.FileSystemObject")
    DoFolder FileSystem.GetFolder(HostFolder)
End Sub
Sub DoFolder(Folder)
    Dim unusedRow As Long 'used for writing the file path info before each copied sheet
    Dim path As String, ThisWB As String, lngFilecounter As Long
    Dim wbDest As Workbook, shtDest As Worksheet, ws As Worksheet
    Dim Filename As String, Wkb As Workbook
    Dim CopyRng As Range, Dest As Range
    Dim RowofCopySheet As Integer
    RowofCopySheet = 2 ' Row to start on in the sheets you are copying from
    ThisWB = ActiveWorkbook.Name
    Set shtDest = ActiveWorkbook.Sheets(1)
    Dim SubFolder
        For Each SubFolder In Folder.SubFolders
        DoFolder SubFolder
    Next
    Dim File
    ActiveWindow.WindowState = xlMinimized
    For Each File In Folder.Files
        ' Operate on each file
        unusedRow = Cells.SpecialCells(xlCellTypeLastCell).Offset(1, 0).Row
        If Not Filename = ThisWB Then
            Set Wkb = Workbooks.Open(File)
            Set CopyRng = Wkb.Sheets(1).Range(Cells(RowofCopySheet, 1),Cells(ActiveSheet.UsedRange.Rows.Count, ActiveSheet.UsedRange.Columns.Count))
            Set Dest = shtDest.Range("A" & shtDest.UsedRange.SpecialCells(xlCellTypeLastCell).Row + 1)
            CopyRng.Copy Dest
            Wkb.Close False
        End If
        Cells(unusedRow, 1) = File
        Application.StatusBar = File
    Next
    Range("A1").Select
End Sub

我错过了什么?

【问题讨论】:

  • 根据您的描述,我认为您只是达到了工作表可以容纳的极限;此限制为 1,048,576 行 x 16,384 列。您希望实现的究竟是什么?对我来说,这听起来像是数据库而不是 Excel 工作表?
  • 我不认为会是这样。每个 XLS 文件的数据行数不超过 50 行,列数不超过 30-40。所以它最多应该是 100K 行,永远不会超过 500K。
  • 确切的目的是将几千个excel文件中的第一张表合并成一个excel文件。例如,如果我有 2000 个 Excel 文件,每个文件有 50 行数据,我的最终结果将是一个包含 2000 x 50 = 100K 行数据的 Excel 文件。
  • 这就是您在帖子中描述的内容,但这不是确切的目的。 为什么你这样做?我想这是为了评估/整合各种数据。对吗?

标签: excel vba merge


【解决方案1】:

试试这个:

  1. 您可以简单地设置它们的值,而不是复制范围
  2. 在处理多张工作表时不要使用Cells;始终明确说明您要处理其单元格的对象/工作表

对我有用的示例:

For Each fi In f.Files
    If InStr(1, Right(fi.Name, 5), ".xls") > 0 Then

        Set Wkb = Workbooks.Open(fi)
        Set ws = Wkb.Sheets(1)

        rowCount = ws.UsedRange.Rows.Count
        colCount = ws.UsedRange.Columns.Count

        ranString = shtDest.Cells(curRow, 1).Address & ":" & shtDest.Cells(curRow + rowCount, colCount).Address
        Set ran = ws.Range(ws.Cells(2, 1).Address, ws.Cells(rowCount, colCount).Address)
        Set destRan = shtDest.Range(ranString)
        destRan.Value = ran.Value
        curRow = curRow + rowCount

        Wkb.Close False
    End If
Next fi

首先构建范围字符串可能看起来有点冗长,但它使调试更容易。

【讨论】:

    猜你喜欢
    • 2015-12-08
    • 1970-01-01
    • 2016-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多