Vba 从Access 2013中的位字段为报告创建字符串

Vba 从Access 2013中的位字段为报告创建字符串,vba,ms-access,Vba,Ms Access,我正在建立一个access数据库来跟踪陆军部队的空降行动。其中一个要求是我能够将存储的数据输出到陆军表单上 此表单有一个标签,我需要在其中输入操作类型,该类型可以是以下一种或组合: 行政、战术、大规模战术、战斗、夜间、战斗装备 基于此,我将数据存储为复选框,在实际数据库中提供yes/no(不是三重状态)字段 我想做的是能够打印(在报告中)实际接受的缩写(即a/NT、T、MT、C、N、CE)。为了做到这一点,我已经试过了 Private Sub Detail_Format(Cancel As In

我正在建立一个access数据库来跟踪陆军部队的空降行动。其中一个要求是我能够将存储的数据输出到陆军表单上

此表单有一个标签,我需要在其中输入操作类型,该类型可以是以下一种或组合:

行政、战术、大规模战术、战斗、夜间、战斗装备

基于此,我将数据存储为复选框,在实际数据库中提供yes/no(不是三重状态)字段

我想做的是能够打印(在报告中)实际接受的缩写(即a/NT、T、MT、C、N、CE)。为了做到这一点,我已经试过了

Private Sub Detail_Format(Cancel As Integer, FormatCount As Integer)
Dim strJumpType As String
strJumpType = ""

If Me.chkAdminNonTactical = True Then
    strJumpType = strJumpType & "A/NT/"
End If
If Me.chkTactical = True Then
    strJumpType = strJumpType & "T/"
End If
If Me.chkMassTactical = True Then
    strJumpType = strJumpType & "MT/"
End If
If Me.chkCombat = True Then
    strJumpType = strJumpType & "C/"
End If
If Me.chkNight = True Then
    strJumpType = strJumpType & "N/"
End If
If Me.chkCombatEquipment = True Then
    strJumpType = strJumpType & "CE/"
End If

If Right(strJumpType, 1) = "/" Then

    strJumpType = Left(strJumpType, Len(strJumpType) - 1)

End If

MsgBox strJumpType, vbOKOnly ' test string

Me.lblJumpType.Caption = strJumpType

End Sub
虽然这样做有效,但它要求我向表单中添加不可见的复选框。我想直接访问当前记录,但我尝试的每个方法(me.XXX或currentrecord.XXX或设置引用当前记录集的变量)都失败

所以我的问题是,这真的是最好的方法,还是有更优雅/有效的方法?现在我只有大约500人每年跳6次,所以没有明显的表现。我怀疑如果我有一个更大的数据集,这将开始成为一个瓶颈


另外,我想提高我的整体编程技能。这将在Access 2013或更高版本上运行

你目前的方法没有那么糟糕。这要视情况而定。报告的记录集通常不可用。据我所知,不可见字段对性能的影响很小

如果是基于查询的报告,则可能需要使用用户定义的函数或仅在查询中使用平面SQL创建字符串。 如果是基于表的报告,如果这是您希望经常访问的信息,则可以向表中添加计算字段

您可能希望将计算移出VBA,并移到文本控件的控件源中。表达式如下所示:

=IIF(chkAdminNonTactical; "A/NT/"; "") & IIF( chkTactical; "T/"; "") & IIF( .... etc

我可能会建议您使用最后一个选项,因为它可能会提高性能,如果可能的话避免vba是很好的选择。

我觉得您的数据结构很好。您有六个类别,可以选择它们的任意组合。在接受跳转输入的表单上,您需要六个复选框或一个允许您选择多个项目的列表框。此解决方案在您获取输入并将其存储在记录中后启动。我假设您的数据如下所示:

 JumpID|ANT|T|MT|C|N|CE
 1     |T  |F|T |F|F|T
您的报表将拉取每个记录,并使用单个文本框控件将这些项放在一起。然后,您将有以下框的控制源:

=Switch([ANT]=0,"A/NT/") & Switch([T]=0,"T/") & Switch([MT]=0,"MT/") & 
 Switch([C]=0,"C/") & Switch([N]=0,"N/") & Switch([CE]=0,"CE/")
如果全部选中,结果将是“A/NT/T/MT/C/N/CE/”。要删除最后一条斜杠,只需像在VBA中那样用左语句将其包装:

=Left(Switch([ANT]=0,"A/NT/") & Switch([T]=0,"T/") & Switch([MT]=0,"MT/") & 
 Switch([C]=0,"C/") & Switch([N]=0,"N/") & Switch([CE]=0,"CE/"),
 Len(Switch([ANT]=0,"A/NT/") & Switch([T]=0,"T/") & Switch([MT]=0,"MT/") & 
 Switch([C]=0,"C/") & Switch([N]=0,"N/") & Switch([CE]=0,"CE/"))-1)
这看起来很难看,但你只需要输入一次,它的美妙之处在于它可以将你的合并跳转类型输入到一个文本框中,而无需触摸VBA。这将使您的报告更易于使用和设计


另一方面,Access非常擅长基于模板创建政府表单。它真的可以简化你的生活

这是我为其他需要这样做的人提供的最终代码解决方案。99.9%是基于矶鹞的建议。没有更多隐藏的复选框,也不需要运行VBA来获得表单中的正确输出

=Left(Switch([AdminNonTactical]=-1,"A/NT/") & Switch([Tactical]=-1,"T/") &
Switch([MassTactical]=-1,"MT/") & Switch([Combat]=-1,"C/") & 
Switch([Night]=-1,"N/") & Switch([CombatEquipment]=-1,"CE/") & 
Switch([Jumpmaster]=-1,"J/") & Switch([AssistantJumpmaster]=-1,"AJ/") & 
Switch([Safety]=-1,"Safety/") & 
Switch([DZSO]=-1,"DZSO/"),Len(Switch([AdminNonTactical]=-1,"A/NT/") & 
Switch([Tactical]=-1,"T/") & Switch([MassTactical]=-1,"MT/") & 
Switch([Combat]=-1,"C/") & Switch([Night]=-1,"N/") & 
Switch([CombatEquipment]=-1,"CE/") & Switch([Jumpmaster]=-1,"J/") & 
Switch([AssistantJumpmaster]=-1,"AJ/") & Switch([Safety]=-1,"Safety/") & 
Switch([DZSO]=-1,"DZSO/"))-1)

谢谢你的代码-我以前没有见过开关的功能,所以看到它是如何工作的真是太棒了。事实证明,我需要将0改为-1才能得到正确的公式,但除此之外,它工作得非常好。