使用两个列标准将数据转置到新工作表

时间:2015-03-14 04:04:50

标签: excel excel-vba vba

所以这个问题已经呈现给我,它正在成为我网站制作的一个巨大障碍。对于界面而言,我并不擅长excel,但是编写函数是我从未必须处理的事情。我有一个表格,其中的值由参考编号标记,基本上传递由某个提供商填写的表格。对字段具有所有不同答案的列(是的,它在一列中有不同的字段答案,叹息)需要分解,以便我可以用列标题标记它们,以便最终将它们导入SQL数据库。该来源目前以这种格式提供:

Source data

我需要做的是能够填写这些值的基于列的版本,如下所示:

Expected Aggregate Results

创建列的标准基于A(ref#)BC和D中的值。我猜我需要创建某种条件语句来检查C和D是否等于某个值(C并且D指定E中的信息类型,因此它们几乎是我的关键元素/条件)然后将信息放在单元格E的正确列标题下面。我一直在研究诸如VLookup / Match / Index之类的函数,我无法理解如何应用它们,或者我是否可以使用更好的函数来完成我的任务。在这一点上,即使是对相关SO线程的引用也会很棒。我基本上只需要一些指导来了解这项工作需要做些什么。最重要的是,参考数字上升但没有任何特定的顺序,因此我想知道是否有可能向一个函数提供一个参考数字列表,以便在所有条件都已经完成特定参考编号的情况下递增。

编辑:好的,这是我的新问题 - >

您要求的图片 原始数据:http://imgur.com/htvzqNU 在VBA脚本之后:http://imgur.com/cDQQxE6

这是我们编辑的唯一代码:

vHDRs = Array(Array("Reference #", -1, -2), _
                  Array("Provider Name", 300, 100), _
                  Array("Provider Number", 300, 300), _
                  Array("County", 200, 400), _
                  Array("Address", 100, 100), _
                  Array("Zip", 200, 300))

如您所见,地址列未填充

1 个答案:

答案 0 :(得分:0)

这是一个相当标准的VBA sub,具有足够的安全性,不应该破坏任何实质内容。

Sub My_Organize()
    Dim rw As Long, v As Long, vHDRs As Variant
    Dim i As Long, j As Long, iREFNO As Long, iREFROW As Long, iLR As Long
    Dim ws As Worksheet, app As Application

    Set app = Application
    app.ScreenUpdating = False
    app.EnableEvents = False
    app.DisplayAlerts = False
    app.Calculation = xlCalculationManual

    On Error Resume Next
    Worksheets("Organized").Delete
    On Error GoTo Safe_Exit
    Worksheets.Add(after:=Sheets(Sheets.Count)).Name = "Organized"
    Set ws = Sheets(Sheets.Count)

    vHDRs = Array(Array("Reference #", -1, -2), _
                  Array("Provider Name", 4200, 100), _
                  Array("Phone #", 4300, 100))

    ws.Cells(1, 1).Resize(1, UBound(vHDRs) + 1) = app.Transpose(app.Index(vHDRs, , 1))

    With Sheet1
        iLR = .Cells(Rows.Count, 1).End(xlUp).Row
        With .Cells(1, 1).CurrentRegion
            .Cells.Sort Key1:=.Columns(1), Order1:=xlAscending, _
                        Key2:=.Columns(3), Order2:=xlAscending, _
                        Key3:=.Columns(4), Order3:=xlAscending, _
                        Orientation:=xlTopToBottom, Header:=xlYes

            For rw = 2 To iLR
                If iREFNO <> .Cells(rw, 1).Value2 Then
                    iREFNO = .Cells(rw, 1).Value2
                    iREFROW = ws.Cells(Rows.Count, 1).End(xlUp).Row + 1
                    ws.Cells(iREFROW, 1) = iREFNO
                End If
                For i = LBound(vHDRs, 1) To UBound(vHDRs, 1)
                    If .Cells(rw, 3).Value2 = vHDRs(i)(1) And _
                       .Cells(rw, 4).Value2 = vHDRs(i)(2) Then
                          ws.Cells(iREFROW, i + 1) = .Cells(rw, 5).Value2
                          Exit For
                    End If
                Next i
            Next rw
        End With
    End With

Safe_Exit:
    Set ws = Nothing
    app.Calculation = xlCalculationAutomatic
    app.DisplayAlerts = True
    app.EnableEvents = True
    app.ScreenUpdating = True
    Set app = Nothing
End Sub

编辑vHDRs信息的嵌套数组,以匹配您要从源工作表收集和转置的内容。只需在其中添加一个新的嵌套数组,然后更改标签和数字以匹配列C&amp; D.它们不必在外部数组中有任何特殊顺序,但每个内部数组应该是标签,列C,列D

将数据粘贴到新工作簿的 Sheet1 中,针对它运行该例程。它将在队列末尾创建一个新工作表,并根据您在列标题标签数组中设置的参数转置数据,并根据源工作表上的列C和D匹配另外两个数字(即 Sheet 1中)。

如果你反复运行23M行(在多个工作表中),那么这些值可以批量输入数组,以便所有处理都在内存中完成。