我需要合并几个非常大的数据集。这些数据集来自不同的研究,所以格式等是不同的。Excel,高级数据合并
我想要的是一个可以搜索列值的宏(例如Name = George),然后将其中出现的每个值复制并粘贴到不同工作表上的新列中。
例子:
我需要合并几个非常大的数据集。这些数据集来自不同的研究,所以格式等是不同的。Excel,高级数据合并
我想要的是一个可以搜索列值的宏(例如Name = George),然后将其中出现的每个值复制并粘贴到不同工作表上的新列中。
例子:
下面是完整的代码:
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
这应该做你要找的工作。让我知道是否有问题。
再次感谢,我现在正在测试它,并会很快回来。 – 2014-09-02 22:31:07
确保存储数据的工作表名称为“工作表1”,将数据发送到的新工作表称为“工作表2”。此外,您可以在这里更改值// rowMain = 2 //如果您的数据表具有额外的标题。例如,如果数据从第3行开始,则将该值更改为3. – Grendizer 2014-09-02 23:11:28
这个工作很棒!非常感谢您的帮助。你不知道你有多少时间救了我。 +1,000 upvotes给你的朋友! – 2014-09-02 23:41:36
根据您提供,忽略了大标题的例子中,宏将是这个样子:
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
的代码会改变基于怎样的数据是有组织的。但上面的代码显示了如何完成的基本想法。许多方法之一。
这对于单线来说非常有效!有没有办法让所有行和列重复? – 2014-09-02 02:37:57
您可以为每个行和列添加一个简单的循环。如果行和列的数量是静态的,非常简单和容易。 – StorymasterQ 2014-09-02 03:27:20
你可以试试这个不是很整齐的解决方案。
此外,为此,您需要将源数据更改为表格。
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
结果:
我做的源数据改变成表所以我可以采取的ListObject的优点。
在该示例中,表名是表1。如果您想采取此路线,您可以更改以适应。
不管怎样,HTH虽然大部分都会模糊不清,因为你指出你在编码方面的经验很少。
也谢谢你的帮助! – 2014-09-02 23:42:31
下面是使用类创建用户定义类型的另一种方法,以收集每个名称/年/颜色组合,然后输出结果。它可以与任何数量的“年”,名称或颜色一起使用。
这第一个代码进入一个类模块,你应该重新命名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
您可以轻松地修改此把结果位于不同的工作,如果你喜欢,它会可以容纳尽可能多的列/行数据。
感谢您的帮助,但我能够通过上述方法完成此操作。 – 2014-09-02 23:42:13
你说你想*搜索*特定条目。您的示例显示所有名称堆叠,而不只是*乔治*。另外,也许你可以添加你试图做到这一点?那太好了。 – L42 2014-09-02 01:30:35
感谢您的回复。 我有一点VBA的经验,所以我没有尝试太多。我尝试了Pivot表格,但是效果不佳。我希望将'输出'名称堆叠起来,以便使这些数据与另一个数据集相符,其中名称被堆叠并重复用于每个条目。 – 2014-09-02 02:34:06
所以从字面上来说,你只是希望输入数据以堆叠的形式返回?不只是一个特定的名字或记录,而是全部? – L42 2014-09-02 02:41:50