/ / Wybierz najnowszy rekord i utwórz nową tabelę unikalnych wartości w programie Excel - excel, excel-vba, vba

Wybierz opcję Nowy rekord i Utwórz nową tabelę unikatowych wartości w programie Excel - excel, excel-vba, vba

Mam tabelę programu Excel, która rejestruje postęp pojazdu za pośrednictwem stacji roboczych w firmie. Dana stacja robocza może być odwiedzana więcej niż raz.

Używany jest numer rejestracyjny pojazdu (nr reg.)aby zidentyfikować pojazd, a użytkownik dodaje nowy wiersz do arkusza kalkulacyjnego, gdy pojazd dotrze do następnej nowej stacji roboczej. Oprócz nr reg, każdy wiersz ma również identyfikator rekordu.

Ten przepływ pracy oznacza, że ​​dla danego numeru rejestru zostanie utworzonych wiele wierszy rekordu

Po zakończeniu wszystkich prac nad pojazdem zapis jest wycinany i archiwizowany w innym arkuszu.

Aktualna tabela pojazdów

To, co chcę utworzyć, to tabela podsumowującakolejna karta arkusza, która wyświetla wszystkie wiersze dla pojazdów w toku. Jeśli pojazd ma obecnie pojedynczy rekord, chcę wyodrębnić ten wiersz rekordu, a gdy pojazd ma wiele rekordów, chcę wyodrębnić tylko ostatni (ostatni) wiersz rekordu.

Chcę, aby podsumowanie było „żywym” odzwierciedleniem podstawowej karty danych.

Z wyszukiwań znalazłem przykłady formuł Zignoruj ​​duplikaty i utwórz nową listę unikatowych wartości w programie Excel ale te wybierają pierwszą duplikat wartości przezdomyślnie, nie ostatni. Wyniki wyszukiwania w „ostatnim wyszukiwaniu” lub „zwróć ostatnią wartość” mają wspólną cechę, że użytkownik musi zdefiniować poszukiwany element.

Myślę, że potrzebuję czegoś innego, ponieważ moja lista Reg Reg nie jest statyczna - jest nieustannie odświeżana przez dodawanie i usuwanie Reg Reg.

Uznanie i zrozumienie programu Excel nie jestbaza danych, ale gdybym myślał w kategoriach bazy danych / SQL, moje zapytanie (noob) mogłoby wyglądać następująco: SELECT wiersz GDZIE nr reg jest wyjątkowy ORAZ ID rekordu jest największy

Czy wiesz, w jaki sposób osiągnąć wynik, którego szukam w Excelu?

Odpowiedzi:

2 dla odpowiedzi № 1

Można użyć tabeli przestawnej i formuły wyszukiwaniado osiągnięcia tego. Poniżej znajduje się kilka uproszczonych danych w tabeli Excel (aka ListObject), a poniżej jest to tabela przestawna z odpowiednią formułą wyszukiwania po prawej stronie.

wprowadź opis obrazu tutaj

Tabela przestawna zawiera w sobie numer reg orazpole RecordID w obszarze Wartości (agregacja) ustawionym na „Max”. Zasadniczo wyświetla maksymalną wartość RecordID dla każdego numeru reg, a następnie w kolumnie po prawej stronie znajduje się formuła INDEX / MATCH, która wyszukuje ten rekord RecordID w tabeli wprowadzania danych i zwraca powiązany etap.

To nie jest całkiem na żywo, ponieważ będziesz musiał odświeżyć tabelę przestawną i musisz upewnić się, że skopiowałeś formułę wyszukiwania wystarczająco daleko, aby obsłużyć rozmiar tabeli przestawnej.

Możesz łatwo zautomatyzować odświeżanie po prostu przezumieszczenie obsługi zdarzenia Worksheet_Activate w arkuszu. Coś takiego: Private Sub Worksheet_Activate () Activesheet.PivotTables („PivotTable”). PivotCache.Refresh Napis końcowy

Odkąd zaangażowaliśmy VBA, równie dobrze możesz mieć jakiś kod, który kopiuje formułę w dół wymaganej liczby wierszy obok tabeli przestawnej. Zrobię coś w odpowiednim czasie i opublikuję tutaj.

AKTUALIZACJA: Napisałem kod, aby podporządkować tabelę tabeli przestawnej, dzięki czemu wszelkie zmiany w wymiarach lub rozmieszczeniu tabeli przestawnej zostaną odzwierciedlone w wymiarach i rozmieszczeniu tabeli cienia. To daje nam sposób na dodanie obliczone pole do tabeli przestawnej, która może odnosić się do czegoś na zewnątrz tej tabeli przestawnej, tak jak robimy to przy pomocy wyszukiwania INDEX / MATCH. Nazwijmy to funkcjonalnością Obliczona tabela.

Jeśli tabela przestawna rośnie, tabela obliczonaurośnie. Jeśli tabela przestawna zmniejszy się, tabela obliczona zmniejszy się, a wszelkie zbędne formuły zostaną usunięte. Oto jak wygląda Twój przykład: Górna tabela pochodzi z Wkład arkusz, a tabela przestawna i tabela obliczeniowa poniżej są z Wyniki arkusz.

wprowadź opis obrazu tutaj

Jeśli przejdę do arkusza wprowadzania i dodam jeszcze trochędanych, a następnie po przełączeniu z powrotem do arkusza wyników tabela przestawna automatycznie zostaje zaktualizowana o nowe dane, a tabela obliczona automatycznie rozszerza się, aby pomieścić dodatkowe wiersze: wprowadź opis obrazu tutaj

A oto kod, którego używam do automatyzacji tego:

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

Fajne jest to, że kod będzie automatyczniezmień rozmiar tabeli obliczanej za każdym razem, gdy aktualizacje tabeli przestawnej i te aktualizacje są również wywoływane przez filtrowanie w tabeli przestawnej. Więc jeśli filtrujesz tylko kilka liczb rego, oto co widzisz: wprowadź opis obrazu tutaj


1 dla odpowiedzi nr 2

Wspomniałeś o SQL w swoim pytaniu, więc pomyślałem, że możesz być zainteresowany rozwiązaniem VBA używającym SQL:

"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

Aby to wykorzystać, musisz dołączyć Referencjedo „Microsoft ActiveX Data Objects 6.1 Library” i „Microsoft ActiveX Data Objects Recordset 6.0 Library” w projekcie VBA. (Przynajmniej „są tymi, których wybieram”)