Изменение отображения и порядка заголовков с набора записей на лист Excel - PullRequest
0 голосов
/ 15 февраля 2019

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

Я используюSQL для извлечения данных и отображения их пользователю.

Я использую что-то вроде top open connection, затем создаю набор записей и передаю ему свой sql-запрос

m_Connection.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _
        "Data Source=" & ThisWorkbook.FullName & ";Extended Properties=""Excel 12.0;HDR=Yes;"";"

Set OpenRecordset = CreateObject("ADODB.Recordset")
    OpenRecordset.Open sql, GetConnection(), 3, 3, &H1

Set rst = OpenRecordset("SELECT * FROM [Database$] Where " & Myconditions & ";")

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

Нам это нужно, потому что пользователи находятся в разных странах, поэтому отображаемое имя будет настроено на основестрана пользователя, но также мы хотим разрешить пользователю изменять отображаемое имя и порядок полей в зависимости от их потребностей и потому, что отображаемое имя может быть слишком длинным (многострочный).

My real "База данных »содержит около 110 столбцов и около 1000 записей (строк).

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

допустим, у меня есть эта «база данных»

enter image description here

пользователь вводит этот экран поиска в sвыберите необходимую ему информацию из базы данных

enter image description here

Я бы хотел, чтобы пользователь получал этот результат и не в том же порядке и отображении базы данных

enter image description here

Как видно, отображаемые имена и порядки столбцов на странице результатов отличаются от листа "базы данных"

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

enter image description here

Есть ли какой-нибудь быстрый способ сделать это прямо в моем наборе записей в SQL / EXCEL, или я должен после получения данных изменитьзаголовки в листе Excel с помощью VBA?Если это так, я должен создать своего рода массив в vba, который будет содержать как имена баз данных, так и отображаемые имена, и заменить имена баз данных на соответствующие, непосредственно перед тем, как показать страницу результатов.какие-либо предложения ?тот же вопрос о порядке полей, как сортировать их по порядку, выбранному пользователем?любой быстрый способ?

Спасибо всем, кто может помочь с лучшим способом сделать это

1 Ответ

0 голосов
/ 15 февраля 2019

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

GenerateOrderedSQL("table 1",range("a2:d6"),3,4) A1: D1 содержал заголовки

Это вызвало мою функцию

Function GenerateOrderedSQL(strInputTable As String, _
                        rngRangeForSelection As Excel.Range, _
                        lngOrderColumn As Long, _
                        lngShowColumn As Long) As String

Dim l As Long
Dim fPos As Long
Dim lfPos As Long
Dim a() As Variant

l = rngRangeForSelection.Rows.Count

ReDim a(l)

For fPos = 1 To l

    lfPos = Application.WorksheetFunction.Match(fPos, _
                    rngRangeForSelection.Columns(lngOrderColumn), 0)

    If rngRangeForSelection.Cells(lfPos, lngShowColumn).Value = "Yes" Then
        a(fPos-1) = "[" & rngRangeForSelection.Cells(lfPos, 1) & _
                        "] AS [" & rngRangeForSelection.Cells(lfPos, 2) & "]"
        a(fPos-1) = a(fPos-1) & IIf(fPos < l, ",", vbNullString)
    End If

Next

Debug.Print "SELECT " & Join(a, vbNullString) & " FROM [" & strInputTable; "]"

End Function`

Это дало следующее

SELECT [Fname] AS [First Name],[Lname] AS [Last Name],[Zip] AS [Zip],[City] AS [City] FROM [table 1]

...