Excel 通过从多张图纸中获取每张图纸的第一行,然后移动到第二行,逐行追加到主图纸中

Excel 通过从多张图纸中获取每张图纸的第一行,然后移动到第二行,逐行追加到主图纸中,excel,vba,excel-formula,Excel,Vba,Excel Formula,有人能建议我如何从多张图纸中提取每张图纸的第一行,然后再添加到第二行,一行一行地添加到主图纸中吗?假设在第一次迭代中,我们有每张图纸的第一行,它们应该复制并粘贴为主图纸中的第1行、第2行、第3行,然后在下一次迭代中,每个工作表的第二行出现,并在主工作表的末尾添加/追加,这意味着它将是主工作表中的第4行、第5行……等等 我甚至尝试了下面用户发送的代码 但是我不能得到正确的输出 Public Sub MergeTabs() 'Merges selected tabs (or all visible

有人能建议我如何从多张图纸中提取每张图纸的第一行,然后再添加到第二行,一行一行地添加到主图纸中吗?假设在第一次迭代中,我们有每张图纸的第一行,它们应该复制并粘贴为主图纸中的第1行、第2行、第3行,然后在下一次迭代中,每个工作表的第二行出现,并在主工作表的末尾添加/追加,这意味着它将是主工作表中的第4行、第5行……等等

我甚至尝试了下面用户发送的代码 但是我不能得到正确的输出

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