/ / Excelで[最新のレコードを選択して新しい一意の値の表を作成する] - excel、excel-vba、vba

最新レコードを選択し、Excelで固有値の新しいテーブルを作成 - excel、excel-vba、vba

私はExcelテーブルを持っていて、それは会社内のワークステーションを通る車両の進歩を記録します。あるワークステーションが複数回訪問されることがあります。

車両のナンバープレート番号(登録番号)が使用されますそして、車両が次の新しいワークステーションに到着すると、ユーザはスプレッドシートに新しい行を追加します。登録番号と同様に、各行にはレコードIDもあります。

このワークフローは、特定の登録番号に対して複数のレコード行が作成されることを意味します。

車両の作業がすべて完了すると、レコードは切り取られて別のワークシートにアーカイブされます。

現在の車両表

私が作成したいのは上のサマリーテーブルです進行中の車両のすべての行を表示する別のワークシートタブ。車両に現在単一のレコードがある場合はそのレコード行を抽出し、車両に複数のレコードがある場合は最後の(最新の)レコード行のみを抽出します。

この要約を、根底にあるデータシートを「生のまま」反映したものにしたい。

検索の結果、式の例が見つかりました。 Excelで重複を無視して一意の値の新しいリストを作成する しかし、これらは最初の重複値を選ぶ。デフォルトで、最後ではありません。 「検索の最後の一致」または「最後の値を返す」の検索結果には、一般に、検索する項目をユーザーが定義する必要があります。

私の登録番号リストは静的ではないので、別のものが必要だと思います。登録番号の追加と削除(アーカイブ)によって更新されています。

Excelを認識し理解することは、データベース、しかし私がデータベース/ SQL用語で考えていたならば、私の(noob)問い合わせは以下のようになるでしょう: SELECT行 登録番号はユニークではありません ANDレコードIDが最大

私が求めている結果をExcelで達成する方法を知っていますか。

回答:

回答№1は2

ピボットテーブルとルックアップ式を使用できますこれを達成するために。以下はExcelテーブル(別名ListObject)内のいくつかの簡略化されたデータで、その下は右側に適切な参照式を持つピボットテーブルです。

ここに画像の説明を入力

ピボットテーブルには同様にReg Noがあります。[値](集計)領域のRecordIDフィールド。 "Max"に設定されています。そのため、基本的に各Reg Noの最大RecordID値を表示してから、右側の列にそのRecordIDをデータ入力テーブルで検索するINDEX / MATCH式があり、関連するステージを返します。

そうではありません かなり ピボットテーブルを更新する必要があるので、そしてピボットテーブルのサイズを処理するために、参照数式を十分コピーしたことを確認する必要があります。

あなたは簡単にリフレッシュを簡単に自動化することができますWorksheet_Activateイベントハンドラをワークシートに配置します。このようなもの: プライベートサブワークシート_Activate() Activesheet.PivotTables( "PivotTable")。PivotCache.Refresh 終了サブ

「VBAを使用したので、ピボットテーブルの横に必要な行数を計算式でコピーするコードがあるかもしれません。やがて何かをまとめて、ここに投稿します。

更新: テーブルをピボットテーブルに従属させるためのコードを作成したので、ピボットテーブルの寸法または配置の変更は、シャドーイングテーブルの寸法および配置に反映されます。 計算フィールド 何かを参照できるピボットテーブルへ 外側 ここではINDEX / MATCHルックアップを使用しています。 計算テーブル.

ピボットテーブルが大きくなると、計算テーブル成長します。ピボットテーブルが縮小されると、計算テーブルは縮小され、その中の余分な式はすべて削除されます。これがあなたの例をどのように探すかです:一番上の表は 入力 シート、およびその下のピボットテーブルと計算テーブルは 結果 シート。

ここに画像の説明を入力

入力シートに移動してさらに追加すると結果シートに戻ると、ピボットテーブルはその新しいデータで自動的に更新され、計算テーブルは自動的に拡張されて追加の行に対応します。 ここに画像の説明を入力

そして、これを自動化するために使用するコードは次のとおりです。

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

素晴らしいのは、コードが自動的に実行されることです。ピボットテーブルが更新されるたびに計算テーブルのサイズを変更します。また、これらの更新は、ピボットテーブルでフィルタリングすることによっても発生します。それで、あなたがほんの2、3のrego数をフィルタリングするならば、これはあなたが見るものです: ここに画像の説明を入力


回答№2の場合は1

あなたはあなたの質問でSQLについて言及しました、それで私はあなたがSQLを使用するVBAソリューションに興味があるかもしれないと思った:

"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データオブジェクト6.1ライブラリ」と「Microsoft ActiveXデータオブジェクトレコードセット6.0ライブラリ」に追加します。 (少なくとも、それらは「私が選択したものです。)