2013-08-21 67 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