Сводный полный текст вместо счета - Excel

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();

3
задан JPA0888 21 January 2019 в 05:30
поделиться

2 ответа

Вот несколько скриншотов с результатами приведенного ниже Power Query. Я выбрал (в Excel 2003) Данные-> Импорт внешних данных-> Новый запрос к базе данных. Затем я выбрал «Файлы Excel» и добавил нужные данные. Убедитесь, что в параметрах запроса выбрано «is not null». Затем я добавил функцию автосортировки.

ScreenShot1

ScreenShot2

Вы можете использовать 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.

0
ответ дан IAmNerd2000 21 January 2019 в 05:30
поделиться

Как уже упоминалось в комментариях, использование 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
0
ответ дан Ryan Wildry 21 January 2019 в 05:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: