Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VBA-意外的行插入_Vba_Excel - Fatal编程技术网

VBA-意外的行插入

VBA-意外的行插入,vba,excel,Vba,Excel,目标 Sub consolidateConvert() Dim ws As Worksheet 'Set CONSOLIDATED as the active worksheet Application.ScreenUpdating = False Sheets("CONSOLIDATED").Activate 'Clear previous content from active sheet ActiveSheet.Range("A1:G10000").ClearContents 'I

目标

Sub consolidateConvert()
Dim ws As Worksheet

'Set CONSOLIDATED as the active worksheet
Application.ScreenUpdating = False
Sheets("CONSOLIDATED").Activate


'Clear previous content from active sheet
ActiveSheet.Range("A1:G10000").ClearContents

'Iterate through workbooks, except for CONSOLIDATED, TITLE, and PIVOT worksheets
For Each ws In Worksheets
  If ws.Name <> "CONSOLIDATED" And ws.Name <> "PIVOT" And ws.Name <> "TITLE" _
     And ws.Name <> "APPENDIX - CURRENCY CONVERTER" And ws.Name <> "MACRO" Then

'Find last row of current worksheet
    Dim lastRow As Long
    lastRow = ws.Cells(ws.Rows.Count, "E").End(xlUp).Row

'Copy current worksheet cells and insert into CONSOLIDATED worksheet
    ws.Range("A6:G" & lastRow).Copy
    ActiveSheet.Range("A2").End(xlUp).Insert shift:=xlDown
  End If
Next ws

Call currencyConvert
Call addHeaders
从多个工作表中复制一组行,并插入到
合并的
工作表中

方法

  • 转到
    CONSOLIDATED
    工作表并删除预先存在的信息
  • 使用IF语句查找要从中提取数据的相关工作表
  • 复制每个工作表上的相关列和行(例如A6:g(lastrow))
  • 将复制的数据附加到
    合并的
    工作表!!!错误
  • (丑陋)代码

    Sub consolidateConvert()
    Dim ws As Worksheet
    
    'Set CONSOLIDATED as the active worksheet
    Application.ScreenUpdating = False
    Sheets("CONSOLIDATED").Activate
    
    
    'Clear previous content from active sheet
    ActiveSheet.Range("A1:G10000").ClearContents
    
    'Iterate through workbooks, except for CONSOLIDATED, TITLE, and PIVOT worksheets
    For Each ws In Worksheets
      If ws.Name <> "CONSOLIDATED" And ws.Name <> "PIVOT" And ws.Name <> "TITLE" _
         And ws.Name <> "APPENDIX - CURRENCY CONVERTER" And ws.Name <> "MACRO" Then
    
    'Find last row of current worksheet
        Dim lastRow As Long
        lastRow = ws.Cells(ws.Rows.Count, "E").End(xlUp).Row
    
    'Copy current worksheet cells and insert into CONSOLIDATED worksheet
        ws.Range("A6:G" & lastRow).Copy
        ActiveSheet.Range("A2").End(xlUp).Insert shift:=xlDown
      End If
    Next ws
    
    Call currencyConvert
    Call addHeaders
    
    输出

    下面是意外输出的屏幕截图。第2-7行是意外的,包含一些工作簿中其他任何位置都不存在的随机文本字符串。字符串在VBA中可能是一些奇怪的继承问题,但不是很确定(因此下面的问题)

    问题

  • 如前所述,第2-7行是无意中添加的,并伴有一些奇怪的字符串。是否有人知道为什么要添加~6行(而只应添加1行-请参见
    addHeaders()
    )?此外,意外字符串(“catalogname”、“EnvironmentKey”等)的来源是什么

  • 您的问题源于使用
    Activate
    /
    ActiveSheet

    您必须放弃这种编码习惯,这种习惯可能会微妙地误导您,并使用完全限定的范围引用来确保您是在想要的工作簿/工作表范围内操作的

    下面是对代码的重构,使用这些完全限定的范围引用和“值到值”的
    范围
    复制,而不是
    复制
    /
    插入
    ,以大大加快速度:

    Option Explicit
    
    Sub consolidateConvert()
        Dim ws As Worksheet
        Dim lastRow As Long
    
        With Worksheets("CONSOLIDATED") '<--| reference "CONSOLIDATED" worksheet
            .UsedRange.ClearContents '<--| clear its content
    
            'Iterate through workbooks
            For Each ws In Worksheets
                Select Case ws.Name
                    Case "CONSOLIDATED", "PIVOT", "TITLE", "APPENDIX - CURRENCY CONVERTER", "MACRO" ' <--| discard "CONSOLIDATED", "TITLE", "PIVOT", "APPENDIX - CURRENCY CONVERTER" and "MACRO" worksheets
                        ' do nothing
                    Case Else
                        'Find last row of current worksheet
                        lastRow = ws.Cells(ws.Rows.Count, "E").End(xlUp).row
                        'Copy current worksheet cells and insert into CONSOLIDATED worksheet
                        .Cells(.Rows.Count, 1).End(xlUp).Offset(1).Resize(lastRow - 5, 7).Value = ws.Range("A6:G" & lastRow).Value '<--| just copy values and speed thing up!
                End Select
            Next ws
            addHeaders .Name '<--| call AddHeaders passing reference worksheet name (i.e. "CONSOLIDATED")
        End With
    
        currencyConvert '<--| if it acts on "CONSOLIDATED" sheet, you may want to "treat" it as 'addHeaders': take it into 'End With' and pass it '.Name' as a parameter 
    
    End Sub
    
    Sub addHeaders(shtName As String)
        Dim headers As Variant
    
        headers = Array("Fiscal Year", "Month", "Fiscal Month", "Month Year", "Unit", "Project", "Local Expense", "Base Expense") '<--| Define desired headers
        ThisWorkbook.Worksheets(shtName).Range("A1").Resize(, UBound(headers) - LBound(headers) + 1).Value = headers '<--| write headers from cell A1 rightwards
    End Sub
    
    选项显式
    子合并转换()
    将ws设置为工作表
    最后一排一样长
    
    对于工作表(“合并”)“与
    ws.Range(“A6:G”和lastRow)无关。复制ActiveSheet.Range(“A2”).End(xlUp)。插入shift:=xlDown
    ??@tjb1-否(我不这么认为),该部分正在查看其他工作表,复制相关单元格和列,然后将单元格插入合并工作表。我运行了您的代码,没有任何意外的行添加到合并工作表中。它似乎工作得很好。也许您还有其他UDF、外接程序或其他工作?我想知道关于这一行的一些事情:
    ws.Range(“A6:G”&lastRow)。复制
    lastRow
    是否返回值
    ,是否有6个工作表循环?它可能会为每个工作表复制一个空行。哇,这明显快多了。但是,在
    .Cells(.Rows.Count,1).End(xlUp).Offset(1)“1”不应该是这种情况,因为所有范围都>1。注意,当函数运行时,它会将所有正确的信息粘贴到合并表中,但在合并表的顶部(添加标题之前)会留下1个空行。我开始认为,可能在合并页面的最后阶段,该函数也在运行,导致
    lastRow
    =
    1
    ,但是
    Select Case ws.Name…do nothing
    语句应该使合并工作表免受影响。这意味着当前的
    ws
    列“E”没有数据,因此导致
    lastRow=1
    。当工作表出错时,检查
    ws.name
    ,查看该工作表在“E”列中没有数据的原因