导入多行时Excel冻结

导入多行时Excel冻结,excel,vba,Excel,Vba,我创建了一个宏来将多个电子表格导入到主报表中。我用一些小文件测试了它,没有任何问题。但是,当我试图导入一个包含多行的文件时,excel会一直冻结 Sub openFile(ByRef file As String) Dim wbMaster As Workbook: Set wbMaster = ThisWorkbook Dim wsMaster As Worksheet: Set wsMaster = wbMaster.Sheets("Report")

我创建了一个宏来将多个电子表格导入到主报表中。我用一些小文件测试了它,没有任何问题。但是,当我试图导入一个包含多行的文件时,excel会一直冻结

Sub openFile(ByRef file As String)
    Dim wbMaster As Workbook: Set wbMaster = ThisWorkbook
    Dim wsMaster As Worksheet: Set wsMaster = wbMaster.Sheets("Report")
    Dim tbMaster As ListObject: Set tbMaster = wsMaster.ListObjects("Report")
    Dim hdrMaster As ListColumn
    Dim rowMaster As ListRow
    Dim wbSlave As Workbook: Set wbSlave = Workbooks.Open(Application.ActiveWorkbook.path & "\" & file)
    Dim wsSlave As Worksheet
    Dim rowSlave As Range
    Dim cellSlave As Range
    Dim hdrSlave() As Variant
    
    For Each wsSlave In wbSlave.Worksheets
        For Each rowSlave In wsSlave.Rows
            If rowSlave.Row <= 1 Then
                For Each cellSlave In rowSlave.Cells
                    If Not IsEmpty(cellSlave) Then
                        Set hdrMaster = Nothing
                        On Error Resume Next
                            Set hdrMaster = tbMaster.ListColumns(cellSlave.Text)
                        On Error GoTo 0
                        If hdrMaster Is Nothing Then
                            Set hdrMaster = tbMaster.ListColumns.Add
                            hdrMaster.Name = cellSlave.Text
                        End If
                        ReDim Preserve hdrSlave(cellSlave.Column)
                        hdrSlave(cellSlave.Column) = cellSlave.Text
                    Else
                        Exit For
                    End If
                Next cellSlave
            Else
                If Not IsEmpty(rowSlave.Cells(1)) Then
                    Set rowMaster = tbMaster.ListRows.Add
                    rowMaster.Range(tbMaster.ListColumns("File").Index) = file
                    For Each cellSlave In rowSlave.Cells
                        If Not IsEmpty(cellSlave) Then
                            rowMaster.Range(tbMaster.ListColumns(hdrSlave(cellSlave.Column)).Index) = cellSlave.Text
                        Else
                            Exit For
                        End If
                    Next cellSlave
                Else
                    Exit For
                End If
            End If
        Next rowSlave
    Next wsSlave
    
    tbMaster.Range.Columns.AutoFit
    
    wbMaster.Save
    wbSlave.Close (False)
End Sub
子openFile(ByRef文件作为字符串)
将wbMaster设置为工作簿:设置wbMaster=ThisWorkbook
将wsMaster设置为工作表:设置wsMaster=wbMaster.Sheets(“报告”)
将tbMaster设置为ListObject:设置tbMaster=wsMaster.ListObjects(“报告”)
Dim hdrMaster作为列表列
将rowMaster设置为ListRow
将wbSlave设置为工作簿:设置wbSlave=Workbooks.Open(Application.ActiveWorkbook.path&“\”文件)
将wsSlave设置为工作表
变暗行作为范围
暗淡的单元格作为范围
Dim hdrSlave()作为变量
对于wbSlave.工作表中的每个wsSlave
对于wsSlave.Rows中的每个rowSlave
如果rowsave.Row这就是我的意思

我已经完成了将一个范围附加到表/列表对象的过程,并将其添加到
AddRangeintoTable
——您可以从主代码中调用它

我有一个stub方法
Tester
作为如何调用它的示例

注意主代码底部关于添加新内容后是否需要调整表大小的注释-选项中有一个用于控制该设置的设置

子测试仪()
AddRangeInTable范围(“A4”)。当前区域_
ActiveSheet.ListObjects(“表2”)_
真的
端接头
'将范围附加到表/列表对象上,可以选择插入
'在表中找不到任何列
子AddRangeInTable(FromRange作为Range,ToTable作为ListObject_
可选的AppendNewCols(布尔值=False)
Dim c作为范围,lc作为列表列,数据,rw,col,newData(),hdr
Dim dictColPos,rngHdrs作为范围,i作为长,numRows作为长,numCols作为长
data=FromRange.Value'将所有新数据作为数组获取
为映射列设置dictColPos=CreateObject(“scripting.dictionary”)”
'映射标题,并(可选)添加尚未存在的任何必要标题
对于col=1到UBound(数据,2)
hdr=数据(1列)
设置lc=无
出错时继续下一步
设置lc=ToTable.ListColumns(hdr)
错误转到0
如果lc为Nothing并追加newcols,则“添加错误列”?
设置lc=ToTable.ListColumns.Add
lc.Name=hdr
如果结束
如果不是信用证,那么什么都不是
dictColPos(hdr)=lc.Index'将标题名称映射到列索引位置
如果结束
下一列
'调整要附加到listobject并填充的数据的数组大小
numRows=UBound(数据,1)-1
numCols=ToTable.ListColumns.Count
ReDim newData(1到numRows,1到numCols)
对于rw=2至UBound(数据,1)
对于col=1到UBound(数据,2)
如果dictColPos.存在(数据(1,col)),则
newData(rw-1,dictColPos(data(1,col))=data(rw,col)
如果结束
下一列
下一个rw
不稳定
With.DataBodyRange
.Rows(.Rows.Count).单元格(1).偏移量(1,0)_
.Resize(numRows,numCols)。Value=newData'添加新数据
以
'Excel选项>>校对>>自动更正选项>>键入时自动格式化
“>>”在表中包括新行和新列“
如果不是Application.AutoCorrect.AutoExpandListRange,则
.Resize ToTable.Range.Resize(.Range.Rows.Count+numRows)
如果结束
.Range.Columns.AutoFit
以
端接头

在现有数据下方添加新行(最好使用基于数组的方法,而不是逐个单元格),然后在完成后调整表的大小即使主报表和从报表不具有相同的列,这是否可行?因为大多数情况下,从属报告的列不相同,顺序也不相同。因为用户不断地改变它们。你会首先根据需要调整列,然后复制行。然后这有点违背了我宏的目的。我还是手工做为好。问题是我必须合并10到20份报告。这个过程经常重复,因此非常耗时。我没有说任何关于手动步骤的内容-您已经有了调整列的代码。我尝试了这个sub,并在
.Rows(.Rows.Count).Cells(1).Offset(1,0)\uuz>处得到了一个“运行时错误91:对象变量或未设置块变量”。我在我的问题中发布了我的电话。工作示例:你的示例确实有效,我想知道我做错了什么。我已经使用.Select和退出调用测试了第一个参数,以查看选择的范围。然后我对表格做了同样的处理,我得到了适当的元素。可能是因为范围不在同一个文件中?与仅仅在普通的靶场上工作相比,整张桌子简直是个麻烦事。太多的“惊奇它自动做这件事!”功能。我稍后会看你的文件-现在正在工作…你有机会看一下吗?