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
工作表并删除预先存在的信息合并的工作表!!!错误
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中可能是一些奇怪的继承问题,但不是很确定(因此下面的问题)
问题
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”列中没有数据的原因