Сводный полный текст вместо счета - Excel - PullRequest
0 голосов
/ 16 января 2019

Я пытаюсь определить наиболее эффективный / эффективный способ отображения определенных строк из центральной таблицы на sheet1 в виде текста на sheet2.

Я настроил таблицу, которая содержит многочисленные события, которые постоянно используются несколькими людьми. Этот лист действует как центральная база данных и используется несколькими людьми, которые используют ее в режиме реального времени.

Я хочу предоставить таблицу на sheet2, которая позволяет другим пользователям просматривать определенные события из центральной базы данных. Поэтому мне нужно экспортировать конкретные значения от sheet1 до sheet2. Я понимаю, что это легко сделать с помощью фильтра, но таблица на sheet1 постоянно используется и не может быть нарушена.

Я не могу просто выполнить сортировку или фильтр для таблицы sheet1, потому что она должна постоянно использоваться другими сторонами

Мне действительно нужно просматривать только определенные значения из sheet1 за последний месяц. У меня есть код экспорта всех строк на основе определенного значения, введенного в указанный столбец на Sheet1. Но из-за размера файла Excel постоянно вылетает.

Тогда я подумал, что сводная таблица может быть проще, и мне не пришлось бы использовать VBA. Можно ли вывести отдельные строки в виде текста, который можно сгруппировать по дате, например, месяц

Например, если я хочу просмотреть все ['A's'] и ['X's'] из Column B за последний месяц как полный текст, это выглядело бы следующим образом:

Центральная таблица базы данных Sheet1

   A   B  C   D
0 11/1 A Big Dog
1 10/1 X  1   2 
2 11/1 Y  Y   Y
3 1/2  A Big Cat
4 1/2  X  3   4 
5 1/2  Y  Y   Y

Таблица вывода Sheet2

   A  B  C   D
1 1/2 A Big Cat
2 1/2 X  3   4

Ответы [ 2 ]

0 голосов
/ 24 января 2019

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

ScreenShot1

ScreenShot2

Вы можете использовать Power Query в Sheet2 Excel Workbook. Другая ссылка здесь . Таким образом, вы можете обновить данные, когда вам нужно. Затем используйте SQL для запроса того, что вам нужно.

Он довольно прост в использовании и не требует никакого кодирования (если вы не хотите использовать SQL).

Это можно сделать, а затем в другой рабочей книге вы можете выполнить фильтрацию и сортировку.

@ ryan-wildry пост довольно хорош (как и текст его команды для SQL), но если вы не хотите использовать vba или базу данных, вы можете использовать это (как и его текст SQL) .

Примером может быть: SELECT * FROM [Sheet1 $] WHERE Column2 = 'X';

Единственная проблема будет, если вы смешаете типы данных в одном столбце. Как видно из строк 1 и 4 (они не смогли найти запрос, потому что значения не одного типа. (Это использует Excel 2003, поэтому, если у вас более новая версия, вы можете проверить это с этим).

Я провел некоторое исследование и обнаружил, что Power Query в Excel будет обрабатывать смешанные типы данных, поэтому вам следует настроить его, если вы используете Power Query.

0 голосов
/ 23 января 2019

Как уже упоминалось в комментариях, использование 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
...