我正在使用MS Access 2013/VBA。函數初始化窗體上的所有組合框。此函數在窗體的Load事件中調用。VBA:傳遞參數以表示要添加到組合框的列數
我爲窗體上的每個組合框添加了一個初始化函數,這是非常多餘的,沒有提到窗體上有超過35個以上的組合框和窗體也有多個選項卡。
我的理想是隻有一個初始化函數,並且可以從加載事件中調用它,也許多次,但是傳遞必要的參數來處理每個單獨的組合框。
我有什麼權利現在(每次打電話呼叫,做基本相同的功能):
Private Sub Form_Load()
Call InitializePriceCategory
Call InitializePublisher
Call InitializeAutoSearch
Call InitializeConsultingFee
Call InitializePermissionCode
On Error GoTo errhandler
eofit:
Exit Sub
errhandler:
z = ErrorFunction(Err, Err.Description, Erl, "Form_Load")
Err = 0
Select Case z
Case 0: Resume Next
Case 1: GoTo eofit
End Select
End Sub
,對於每個函數唯一改變的,是被執行SELECT查詢,該combo-框以及每個特定組合框需要顯示的列數。功能InitializePriceCategory的
例子:
Public Function InitializePriceCategory()
Dim ADOCon As ADODB.Connection
Dim ADORS As ADODB.Recordset
Dim avarRecords As Variant
Dim avarTransposedArray As Variant
Dim avarOriginalArray As Variant
Dim intRecord As Integer
Dim strSQL As String
On Error GoTo errhandler
strSQL = "SELECT DISTINCT" & _
" [Category]" & _
", [ProductDescription]" & _
", [BasePrice]" & _
", [AdditionalPrintPrice]" & _
", [MinimumPurchaseAmount]" & _
", [isChoral]" & _
", [isScoringBasedMinAmount]" & _
", [isTierBased] " & _
"FROM [dbo].[z_PriceCategories] " & _
"ORDER BY [Category]"
Set ADOCon = New ADODB.Connection
With ADOCon
.ConnectionString = GetConnectionString("Conn")
.Open
End With
Set ADORS = New ADODB.Recordset
With ADORS
.ActiveConnection = ADOCon
.Open strSQL, , adOpenStatic, adLockReadOnly
.MoveLast
.MoveFirst
avarRecords = .GetRows(.RecordCount)
End With
For intRecord = 0 To UBound(avarRecords, 2)
' Check for commas within the string on column 1 (description),
' otherwise the value gets truncated
If InStr(avarRecords(1, intRecord), ",") > 0 Then
avarRecords(1, intRecord) = """" & avarRecords(1, intRecord) & """"
End If
PriceCategory.AddItem (avarRecords(0, intRecord) & ";" & _
avarRecords(1, intRecord) & ";" & _
avarRecords(2, intRecord) & ";" & _
avarRecords(3, intRecord) & ";" & _
avarRecords(4, intRecord) & ";" & _
avarRecords(5, intRecord) & ";" & _
avarRecords(6, intRecord) & ";" & _
avarRecords(7, intRecord))
Next intRecord
eofit:
On Error Resume Next
ADOCon.Close: Set ADOCon = Nothing
ADORS.Close: Set ADORS = Nothing
Exit Function
errhandler:
z = ErrorFunction(Err, Err.Description, Erl, "InitializePriceCategory", , True)
Err = 0
Select Case z
Case 0: Resume Next
Case 1: GoTo eofit
End Select
End Function
最大的不同。對我來說最難弄清楚如何工作了,每個初始化功能中,這樣我只能有一個初始化函數,是列數。
我的目標是有東西的形式加載代碼簡單:
Private Sub Form_Load()
On Error GoTo errhandler
Call InitializeCombo(Me.PriceCategory, "SELECT col1, col2, col3, col4, col5, col6, col7, col8 FROM PriceCategory ", 8, ",")
Call InitializeCombo(Me.PublisherName, "SELECT col1, col2 FROM Publishers ", 2, """")
eofit:
Exit Sub
errhandler:
z = ErrorFunction(Err, Err.Description, Erl, "Form_Load")
Err = 0
Select Case z
Case 0: Resume Next
Case 1: GoTo eofit
End Select
End Sub
然後是InitializeCombo功能代碼是(不完整的想法):
Public Function InitializeCombo(pCombo As ComboBox, pQuery As String, pCols As Integer, Optional pSpecialCharacter As String)
Dim ADOCon As ADODB.Connection
Dim ADORS As ADODB.Recordset
Dim avarRecords As Variant
Dim avarTransposedArray As Variant
Dim avarOriginalArray As Variant
Dim intRecord As Integer
On Error GoTo errhandler
Set ADOCon = New ADODB.Connection
With ADOCon
.ConnectionString = GetConnectionString("Conn")
.Open
End With
Set ADORS = New ADODB.Recordset
With ADORS
.ActiveConnection = ADOCon
.Open pQuery, , adOpenStatic, adLockReadOnly
.MoveLast
.MoveFirst
avarRecords = .GetRows(.RecordCount)
End With
' ON THIS PART I AM NOT SURE HOW TO STILL BE ABLE TO DO THE SPECIAL CHARACTER CHECK
If InStr(avarRecords(1, intRecord), """") > 0 Then
avarRecords(1, intRecord) = "'" & avarRecords(1, intRecord) & "'"
End If
For intRecord = 0 To UBound(avarRecords, 2)
' ON THIS PART, I DO NOT KNOW HOW TO INSTRUCT/ LOOP TO USE THE NUMBER OF COLUMNS PARAMETER
' AND ADD THE NUMBER OF COLUMNS NEEDED; WHETHER ONE COMBO-BOX NEEDS 8 AND THE NEXT ONE ONLY NEEDS 2.
pCombo.AddItem (avarRecords(0, intRecord) & ";" & _
avarRecords(1, intRecord) & ";")
Next intRecord
eofit:
On Error Resume Next
ADOCon.Close: Set ADOCon = Nothing
ADORS.Close: Set ADORS = Nothing
Exit Function
errhandler:
z = ErrorFunction(Err, Err.Description, Erl, "InitializeCombo", , True)
Err = 0
Select Case z
Case 0: Resume Next
Case 1: GoTo eofit
End Select
End Function
我在想什麼我需要在迭代通過記錄數組的第一個for循環中添加另一個循環,但我不知道如何添加此部分。
我希望我能在這個問題上得到一些幫助,因爲我認爲我已經接近正確,我遇到了一個我一直無法解決的障礙。
它的工作原理類似於魅力 –