2017-05-10 6 views
1

私はMS Access 2013/VBAで作業しています。フォーム上にあるすべてのコンボボックスを初期化する関数。この関数は、フォームのLoadイベントで呼び出されます。VBA:コンボボックスに追加する列の数を表すパラメータを渡す

フォーム上のコンボボックスごとに初期化関数を追加していますが、これはフォームに35以上のコンボボックスがあり、フォームにも複数のタブがあることは言及されていません。

私は理想的には、初期化関数を1つしか持たず、ロードイベントから何度も呼び出しますが、必要なパラメータを渡して個々のコンボボックスを処理します。私は(各呼び出しは基本的に同じことを関数を呼び出している)今持っている何

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 

機能ごとに変わる唯一の事は、実行されます選択クエリで、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 

私がいることを考えていますがどのようなIレコード配列を反復処理する最初の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

魅力的に機能しました –

関連する問題