Lodash.js (надмножество Underscore.js )
Хорошо не добавлять рамки для каждой простой части логики, но полагаться
Lodash выпускает очень чистый код и способствует более функциональному программированию , который приводит к тому, что он работает на хорошо проверенных средах утилиты, ускоряет разработку и уменьшает количество написанных ошибок. в меньшем количестве ошибок. В одном взгляде становится ясно, что за цель, если код.
Проблема OP может быть просто решена как:
const sortedObjs = _.sortBy(objs, 'last_nom');
Подробнее? Например. у нас есть следующий вложенный объект:
const users = [
{ 'user': {'name':'fred', 'age': 48}},
{ 'user': {'name':'barney', 'age': 36 }},
{ 'user': {'name':'wilma'}},
{ 'user': {'name':'betty', 'age': 32}}
];
Теперь мы можем использовать стенографию _. свойство user.age
, чтобы указать путь к свойству, которое должно быть сопоставлено. Мы будем сортировать объекты пользователя по вложенному возрасту. Да, это позволяет сопоставлять вложенные свойства!
const sortedObjs = _.sortBy(users, ['user.age']);
Хотите, чтобы это было отменено? Нет проблем. Используйте _. Reverse .
const sortedObjs = _.reverse(_.sortBy(users, ['user.age']));
Хотите комбинировать оба с помощью Chaining ?
const sortedObjs = _.chain(users).sortBy('user.age').reverse().value();
Вот несколько скриншотов с результатами приведенного ниже Power Query. Я выбрал (в Excel 2003) Данные-> Импорт внешних данных-> Новый запрос к базе данных. Затем я выбрал «Файлы Excel» и добавил нужные данные. Убедитесь, что в параметрах запроса выбрано «is not null». Затем я добавил функцию автосортировки.
Вы можете использовать Power Query ] в Sheet2 Excel Workbook. Еще одна ссылка здесь . Таким образом, вы можете обновить данные, когда вам нужно. Затем используйте SQL для запроса того, что вам нужно.
Он довольно прост в использовании и не требует никакого кодирования (если вы не хотите использовать SQL).
Это можно сделать, а затем в другой рабочей книге вы можете выполнить фильтрацию и сортировку.
Сообщение @ ryan-wildry довольно велико (как и текст его команды для SQL), но если вы не хотите использовать vba или базу данных, вы можете использовать это (как и его текст SQL) . [+1112]
Примером может быть: SELECT * FROM [Sheet1 $] WHERE Column2 = 'X';
Единственная проблема будет, если вы смешаете типы данных в одном столбце. Как видно из строк 1 & amp; 4 (они не смогли встретиться с запросом, потому что значения не одного типа. (Это использует Excel 2003, поэтому, если у вас более новая версия, вы можете проверить это с помощью этого).
Я провел некоторое исследование и обнаружил, что Power Query в Excel будет обрабатывать смешанные типы данных, поэтому вам следует настроить его, если вы используете Power Query.
Как уже упоминалось в комментариях, использование SQL с ADODB, вероятно, лучше, чем использование сводных таблиц. Я бы также рекомендовал отделить ваши данные (Sheet1) от уровня презентации (Excel). Например. хранить ваши данные в фактической базе данных, такой как Access, SQL Server и т. д.
Однако, поскольку вы ищете пробел, я подумал, что мог бы дать вам подход, который мог бы удовлетворить потребность временно. Код комментируется, но не стесняйтесь задавать вопросы. Вам нужно будет добавить ссылку на Microsoft Active X Data Object 2.8 or greater
, чтобы это работало. Как добавить ссылку?
Подход раннего связывания
Option Explicit
Public Sub DisplayView(StartDate As Date, EndDate As Date)
'Add a reference to Microsoft Active X Data Object 2.8 or greater
Dim dbConnection As ADODB.Connection
Dim dbRecordset As ADODB.Recordset
Dim dbCommand As ADODB.Command
Dim OutputSheet As Excel.Worksheet
Dim dbField As Variant
Dim fieldCounter As Long
Set dbConnection = New ADODB.Connection
Set dbRecordset = New ADODB.Recordset
Set dbCommand = New ADODB.Command
Set OutputSheet = ThisWorkbook.Worksheets("Sheet2")
'Do a quick check to determine the correct connection string
'if one of these don't work, have a look here --> https://www.connectionstrings.com/excel/
If Left$(ThisWorkbook.FullName, 4) = "xlsm" Then
dbConnection.connectionstring = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & _
ThisWorkbook.FullName & ";Extended Properties='Excel 12.0 Macro;HDR=YES';"
Else
dbConnection.connectionstring = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & _
ThisWorkbook.FullName & ";Extended Properties='Excel 12.0;HDR=YES';"
End If
'Open the connection and parameterize the query
dbConnection.Open
With dbCommand
.ActiveConnection = dbConnection
.CommandType = adCmdText
'A in B in the text below are the field names in your Sheet 1
'I wasn't sure what the names of the fields are so I named them as they appeared
'That being Column A is called A, Column B is called B etc
.CommandText = "Select * from [Sheet1$] where B in ('A','X') and A >= @StartDate and A < @EndDate"
.Parameters.Append .CreateParameter("@StartDate", adDate, adParamInput, , StartDate)
.Parameters.Append .CreateParameter("@EndDate", adDate, adParamInput, , EndDate)
Set dbRecordset = .Execute
End With
'Clear the Output Sheet
OutputSheet.Cells.Clear
'Add Headers to output
For Each dbField In dbRecordset.Fields
fieldCounter = fieldCounter + 1
OutputSheet.Cells(1, fieldCounter).Value2 = dbField.Name
Next
'Dump the found records
OutputSheet.Range("A2").CopyFromRecordset dbRecordset
If dbConnection.State = adStateOpen Then dbConnection.Close
End Sub
'Run from here
Public Sub ExampleRunner()
'Supply the dates you want to filter for
DisplayView #1/1/2019#, #1/20/2019#
End Sub
По запросу, здесь Позднее связывание Подход , который не требует явной ссылки на Microsoft Active X Data Object
.
Option Explicit
Private Const adCmdText As Long = 1
Private Const adDate As Long = 7
Private Const adParamInput As Long = 1
Public Sub DisplayView(StartDate As Date, EndDate As Date)
'Add a reference to Microsoft Active X Data Object 2.8 or greater
Dim dbField As Variant
Dim fieldCounter As Long
Dim dbConnection As Object
Dim dbRecordset As Object
Dim dbCommand As Object
Dim OutputSheet As Excel.Worksheet
Set dbConnection = CreateObject("ADODB.Connection")
Set dbRecordset = CreateObject("ADODB.Recordset")
Set dbCommand = CreateObject("ADODB.Command")
Set OutputSheet = ThisWorkbook.Worksheets("Sheet2")
'Do a quick check to determine the correct connection string
'if one of these don't work, have a look here --> https://www.connectionstrings.com/excel/
If Left$(ThisWorkbook.FullName, 4) = "xlsm" Then
dbConnection.connectionstring = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & _
ThisWorkbook.FullName & ";Extended Properties='Excel 12.0 Macro;HDR=YES';"
Else
dbConnection.connectionstring = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & _
ThisWorkbook.FullName & ";Extended Properties='Excel 12.0;HDR=YES';"
End If
'Open the connection and parameterize the query
dbConnection.Open
With dbCommand
.ActiveConnection = dbConnection
.CommandType = adCmdText
'A in B in the text below are the field names in your Sheet 1
'I wasn't sure what the names of the fields are so I named them as they appeared
'That being Column A is called A, Column B is called B etc
.CommandText = "Select * from [Sheet1$] where B in ('A','X') and A >= @StartDate and A < @EndDate"
.Parameters.Append .CreateParameter("@StartDate", adDate, adParamInput, , StartDate)
.Parameters.Append .CreateParameter("@EndDate", adDate, adParamInput, , EndDate)
Set dbRecordset = .Execute
End With
'Clear the Output Sheet
OutputSheet.Cells.Clear
'Add Headers to output
For Each dbField In dbRecordset.Fields
fieldCounter = fieldCounter + 1
OutputSheet.Cells(1, fieldCounter).Value2 = dbField.Name
Next
'Dump the found records
OutputSheet.Range("A2").CopyFromRecordset dbRecordset
If dbConnection.State = adStateOpen Then dbConnection.Close
End Sub
'Run from here
Public Sub ExampleRunner()
'Supply the dates you want to filter for
DisplayView #1/1/2019#, #1/20/2019#
End Sub