2017-05-10 87 views
1

我正在使用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循環中添加另一個循環,但我不知道如何添加此部分。

我希望我能在這個問題上得到一些幫助,因爲我認爲我已經接近正確,我遇到了一個我一直無法解決的障礙。

回答

1

在變量中構造字符串,然後將其傳遞給AddItem()函數。從空字符串""開始,然後在循環中添加到以前的值。使用計數器作爲avarRecords()功能的索引:

Dim c As Integer 
Dim s As String 

For intRecord = 0 To UBound(avarRecords, 2) 
    s = "" 
    For c = 0 To pCols 
     s = s & avarRecords(c, intRecord) & ";" 
    Next c 

    pCombo.AddItem (s) 
Next intRecord 
+0

它的工作原理類似於魅力 –