Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 将数据转换为具有两列条件的新工作表_Excel_Vba - Fatal编程技术网

Excel 将数据转换为具有两列条件的新工作表

Excel 将数据转换为具有两列条件的新工作表,excel,vba,Excel,Vba,所以这个问题已经呈现给了我,它正在成为我网站制作的一个巨大障碍。当涉及到界面时,我对excel并不陌生,但编写函数是我从未处理过的事情。我有一个表,表中的值用参考号标记,它基本上传递了由某个提供者填写的表单。需要将包含所有字段不同答案的列(是的,它在一列中包含不同的字段答案,叹气)拆分,以便我可以使用列标题标记它们,以便最终将它们导入SQL数据库。源以以下格式提供: 我需要做的是能够填写这些值的基于列的版本,如下所示: 创建列的标准基于A(ref#)B C和D中的值。我猜我需要创建某种条件语

所以这个问题已经呈现给了我,它正在成为我网站制作的一个巨大障碍。当涉及到界面时,我对excel并不陌生,但编写函数是我从未处理过的事情。我有一个表,表中的值用参考号标记,它基本上传递了由某个提供者填写的表单。需要将包含所有字段不同答案的列(是的,它在一列中包含不同的字段答案,叹气)拆分,以便我可以使用列标题标记它们,以便最终将它们导入SQL数据库。源以以下格式提供:

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

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

编辑:好的,这是我的新一期-->

按照您的要求提供图像 原始数据: 在VBA脚本之后:

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

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))

如您所见,地址栏没有填充

这里是一个相当标准的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
Sub My_Organize()
尺寸rw为长,v为长,vHDRs为变体
我长,j长,iREFNO长,iREFROW长,iLR长
将ws作为工作表,应用程序作为应用程序
设置应用程序=应用程序
app.screenUpdate=False
app.EnableEvents=False
app.DisplayAlerts=False
app.Calculation=xlCalculationManual
出错时继续下一步
工作表(“有组织”)。删除
错误转到安全出口
Worksheets.Add(之后:=工作表(Sheets.Count)).Name=“有组织”
设置ws=Sheets(Sheets.Count)
vHDRs=数组(数组(“引用#)”,-1,-2)_
数组(“提供程序名称”,42001000)_
数组(“Phone#”,43001000))
ws.Cells(1,1).Resize(1,UBound(vHDRs)+1)=应用程序转置(应用程序索引(vHDRs,1))
附页1
iLR=.Cells(Rows.Count,1).End(xlUp).Row
带.Cells(1,1).CurrentRegion
.Cells.Sort Key1:=.Columns(1),Order1:=xl升序_
键2:=.列(3),顺序2:=xl升序_
键3:=.列(4),顺序3:=xl升序_
方向:=xltoptobttom,标题:=xlYes
对于rw=2至iLR
如果iREFNO.Cells(rw,1).Value2,则
iREFNO=.Cells(rw,1).Value2
iREFROW=ws.Cells(Rows.Count,1).End(xlUp).Row+1
ws.Cells(iREFROW,1)=iREFNO
如果结束
对于i=LBound(vHDRs,1)到UBound(vHDRs,1)
If.Cells(rw,3).Value2=vHDRs(i)(1)和_
.Cells(rw,4).Value2=vHDRs(i)(2)然后
ws.Cells(iREFROW,i+1)=.Cells(rw,5).Value2
退出
如果结束
接下来我
下一个rw
以
以
安全出口:
设置ws=Nothing
app.Calculation=xlCalculationAutomatic
app.DisplayAlerts=True
app.EnableEvents=True
app.screenUpdate=True
设置app=Nothing
端接头
编辑
vhdr
信息的嵌套数组,以匹配要从源工作表收集和转置的内容。只需在其中添加一个新的嵌套数组,并更改标签和数字以匹配C列和D列。它们不必在外部数组中按任何特殊顺序排列,但每个内部数组都应该是标签、C列和D列

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


如果对2300万行(在多个工作表中)重复运行,那么这些值可以批量输入到一个数组中,以便在内存中完成所有处理。

电话号码来自何处?原始图像中的第616659行。这不是真的,只是举个例子而已。是的。C列的值是4300,D列的值是100,用于在表单上指定电话号码。一些数组公式可以很好地做到这一点,但计算负载将根据行的总数以对数方式增加。在我们最大的表中有2300万个条目,而这个特定的表有130000个条目。所以,是的,我们今晚的尝试正好做到了这一点。你知道VBA有什么好的资源可以帮助你吗?哇,这真是太棒了。非常感谢你。我为昨晚没有回复而道歉,我不知道你会为我这么做xD。我正试图证明/标记正确,但似乎没有足够的声誉。@Habitat-很高兴听到你这么说。你有没有可能提供一些执行效率的粗略数据