我有一个用作数据库的Excel工作表,还有一个搜索表单,允许用户根据某些条件搜索信息,并在新工作表中显示过滤的结果。
我正在使用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 & ";")
一切正常,但是我需要允许用户选择列标题的名称和顺序,这些名称和顺序可能与我选择要调用数据库的工作表中的内容不同
我们需要这样做是因为用户位于不同的国家/地区,因此将根据用户所在的国家/地区来配置显示名称,但是我们也希望允许用户根据他们的需要和更改字段的显示名称和顺序。因为显示名称可能太长(多行)。
我真正的“数据库”工作表大约有110列,大约有1000条记录(行)。
我无法发布真实数据,因为它是机密的,但是为了帮助您理解我,我创建了一个示例来代表我的身份
让我们假设我有这个“数据库”
用户进入此搜索屏幕以从数据库中选择他需要的信息
我希望用户能得到这个结果,而不是以相同的顺序显示数据库
如您所见,结果页面中各列的显示名称和顺序与“数据库”工作表不同
我想创建一个配置页面,用户可以在其中指定他想要的显示名称以及他希望这些字段出现的顺序。像这样的东西
是否有直接在SQL / EXCEL中的Recordset中直接执行此操作的快速方法,还是应该在获取数据后使用vba更改excel工作表中的标头?如果是这样,我必须在vba中创建一种既包含数据库名称又包含显示名称的数组,并在显示结果页面之前将数据库名称替换为其对应的名称? 有什么建议么 ? 关于字段顺序的相同问题,如何根据用户选择的顺序对它们进行排序?任何快速的方法吗?
感谢所有能够以最佳方式帮助您的人
答案 0 :(得分:1)
您可以执行以下操作,它根据范围内的行数(即可用位置的最小值和最大值)循环遍历数据范围,依次在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]