【问题标题】:Macro VBA to Copy Column based on Header and Paste into another Sheet宏 VBA 根据标题复制列并粘贴到另一个工作表中
【发布时间】:2019-02-12 04:46:36
【问题描述】:

背景:这是我第一次处理宏。我将使用两个工作表。第一张表“来源”将提供可用数据。第二张表“Final”将是空白的,将是宏将粘贴我希望它从“源”表中收集的数据的位置。

* 我希望宏在“源”表中找到指定的标题,将包含标题的单元格一直复制到现有数据的最后一行(而不是整个列),然后粘贴将其放到指定列(A、B、C 等)的“最终”工作表上。 *

我必须指定要查找的标题的原因是因为“源”表中的标题并不总是在同一位置,但“最终”表的标题将始终在同一位置 - 所以我不能只记录复制“源”表中的 A 列并粘贴到“最终”表中的 A 列的宏。此外,“源”表有一天可能有 170 行数据,而另一天可能有 180 行。

虽然,最好复制整个列,因为其中一列会有几个空单元格,而不是复制到现有数据的最后一行。我假设当它到达所选列中的第一个空单元格时它会停止复制,这将遗漏该列中空单元格之后的剩余数据——如果我错了,请纠正我。如果复制整个列是最好的方法,那么请提供它作为可能的解决方案的一部分。我附上了一个我想要完成的前后结果的例子: Example of Result

找到 Header=X,复制整列 -> 粘贴到“Final”工作表的 A1 中

找到 Header=Y,复制整列 -> 粘贴到“Final”工作表的 B1 中

等等。

如果我的措辞不准确,我很抱歉——我已尽力解释。如果有人可以帮助我解决这个问题,那就太棒了!谢谢!

【问题讨论】:

    标签: vba excel copy-paste


    【解决方案1】:

    针对您的情况,我修改了我给另一个有类似问题的用户的答案, 我在我的大多数数据表中都使用字典功能,这样我就可以在不破坏代码的情况下移动列,下面的代码你可以移动你的列,它仍然可以工作

    唯一的主要限制是 1.您的标题名称必须是唯一的 2.您感兴趣的标题名称必须完全相同。 即您感兴趣的源标题是 PETER,那么您的数据表应该有一个带有 PETER 的标题,并且它必须是唯一的。

    Sub RetrieveData()
    
    Dim wb As Workbook
    Dim ws_A As Worksheet
    Dim ws_B As Worksheet
    
    Dim HeaderRow_A As Long
    Dim HeaderLastColumn_A As Long
    Dim TableColStart_A As Long
    Dim NameList_A As Object
    Dim SourceDataStart As Long
    Dim SourceLastRow As Long
    Dim Source As Variant
    
    Dim i As Long
    
    Dim ws_B_lastCol As Long
    Dim NextEntryline As Long
    Dim SourceCol_A As Long
    
    Set wb = ActiveWorkbook
    Set ws_A = wb.Worksheets("Sheet A")
    Set ws_B = wb.Worksheets("Sheet B")
    Set NameList_A = CreateObject("Scripting.Dictionary")
    
    With ws_A
        SourceDataStart = 2
        HeaderRow_A = 1  'set the header row in sheet A
        TableColStart_A = 1 'Set start col in sheet A
        HeaderLastColumn_A = .Cells(HeaderRow_A, Columns.Count).End(xlToLeft).Column  'Get number of NAMEs you have
    
        For i = TableColStart_A To HeaderLastColumn_A
            If Not NameList_A.Exists(UCase(.Cells(HeaderRow_A, i).Value)) Then  'check if the name exists in the dictionary
                 NameList_A.Add UCase(.Cells(HeaderRow_A, i).Value), i 'if does not exist record name as KEY and Column number as value in dictionary
            End If
        Next i
    
    End With
    
    
    
    
    With ws_B  'worksheet you want to paste data into
        ws_B_lastCol = .Cells(HeaderRow_A, Columns.Count).End(xlToLeft).Column ' Get number of DATA you have in sheet B
        For i = 1 To ws_B_lastCol   'for each data
            SourceCol_A = NameList_A(UCase(.Cells(1, i).Value))  'get the column where the name is in Sheet A from the dictionaary
    
            If SourceCol_A <> 0 Then  'if 0 means the name doesnt exists
                SourceLastRow = ws_A.Cells(Rows.Count, SourceCol_A).End(xlUp).Row
                Set Source = ws_A.Range(ws_A.Cells(SourceDataStart, SourceCol_A), ws_A.Cells(SourceLastRow, SourceCol_A))
                NextEntryline = .Cells(Rows.Count, i).End(xlUp).Row + 1 'get the next entry line of the particular name in sheet A
    
                .Range(.Cells(NextEntryline, i), _
                       .Cells(NextEntryline, i)) _
                       .Resize(Source.Rows.Count, Source.Columns.Count).Cells.Value = Source.Cells.Value
            End If
    
        Next i
    End With
    
    
    End Sub
    

    【讨论】:

      【解决方案2】:

      你可以试试这个。我认为它是清晰和逐步的。它可以非常优化,但从 vba 开始,我认为这种方式更好。

      两个工作表中的列名必须相同。

      Sub teste()
      
      Dim val
       searchText = "TEXT TO SEARCH"
      
       Sheets("sheet1").Select ' origin sheet
       Range("A1").Select
       Range(Selection, Selection.End(xlToRight)).Select
       x = Selection.Columns.Count ' get number of columns
      
       For i = 1 To x 'iterate trough origin columns
        val = Cells(1, i).Value
          If val = searchText Then
              Cells(1, i).Select
              Range(Selection, Selection.End(xlDown)).Select
              Selection.Copy
              Sheets("sheet2").Select  ' destination sheet
              Range("A1").Select
              Range(Selection, Selection.End(xlToRight)).Select
              y = Selection.Columns.Count ' get number of columns
      
              For j = 1 To y 'iterate trough destination columns
      
                If Cells(1, j).Value = searchText Then
                  Cells(1, j).Select
                  ActiveSheet.Paste
                  Exit Sub
                End If
      
             Next j
          End If
        Next i
      
      End Sub
      

      祝你好运

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多