select最新logging并在Excel中创build唯一值的新表

我有一个Excel表,logging一个企业内的工作站的车辆进度。 一个给定的工作站可能会被访问​​不止一次。

车辆牌照号(注册号)用于识别车辆,并且当车辆到达下一个新的工作站时用户向电子表格添加新的行。 除注册号以外,每行还有一个logging标识。

此工作stream程意味着将为给定的注册编号创build多个logging行

当车辆上的所有工作都完成后,logging将被剪切并存档在另一张工作表上。

当前车辆表

我想要创build的是另一个工作表选项卡上的汇总表,该表显示正在进行的车辆的所有行。 如果车辆目前有一条logging,我想提取该logging行,并且车辆有多条logging,我只想提取最后(最近)的logging行。

我希望总结能够成为基础数据表的“实时”反映。

从search我发现公式的例子, 忽略重复和在Excel中创build唯一值的新的列表,但这些select默认情况下,而不是最后的第一个重复值。 “查找最后匹配”或“返回最后一个值”的search结果的共同之处在于用户必须定义​​他们正在search的项目。

我觉得我需要一些不同的东西,因为我的注册号不是静态的 – 它不断地被注册号被添加和删除(存档)刷新。

认识和理解Excel不是一个数据库,但是如果我想用数据库/ SQL的术语来说,我的(noob)查询可能是这样的:SELECT row WHERE注册号是唯一的和loggingID是最大的

你知道任何方式来实现我在Excel寻找的结果吗?

您可以使用数据透视表和查找公式来完成此操作。 下面是一个Excel Table(aka ListObject)中的一些简化数据,下面是一个数据透视表,右边有一个合适的查找公式。

在这里输入图像说明

数据透视表中包含注册号以及值(聚合)区域中设置为“最大”的RecordID字段。 所以基本上它显示每个Reg No的最大RecordID值,然后在右边的列中有一个INDEX / MATCH公式,它在数据input表中查找RecordID并返回相关的Stage。

由于您需要刷新数据透视表,因此不太现实,因此需要确保已将查找公式向下复制到足以处理数据透视表的大小。

只需在工作表中放入一个Worksheet_Activate事件处理程序,就可以轻松自动进行刷新。 像这样:Private Sub Worksheet_Activate()Activesheet.PivotTables(“PivotTable”)。PivotCache.Refresh End Sub

由于我们现在已经涉及到VBA,所以您可能还有一些代码将公式复制到数据透视表旁所需的行数。 我会在适当的时候鞭打一些东西,并把它张贴在这里。

更新:我已经写了一些代码从表到一个数据透视表,所以任何数据透视表的尺寸或位置的变化将反映在阴影表的尺寸和位置。 这有效地给了我们一种方法来将计算字段添加到数据透视表,可以引用该数据透视表之外的某些内容,正如我们在此处使用INDEX / MATCH查找所做的。 我们称这个function为一个计算表

如果数据透视表增长,计算表将会增长。 如果数据透视表收缩,则计算表将缩小,并且其中的任何冗余公式将被删除。 以下是您的示例的示例:顶部表格来自input工作表,下面的数据透视表和计算表来自结果工作表。

在这里输入图像说明

如果我转到input工作表并添加更多的数据,那么当我切换回结果工作表时,数据透视表会自动更新新的数据,计算表会自动扩展以容纳额外的行: 在这里输入图像说明

这里是我用来自动化的代码:

Option Explicit Private Sub Worksheet_Activate() ActiveSheet.PivotTables("Report").PivotCache.Refresh End Sub Private Sub Worksheet_PivotTableUpdate(ByVal Target As PivotTable) If Target.Name = "Report" Then _ PT_SyncTable Target, ActiveSheet.ListObjects("SyncedTable") End Sub Sub PT_SyncTable(oPT As PivotTable, _ oLO As ListObject, _ Optional bIncludeTotal As Boolean = False) Dim lLO As Long Dim lPT As Long 'Make sure oLO is in same row If oLO.Range.Cells(1).Row <> oPT.RowRange.Cells(1).Row Then oLO.Range.Cut Intersect(oPT.RowRange.EntireRow, oLO.Range.EntireColumn).Cells(1, 1) End If 'Resize oLO if required lLO = oLO.Range.Rows.Count lPT = oPT.RowRange.Rows.Count If Not bIncludeTotal And oPT.ColumnGrand Then lPT = lPT - 1 If lLO <> lPT Then oLO.Resize oLO.Range.Resize(lPT) 'Clear any old data outside of oLO if it has shrunk If lLO > lPT Then oLO.Range.Offset(oLO.Range.Rows.Count).Resize(lLO - lPT).ClearContents End Sub 

最酷的是,只要数据透视表更新,代码就会自动调整计算表的大小,而这些更新也是由您在数据透视表上进行筛选触发的。 所以如果你过滤一些rego数字,你看到的是: 在这里输入图像说明

你在你的问题中提到了SQL,所以我想你可能会对使用SQL的VBA解决scheme感兴趣:

 'Assumes your data is on a sheet called "DataSheet", and you want the answers stored starting in cell A2 of a sheet called "Results") Sub test() Dim objConnection As ADODB.Connection Dim objRecordset As ADODB.Recordset Set objConnection = New ADODB.Connection Set objRecordset = New ADODB.Recordset objConnection.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" & _ "Data Source=" & ThisWorkbook.FullName & ";" & _ "Extended Properties=""Excel 12.0;HDR=Yes;IMEX=1"";" objConnection.Open sqlcommand = "SELECT LAST([Record ID]), " & _ "[Reg No], " & _ "LAST([Priority Level]), " & _ "LAST([Make]), " & _ "LAST([Current Stage]) " & _ "FROM [DataSheet$] GROUP BY [Reg No]" objRecordset.Open sqlcommand, objConnection, adOpenStatic, adLockOptimistic, adCmdText Sheets("Results").Range("A2").CopyFromRecordset objRecordset End Sub 

要使用它,您需要在VBA项目中包含对“Microsoft ActiveX Data Objects 6.1 Library”和“Microsoft ActiveX Data Objects Recordset 6.0 Library”的引用。 (至less,他们是我select的)