私は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ループの中に別のループを追加する必要がありますが、この部分を追加する方法がわかりません。
私はこの問題についていくつかの助けを得ることができると思うので、私はそれが正しいことに近いと思うので、私は私が把握できなかったロードブロッカーにたどり着いた。
魅力的に機能しました –