1

Я использую базу данных Access 2010, и я не могу понять, как сохранить несколько параметров для вызова функции в одной константной строке.Сохранение нескольких параметров в глобальной константе

Например, предположим, что я хочу, чтобы открыть форму со следующим:

DoCmd.OpenForm "someformname",acNormal,,"ID=50",acFormEdit, acWindowNormal,"OPENARGS" 

Могу ли я хранить все, что в глобальной константы, такие как

Public Const C_FORMOPENEDIT as String 

, а затем открыть форму, как это?

DoCmd.OpenForm C_FORMOPENEDIT 

Это похоже не работает таким образом. Как я могу получить VBA, чтобы узнать, что это ряд параметров, разделенных запятыми? Или это невозможно?

Примечание: Я уже пытался позвонить ему по имени параметра, например FormName :=, и я также уже проверил, что пройдены любые кавычки в строке, где это необходимо. (например, "" ")

ответ

1

То, что вы хотите сделать, не представляется возможным. Ваша константа будет оцениваться так, как если бы она была именем формы. Поскольку она является постоянной и не динамической, я бы предложил создать отдельный процедуры, такие как

Public Sub FormOpenEdit(sFormName As String) 

    DoCmd.OpenForm sFormName, acNormal, , "ID=50", acFormEdit, acWindowNormal, "OPENARGS" 

End Sub 

Public Sub FormOpenAdd(sFormName As String) 

    DoCmd.OpenForm sFormName, acNormal, , "ID=50", acFormAdd, acWindowNormal, "OPENARGS" 

End Sub 

в качестве альтернативы можно построить Enum, чтобы выбрать режим, так что вы можете использовать только один суб

+0

спасибо. Так я и думал. –

0

вы можете использовать код, приведенный ниже. Я использую его для открытия формы прямо из меню ленты - xml может хранить только строки. Строка с аргументами должна быть слегка изменена, как описано в комментариях. Если вы используете DoCmd.OpenForm с параметром по умолчанию eters и form default view - Datasheet, он все равно открывается как единая форма. Функция также включает фрагмент кода, который исправляет эту проблему.

' non-constant arguments should be able to evaluated by Eval function 
' Replace quotes (") by "{" and "}" 
' Example of arguments: 
' "acNormal, , {[CODE]='DO022666'}, acFormEdit, GetEditFormWindowMode()" 

Public Sub MyOpenForm(strFrm As String, strFrmArgs As String) 
    Dim frm As Form 
    Dim iDefView As Integer 
    Dim astrArgs() As String 
    Dim avArgs(6) As Variant 
    Dim i As Integer 
    Dim arg As Variant 
    Dim bArg0Defined As Boolean 


    'default args 
    avArgs(0) = acNormal 
    avArgs(3) = acFormEdit 
    avArgs(4) = acWindowNormal 

    astrArgs = Split(strFrmArgs, ",") 
    For i = 0 To UBound(astrArgs) 
     If i > 5 Then Exit For 
     arg = EvalFormArgument(astrArgs(i)) 
     If Not IsNull(arg) Then 
      avArgs(i) = arg 
     End If 
    Next i 

    'If View argument ommited, check for DefaultView=Datasheet form property and open form in Datasheet view 
    bArg0Defined = False 
    If UBound(astrArgs) > 0 Then 
     If Len(Trim(astrArgs(0))) > 0 Then 
      bArg0Defined = True 
     End If 
    End If 
    If Not bArg0Defined Then 
     'Determine form properties 
     DoCmd.OpenForm strFrm, acDesign, , , , acHidden 
     Set frm = Forms(strFrm) 
     iDefView = frm.DefaultView 
     DoCmd.Close acForm, strFrm 
     Set frm = Nothing 

     If iDefView = 2 Then 'Datasheet view 
      avArgs(0) = acFormDS 
     End If 
    End If 

    DoCmd.OpenForm strFrm, avArgs(0), avArgs(1), avArgs(2), avArgs(3), avArgs(4), avArgs(5) 

End Sub 

Public Function EvalFormArgument(A As String) As Variant 
Dim ret As Variant 


A = Trim(A) 

If A = "" Then 
    EvalFormArgument = Null 
    Exit Function 
End If 
Select Case A 
    Case "acNormal": ret = 0 
    Case "acDesign": ret = 1 
    Case "acFormDS": ret = 3 
    Case "acFormPivotChart": ret = 5 
    Case "acFormPivotTable": ret = 4 
    Case "acLayout": ret = 6 
    Case "acPreview": ret = 2 
    Case "acFormAdd": ret = 0 
    Case "acFormEdit": ret = 1 
    Case "acFormPropertySettings": ret = -1 
    Case "acFormReadOnly": ret = 2 
    Case "acDialog": ret = 3 
    Case "acHidden": ret = 1 
    Case "acIcon": ret = 2 
    Case "acWindowNormal": ret = 0 
    Case Else 
     A = Replace(A, "{", """") 
     A = Replace(A, "}", """") 
     ret = Eval(A) 
End Select 
EvalFormArgument = ret 

End Function 
Смежные вопросы