2014-09-02 58 views
0

我需要合并几个非常大的数据集。这些数据集来自不同的研究,所以格式等是不同的。Excel,高级数据合并

我想要的是一个可以搜索列值的宏(例如Name = George),然后将其中出现的每个值复制并粘贴到不同工作表上的新列中。

例子:

enter image description here

+0

你说你想*搜索*特定条目。您的示例显示所有名称堆叠,而不只是*乔治*。另外,也许你可以添加你试图做到这一点?那太好了。 – L42 2014-09-02 01:30:35

+0

感谢您的回复。 我有一点VBA的经验,所以我没有尝试太多。我尝试了Pivot表格,但是效果不佳。我希望将'输出'名称堆叠起来,以便使这些数据与另一个数据集相符,其中名称被堆叠并重复用于每个条目。 – 2014-09-02 02:34:06

+0

所以从字面上来说,你只是希望输入数据以堆叠的形式返回?不只是一个特定的名字或记录,而是全部? – L42 2014-09-02 02:41:50

回答

0

下面是完整的代码:

Option Explicit 

Sub myMacro() 

    ' decleration 
    Dim rowMain As Integer, rowNewSheet As Integer 
     rowMain = 2 
     rowNewSheet = 1 

    Dim columnOffset As Integer 
     columnOffset = 0 

    ' main sheet where data is 
    Sheets("Sheet1").Select 

    ' loop through all names 
    Do While Range("A" & rowMain).Value <> "" 

     Do While Range("B" & rowMain - 1).Offset(0, columnOffset).Value <> "" 

      ' Name 
      Application.Sheets("Sheet2").Range("A" & rowNewSheet).Value = Range("A" & rowMain).Value 

      ' Year 
      Application.Sheets("Sheet2").Range("B" & rowNewSheet).Value = Range("B1").Offset(0, columnOffset).Value 

      ' Color 
      Application.Sheets("Sheet2").Range("C" & rowNewSheet).Value = Range("B" & rowMain).Offset(0, columnOffset).Value 

      ' next line 
      rowNewSheet = rowNewSheet + 1 
      columnOffset = columnOffset + 1 

     Loop 

     ' next Name 
     columnOffset = 0 
     rowMain = rowMain + 1 

    Loop 

End Sub 

这应该做你要找的工作。让我知道是否有问题。

+0

再次感谢,我现在正在测试它,并会很快回来。 – 2014-09-02 22:31:07

+0

确保存储数据的工作表名称为“工作表1”,将数据发送到的新工作表称为“工作表2”。此外,您可以在这里更改值// rowMain = 2 //如果您的数据表具有额外的标题。例如,如果数据从第3行开始,则将该值更改为3. – Grendizer 2014-09-02 23:11:28

+0

这个工作很棒!非常感谢您的帮助。你不知道你有多少时间救了我。 +1,000 upvotes给你的朋友! – 2014-09-02 23:41:36

0

根据您提供,忽略了大标题的例子中,宏将是这个样子:

Option Explicit 

Sub myMacro() 

    Dim row As Integer 
     row = 1 

    Application.Sheets("Sheet2").Range("A" & row).Value = Range("A" & row + 1).Value 
    Application.Sheets("Sheet2").Range("B" & row).Value = Range("B" & row).Value 
    Application.Sheets("Sheet2").Range("C" & row).Value = Range("B" & row + 1).Value 

End Sub 

的代码会改变基于怎样的数据是有组织的。但上面的代码显示了如何完成的基本想法。许多方法之一。

+0

这对于单线来说非常有效!有没有办法让所有行和列重复? – 2014-09-02 02:37:57

+0

您可以为每个行和列添加一个简单的循环。如果行和列的数量是静态的,非常简单和容易。 – StorymasterQ 2014-09-02 03:27:20

0

你可以试试这个不是很整齐的解决方案。
此外,为此,您需要将源数据更改为表格。

