将记录集的 headers 显示和顺序更改为 excel sheet

Changing headers display and order from a recordset to excel sheet

我有一个 excel sheet 用作数据库,还有一个搜索表单,允许用户根据某些条件搜索信息,并在新的 sheet.

我正在使用 SQL 获取数据,并将它们显示给用户。

我使用类似于顶部打开连接的东西,然后创建一个记录集并将我的 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 & ";")

一切正常,但我需要允许用户选择列 headers 名称和顺序,这可能与我在 sheet 中的名称和顺序不同,我从中创建 [=62] =] 我称之为数据库

我们需要这个,因为用户在不同的国家,所以显示名称将根据用户的国家配置,但我们也希望允许用户根据他们的国家更改显示名称和字段顺序需要并且因为显示名称可能太长(多行)。

我的真实"database"sheet大约是110列,大约1000条记录(行)。

我不能发布真实的数据,因为它是机密的,但为了帮助你理解我,我创建了这个代表我所拥有的东西的例子

让我们假设我有这个 "database"

用户进入此搜索屏幕以select从数据库中获取他需要的信息

我希望用户得到这个结果而不是按照数据库的顺序和显示

如您所见,结果页面中列的显示名称和顺序与 "database" sheet

不同

我想创建一个配置页面,用户可以在其中指定他想要的显示名称以及他希望字段出现的顺序。类似的东西

有没有什么快速的方法可以直接在 SQL/EXCEL 中的 Recordset 中执行此操作,或者我应该在获取数据后更改 excel sheet 中的 headers 使用vba ?如果是这样,我必须在 vba 中创建一个包含数据库名称和显示名称的数组,并在我显示结果页面显示之前将数据库名称替换为相应的名称? 有什么建议么 ? 关于字段顺序的相同问题,如何根据用户选择的顺序对它们进行排序?有什么快速的方法吗?

感谢任何能以最佳方式提供帮助的人

您可以执行以下操作,它根据范围内的行数循环遍历数据范围,即可用位置的最小值和最大值,它依次查找这些排名,在 C 列中,然后检查是否显示,然后添加字段名称,它是数组的别名。然后加入这个数组。因此,使用与您相似的数据,在相同顺序的列中,我调用了:

GenerateOrderedSQL("table 1",range("a2:d6"),3,4) A1:D1 包含 headers

这调用了我的函数

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]