Excel 将数据转换为具有两列条件的新工作表
所以这个问题已经呈现给了我,它正在成为我网站制作的一个巨大障碍。当涉及到界面时,我对excel并不陌生,但编写函数是我从未处理过的事情。我有一个表,表中的值用参考号标记,它基本上传递了由某个提供者填写的表单。需要将包含所有字段不同答案的列(是的,它在一列中包含不同的字段答案,叹气)拆分,以便我可以使用列标题标记它们,以便最终将它们导入SQL数据库。源以以下格式提供: 我需要做的是能够填写这些值的基于列的版本,如下所示: 创建列的标准基于A(ref#)B C和D中的值。我猜我需要创建某种条件语句来检查C和D是否等于某个值(C和D指定E中的信息类型,因此它们几乎是我的关键元素/条件)然后将单元格E中的信息放在正确的列标题下。我一直在研究诸如VLookup/Match/Index之类的函数,但对于如何应用它们,或者是否有更好的函数可以用来完成我的任务,我不太清楚。在这一点上,即使是对相关SO线程的引用也是非常好的。我基本上只是需要一些指导,以使这项工作。最重要的是,参考号上升,但没有任何特定的顺序,因此我想知道是否有可能向函数提供一个参考号列表,以便在对特定参考号的所有条件都运行完毕后,将其递增 编辑:好的,这是我的新一期--> 按照您的要求提供图像 原始数据: 在VBA脚本之后: 这是我们编辑的唯一代码:Excel 将数据转换为具有两列条件的新工作表,excel,vba,Excel,Vba,所以这个问题已经呈现给了我,它正在成为我网站制作的一个巨大障碍。当涉及到界面时,我对excel并不陌生,但编写函数是我从未处理过的事情。我有一个表,表中的值用参考号标记,它基本上传递了由某个提供者填写的表单。需要将包含所有字段不同答案的列(是的,它在一列中包含不同的字段答案,叹气)拆分,以便我可以使用列标题标记它们,以便最终将它们导入SQL数据库。源以以下格式提供: 我需要做的是能够填写这些值的基于列的版本,如下所示: 创建列的标准基于A(ref#)B C和D中的值。我猜我需要创建某种条件语
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-很高兴听到你这么说。你有没有可能提供一些执行效率的粗略数据