Sub Test() 
    Dim ws As Worksheet: Set ws = Sheet1 
    Dim id, ids, yr, yrs 
    Dim rng As Range 

    With Application 
     Set rng = ws.ListObjects("Table1").HeaderRowRange 
     Set rng = rng.Offset(0, 1).Resize(, rng.Columns.Count - 1) 
     yrs = .Transpose(rng) 
     ids = .Transpose(ws.Range("Table1[Name]")) 
    End With 

    Dim lrow As Long 
    For Each id In ids 
     Dim r As Range: Set r = ws.Range("Table1[Name]").Find(id) 
     Dim i As Long: i = 1 
     For Each yr In yrs 
      With ws 
       lrow = .Range("A:A").Find("*", [A1], , , , xlPrevious).Row 
       .Range("A" & lrow).Offset(1, 0).Value = id 
       .Range("A" & lrow).Offset(1, 1).Value = yr 
       .Range("A" & lrow).Offset(1, 2).Value = r.Offset(0, i).Value 
      End With 
      i = i + 1 
     Next 
    Next 
End Sub 

结果:

enter image description here

我做的源数据改变成表所以我可以采取的ListObject的优点。
在该示例中,表名是表1。如果您想采取此路线,您可以更改以适应。
不管怎样,HTH虽然大部分都会模糊不清,因为你指出你在编码方面的经验很少。

+0

也谢谢你的帮助! – 2014-09-02 23:42:31

0

下面是使用类创建用户定义类型的另一种方法,以收集每个名称/年/颜色组合,然后输出结果。它可以与任何数量的“年”,名称或颜色一起使用。

这第一个代码进入一个类模块,你应该重新命名NameData(见芯片Pearsons网页类)

================== ===========

Option Explicit 
Private pName As String 
Private PYear As Long 
Private pColor As String 

Public Property Get Name() As String 
    Name = pName 
End Property 
Public Property Let Name(Value As String) 
    pName = Value 
End Property 

Public Property Get Color() As String 
    Color = pColor 
End Property 
Public Property Let Color(Value As String) 
    pColor = Value 
End Property 

Public Property Get Year() As Long 
    Year = PYear 
End Property 
Public Property Let Year(Value As Long) 
    PYear = Value 
End Property 

================================ ==

这第二代码进入一个常规模块:

================ ================

Option Explicit 
Sub ReArrange() 
    Dim cND As NameData 
    Dim colND As Collection 
    Dim vSrc As Variant 
    Dim vRes() As Variant 
    Dim rRes As Range 
    Dim I As Long, J As Long 

'Results will go here 
Set rRes = Range("a20") 'could be on another worksheet 

'Read source data into array 
'Many ways to select the data, depending on your "real" setup 
vSrc = Range("a2").CurrentRegion 

'Collect each Name/Year/Color combo 
Set colND = New Collection 
For I = 2 To UBound(vSrc, 1) 
    For J = 2 To UBound(vSrc, 2) 
    Set cND = New NameData 
    With cND 
     .Name = vSrc(I, 1) 'Name always in first column 
     .Year = vSrc(1, J) 'Year always in first row 
     .Color = vSrc(I, J) 'Color at intersection 

     'add to collection 
     colND.Add cND 
    End With 
    Next J 
Next I 

'Dimension and populate output array 
ReDim vRes(0 To colND.Count, 1 To UBound(vSrc, 2) - 1) 

'Column Labels 
vRes(0, 1) = "Name" 
vRes(0, 2) = "Year" 
vRes(0, 3) = "Color" 

J = 0 
For I = 1 To colND.Count 
    J = J + 1 
    With colND(I) 
     vRes(J, 1) = .Name 
     vRes(J, 2) = .Year 
     vRes(J, 3) = .Color 
    End With 
Next I 

With rRes.Resize(UBound(vRes, 1) + 1, UBound(vRes, 2)) 
    .Resize(Cells.Rows.Count - .Row).Clear 
    .Value = vRes 
End With 

末次

您可以轻松地修改此把结果位于不同的工作,如果你喜欢,它会可以容纳尽可能多的列/行数据。

+0

感谢您的帮助,但我能够通过上述方法完成此操作。 – 2014-09-02 23:42:13