Excel 通过从多张图纸中获取每张图纸的第一行,然后移动到第二行,逐行追加到主图纸中
有人能建议我如何从多张图纸中提取每张图纸的第一行,然后再添加到第二行,一行一行地添加到主图纸中吗?假设在第一次迭代中,我们有每张图纸的第一行,它们应该复制并粘贴为主图纸中的第1行、第2行、第3行,然后在下一次迭代中,每个工作表的第二行出现,并在主工作表的末尾添加/追加,这意味着它将是主工作表中的第4行、第5行……等等 我甚至尝试了下面用户发送的代码 但是我不能得到正确的输出Excel 通过从多张图纸中获取每张图纸的第一行,然后移动到第二行,逐行追加到主图纸中,excel,vba,excel-formula,Excel,Vba,Excel Formula,有人能建议我如何从多张图纸中提取每张图纸的第一行,然后再添加到第二行,一行一行地添加到主图纸中吗?假设在第一次迭代中,我们有每张图纸的第一行,它们应该复制并粘贴为主图纸中的第1行、第2行、第3行,然后在下一次迭代中,每个工作表的第二行出现,并在主工作表的末尾添加/追加,这意味着它将是主工作表中的第4行、第5行……等等 我甚至尝试了下面用户发送的代码 但是我不能得到正确的输出 Public Sub MergeTabs() 'Merges selected tabs (or all visible
Public Sub MergeTabs()
'Merges selected tabs (or all visible tabs if only 1 selected) in current workbook into a new tab
Dim i As Integer, wb As Workbook, w As Window, wsTo As Worksheet, wsFrom As Collection 'Worksheet collection
Dim strScope As String, strNewTab As String
Dim raTarget As Range
Set wb = ActiveWorkbook
Set w = ActiveWindow
Set wsFrom = New Collection
If w.SelectedSheets.Count = 1 Then
For i = 1 To wb.Worksheets.Count
If wb.Worksheets(i).Visible Then wsFrom.Add wb.Worksheets(i)
Next
strScope = "ALL VISIBLE"
Else
For i = 1 To w.SelectedSheets.Count
If w.SelectedSheets(i).Visible Then wsFrom.Add w.SelectedSheets(i)
Next
strScope = wsFrom.Count & " SELECTED"
End If
strNewTab = InputBox("Merge data from " & strScope & " sheets to new sheet named:", "Merge tabs", "All")
If strNewTab = vbNullString Then Exit Sub
Set wsTo = wb.Worksheets.Add(wsFrom(1), Count:=1) 'Add before first selected sheet
wsTo.Name = strNewTab
wsFrom(1).Range("A1").CurrentRegion.Copy
wsTo.Range("A1").PasteSpecial xlPasteFormulasAndNumberFormats
Application.CutCopyMode = False
For i = 2 To wsFrom.Count
wsFrom(i).Range("A2", wsFrom(i).Range("A1").CurrentRegion.Cells(wsFrom(i).Range("A1").CurrentRegion.Cells.Count)).Copy
wsTo.Cells(wsTo.Cells.Rows.Count, 1).End(xlUp).Offset(1, 0).PasteSpecial xlPasteFormulasAndNumberFormats
Application.CutCopyMode = False
Next i
wsTo.Range("A1").Select
MsgBox "Merge Done"
End Sub
请试试这个密码。它首先统计要处理的图纸的最大行数、最大列数和图纸数。对于最大列数,它仅统计图纸的第一行。所以,它一定是床单上的较长部分!所有这些都是为了能够正确地对收集所有行的
arrFin
数组进行尺寸标注。它将有更多的行,然后需要,乘以最大行数与图纸数。然后用数据填充数组。我将行与列切换,因为只有数组的第二维可以是Redim
,从而保留现有数据。最后,转置后的数组立即放入母版中。它应该工作得很快。。。请确认它能按您的需要工作
Private Sub testApendCopySameRows()
Dim ws As Worksheet, wDest As Worksheet, arrWork As Variant, arrFin As Variant
Dim lastCol As Long, lastC As Long, lastColM As Long, lastR As Long, nrSheets As Long
Dim maxR As Long, maxRows As Long, i As Long, j As Long, k As Long
Set wDest = Worksheets("Master1") ' please, use here your master sheet name
For Each ws In Worksheets
If ws.Name <> wDest.Name Then
'If ws.Name = "sh1" Or ws.Name = "sh2" Then 'used (by me) for testing
nrSheets = nrSheets + 1
lastC = ws.Cells(1, Cells.Columns.Count).End(xlToLeft).Column
If lastC > lastCol Then lastCol = lastC
maxR = ws.Range("A" & Cells.Rows.Count).End(xlUp).Row
If maxR > maxRows Then maxRows = maxR
'End If
End If
Next
ReDim arrFin(1 To lastCol, 1 To maxRows * nrSheets)
ReDim arrWork(1 To 1, 1 To lastCol)
k = 1 'arrFin first row
For i = 1 To maxRows
For Each ws In Worksheets
If ws.Name <> wDest.Name Then
'If ws.Name = "sh1" Or ws.Name = "sh2" Then
lastR = ws.Range("A" & Cells.Rows.Count).End(xlUp).Row
If i <= lastR Then
'input the same rows content in the array:
arrWork = ws.Range(ws.Cells(i, 1), ws.Cells(i, lastCol)).value
For j = 1 To lastCol
arrFin(j, k) = arrWork(1, j)
Next j
k = k + 1
Erase arrWork
ReDim arrWork(1 To 1, 1 To lastCol)
End If
'End If
End If
Next
Next i
ReDim Preserve arrFin(1 To lastCol, 1 To k - 1)
wDest.Range("A1").Resize(UBound(arrFin, 2), UBound(arrFin, 1)).value = _
WorksheetFunction.Transpose(arrFin)
End Sub
私有子测试PendCopySamerows()
将ws作为工作表、wDest作为工作表、arrWork作为变量、arrFin作为变量
调暗lastCol为长、lastC为长、lastColM为长、lastR为长、NR为长
Dim maxR为长,maxRows为长,i为长,j为长,k为长
设置wDest=工作表(“Master1”)'请在此处使用您的主表名称
对于工作表中的每个ws
如果ws.Name wDest.Name那么
'如果ws.Name=“sh1”或ws.Name=“sh2”,则'由我用于测试
nrSheets=nrSheets+1
lastC=ws.Cells(1,Cells.Columns.Count).End(xlToLeft.Column)
如果lastC>lastCol,则lastCol=lastC
maxR=ws.Range(“A”&Cells.Rows.Count).End(xlUp).Row
如果maxR>maxRows,则maxRows=maxR
"完"
如果结束
下一个
ReDim arrFin(1至lastCol,1至maxRows*nrSheets)
重拨arrWork(1到1,1到lastCol)
k=1'第一排
对于i=1到maxRows
对于工作表中的每个ws
如果ws.Name wDest.Name那么
'如果ws.Name=“sh1”或ws.Name=“sh2”,则
lastR=ws.Range(“A”&Cells.Rows.Count).End(xlUp).Row
如果我能告诉你最好让我们看看你试过什么。。。至少试着更好地描述你的需求。那么,您只需要复制一行吗?要将每一行内容附加到一个大内容中并将此内容移动到主工作表中?是否需要为每个已处理工作表的相应行追加主工作表行?我的意思是第1行附加第1行,依此类推?是的,让我们假设在第一次迭代中,多张图纸的每一行都复制到一张新的母版图纸中,然后移动到多张图纸的第二行,并在主图纸的末尾追加,然后移动到第三行,每张图纸的第三行,并在主图纸的末尾追加,继续这样追加意味着在同一行中添加。。。因此,您需要复制每张图纸的所有行,在母版图纸中一行接一行。但是您需要所有的第一行都是一行接一行,然后是每一行的第二行,依此类推?如果是,所有行的列数是否相同?所有的工作表都有相同的行数吗?假设在第一次迭代中,我们有每个工作表的第一行,作为第1行、第2行、第3行复制并粘贴到主工作表中,下一次迭代中,每个工作表的第二行出现,并且在主工作表的末尾添加/附加意味着它将是第4行,将…等划入主sheet@karupakalas在堆栈溢出问题上,这种问题已经被问过(并回答过)好几次了。在你问()之前,请做些调查,然后自己试试。如果您仍然被卡住,请返回您的代码/尝试,并提出与之相关的问题。请注意,没有免费的代码编写服务()。是的,我使用Master1作为我的主工作表名称,但是我在for循环中遇到了类型不匹配错误,即j=1到lastCol arrFin(j,k)=arrWork(1,j)下一个j@karupakalas:请检查下一个错误:arrWork(1,j)的值是多少
将光标移动到其上时是否显示?如果没有,请检查ws.Name
在哪一行上显示的内容。为此,请查看i
和j
的值。然后转到i
行和l
列上的表格(Excel)。你在那间牢房里看到了什么?您的列是否可能在所有工作表中都不在同一个编号中?其显示arrWork(1,j)=显示了什么值k
,以及j
?同时检查lastCol
显示的内容。您是否安装了TeamViewer?它显示为j=1、k=1和lastCol=1