Sql 将标题显示和顺序从记录集更改为excel工作表

Sql 将标题显示和顺序从记录集更改为excel工作表,sql,excel,vba,recordset,Sql,Excel,Vba,Recordset,我有一个excel表格,用作数据库,还有一个搜索表单,允许用户根据一些标准搜索信息,并在新的表格中显示过滤结果 我正在使用SQL获取数据,并将它们显示给用户 我使用类似TopOpenConnection的方法,然后创建一个记录集并将我的sql请求传递给它 m_Connection.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _ "Data Source=" & ThisWorkbook.FullName & ";

我有一个excel表格,用作数据库,还有一个搜索表单,允许用户根据一些标准搜索信息,并在新的表格中显示过滤结果

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

我使用类似TopOpenConnection的方法,然后创建一个记录集并将我的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 & ";")
一切正常,但我需要允许用户选择列标题名称和顺序,这些名称和顺序可能与我从中选择调用数据库的工作表中的不同

我们需要这样做,因为用户位于不同的国家/地区,因此显示名称将根据用户的国家/地区进行配置,但我们还希望允许用户根据其需要更改字段的显示名称和顺序,因为显示名称可能太长(多行)

我真正的“数据库”表大约有110列,1000条记录(行)

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

让我们假设我有这个“数据库”

用户进入此搜索屏幕以从数据库中选择所需的信息

我希望用户将得到这个结果,而不是在相同的顺序和数据库显示

如您所见,结果页面中列的显示名称和顺序与“数据库”表不同

我想创建一个配置页面,用户可以在其中指定所需的显示名称以及字段的显示顺序。诸如此类

有没有什么快速的方法可以直接在SQL/EXCEL中的记录集中这样做,或者我应该在获取数据后,使用vba更改EXCEL工作表中的标题?如果是这样,我必须在vba中创建一种数组,其中包含数据库名和显示名,并在显示结果页之前将数据库名替换为相应的名称? 有什么建议吗? 关于字段顺序的相同问题,如何根据用户选择的顺序对字段进行排序?有什么捷径吗


感谢所有能够提供最佳帮助的人,您可以执行以下操作,它根据可用位置的最小和最大范围内的行数在数据范围内循环,依次在C列中查找这些排名,然后检查是否显示,然后将字段名和别名添加到数组中。然后加入该数组。所以,使用和您类似的数据,在相同顺序的列中,我调用:

GenerateOrderedSQL(“表1”,范围(“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`
函数GenerateOrderedSQL(strInputTable As String_
rngRangeForSelection作为Excel.Range_
lngOrderColumn只要_
LNGSHOW列(长度)为字符串
我和你一样长
将FPO调暗为长
如长
Dim a()作为变量
l=rngRangeForSelection.Rows.Count
雷迪姆a(l)
对于fPos=1至l
lfPos=Application.WorksheetFunction.Match(fPos_
rngRangeForSelection.Columns(lngOrderColumn),0)
如果rngRangeForSelection.Cells(lfPos,lngShowColumn).Value=“是”,则
a(fPos-1)=“[”&rngRangeForSelection.CELL(lfPos,1)和_
“]作为[”&rngRangeForSelection.Cells(lfPos,2)&“]
a(fPos-1)=a(fPos-1)和IIf(fPos
这就产生了以下结果:


从[table 1]中选择[Fname]作为[First Name],[Lname]作为[Last Name],[Zip]作为[Zip],[City]作为[City]作为[table 1]

您需要根据要显示的字段名来构建SQL,然后使用
作为类似于
选择[”&range(“a1”).value&“]作为[”range(“b1”)、value&“]的别名,……我明白你的意思,所以记录集没有允许影响显示字段的属性或方法,对吗?关于你的建议,这还不错,但是如果有更好的方法可以为100多个领域做的话,那就太好了,如果没有的话,我会按照你的建议去做。你觉得这样更好吗?或者,例如,在vba中制作二维数组,第一列为实名,第二列为显示名称,在结果页面中粘贴记录集后,我循环遍历列并根据数组逐个替换它们?非常感谢您的帮助,我将在下周的工作中尝试它,因为我周末不工作,我的excel和数据库也在工作。顺便说一句,如果你能给你的代码添加一些注释,如果有一天其他人需要理解它,这将是非常有帮助的。再次感谢,如果它解决了我的问题,我会让你知道。非常感谢,我对一个示例数据库进行了第一次测试,你的代码创建了正确的SQL选择。我现在必须准备实际数据来处理它,但我需要几天时间来准备所有数据,如果一切正常,我会回来将其标记为已解决。我将投票+1,等待最终确认,然后再选择已解决的答案。顺便问一下,如果我没有使用SQL,你知道我们如何在不使用SQL的情况下使用VBA来实现同样的功能吗?对于我或任何其他在代码中不使用sql的用户来说,拥有这两种方法和helpfull可能是很有趣的。非常感谢,我忘了回到标签解决了。您的解决方案非常好,但仍有两个小问题需要解决,首先我必须在数据库名GenerateOrderedSQL=“SELECT”&Join(a,vbNullString)和“FROM[”&strInputTable&“$”;“第二个问题是GenerateOrderedSQL=Replace(GenerateOrderedSQL)”,FROM[”,“FROM[”)如果我不想显示所有字段,例如,我的数据库是100个字段,我只想处理20个字段,我会这样做