2013-08-21 32 views
1

我不太确定从哪里开始,我有一小部分代码循环遍历表并将所有字段名称写入字符串以用作值rowsource在一个组合框中。我希望这些项目是按字母顺序排列的,但我不太确定使用字符串变量(或在组合框RowSource属性中)执行此操作的最佳方式。在Access中使用逗号分隔的字符串进行Alphabetize

任何想法或建议的最佳方式来做到这一点?

如果它是有帮助这里是我的代码有:

Dim strFields As String 
Dim fldTemp As Field 
Dim intCount As Integer 
Dim setData As DAO.Recordset 

Set setData = CurrentDb.OpenRecordset("SELECT * FROM tblEnvironment WHERE 1 = 2") 

For Each fldTemp In setData.Fields 
    strFields = strFields & ", " & fldTemp.Name 
Next 

strFields = Mid(strFields, 3) 

For intCount = 1 To 10 
    Controls("cboField" & intCount).RowSource = strFields 
Next 

StrFields是我想alphabatize什么。提前致谢!

+0

难道你不能只在你的OpenRecordset查询中放置一个ORDER BY子句吗? –

+0

我可以,如果它是一个字段中的值,但这是拉所有字段的名称,而不是它们中的值。由于WHERE 1 = 2语句,此记录集实际上不返回字段名以外的数据。 – Mike

+0

什么类型的连接是'CurrentDb'? –

回答

3

我会将您正在创建的字符串转换为数组,然后对该数组进行排序。然后,您可以使用Join使用冒泡排序发现here这是什么,我会调整你的代码

Dim strFields As String 
Dim fldTemp As Field 
Dim intCount As Integer 
Dim setData As DAO.Recordset 
Dim FieldList() As String ' array to hold field names 

Set setData = CurrentDb.OpenRecordset("SELECT * FROM tblEnvironment WHERE 1 = 2") 

intCount = 0 
For Each fldTemp In setData.Fields 
    ReDim Preserve FieldList(intCount + 1) ' expand the array for each field name 
    FieldList(intCount) = fldTemp.Name 
    intCount = intCount + 1 
Next 

BubbleSort FieldList 'sort the fieldnames 

strFields = Join(FieldList, ",") 'join the names together with commas 
strFields = Mid(strFields, 3) 

For intCount = 1 To 10 
    Controls("cboField" & intCount).RowSource = strFields 
Next 

的冒泡排序的代码,只是在链接的情况下到数组转换为一个逗号分隔的字符串

腐:

Sub BubbleSort(arr) 
    Dim strTemp As String 
    Dim i As Long 
    Dim j As Long 
    Dim lngMin As Long 
    Dim lngMax As Long 
    lngMin = LBound(arr) 
    lngMax = UBound(arr) 
    For i = lngMin To lngMax - 1 
    For j = i + 1 To lngMax 
     If arr(i) > arr(j) Then 
     strTemp = arr(i) 
     arr(i) = arr(j) 
     arr(j) = strTemp 
     End If 
    Next j 
    Next i 
End Sub 
+0

完美地工作,出色的清洁答案的问题。谢谢! – Mike

1

如果您创建strFields一个字符串数组,然后你可以使用WizHook.SortStringArray到数组排序。我在下面添加了一个SortStringArray演示程序。

你可以在你的代码像这样使用SortStringArray ...

Dim astrFields() As String 
astrFields = Split(strFields, ", ") 
WizHook.SortStringArray astrFields 

如果你需要它作为再次串...

strFields = Join(astrFields, ", ") 

或者,也许你可以得到由走阵...

For intCount = 0 To UBound(astrFields) 
    Debug.Print intCount, astrFields(intCount) 
Next 

信息大约WizHook是恐慌。当我探索WizHook奥秘时,我为其SortStringArray方法创建了此示例程序。

Public Sub WizHook_SortStringArray() 
    ' The WizHook Key is not required for this procedure. 
    'WizHook.Key = 51488399 
    Dim a(3) As String 
    Dim i As Long 
    a(0) = "zulu" 
    a(1) = "alpha" 
    a(2) = "gamma" 
    a(3) = "delta" 
    WizHook.SortStringArray a 
    For i = 0 To 3 
     Debug.Print a(i) 
    Next i 
End Sub 

我在该程序的原始版本的评论中添加了。某些WizHook方法需要Key值。但是,我不相信SortStringArray呢。如果它不能像写入那样工作,请尝试启用WizHook.Key行。

+0

如果没有密钥,我编辑了包含的答案,但您(或其他人)明显拒绝编辑,将无法正常工作。 ; o) –

+0

我从来不需要'Key',所以相信'SortStringArray'不是必需的。但是我修改了答案,因为它显然不适用于没有'Key'的人。 – HansUp

+0

这也工作得很顺利。它根本不需要钥匙。我只能接受1个答案,不幸的是,你和肖恩的解决方案都是可行的。我之前没有听说过WizHook,但它真的在VBA中看起来没有记录,所以我现在正在研究更多的功能来扩展我的知识库。感谢HansUp。 – Mike