Ms access 访问报告赢得';我不允许引用VBA中的字段,除非它';这是报告本身的一部分

Ms access 访问报告赢得';我不允许引用VBA中的字段,除非它';这是报告本身的一部分,ms-access,vba,Ms Access,Vba,因此,在访问表单或报告中,在屏幕上显示比=[UnitPrice]*[Quantity]更复杂的动态内容的一个好方法是进入VBA e、 g.在这个简化示例中,此报告的基础表有两个字段ShowTax和TaxRate。通过使文本框的控件源代码=GetTaxInfo我在VBA中引入了一些复杂性: Public Function GetTaxInfo() As String Dim result As String If Me!ShowTax = 0 Then resul

因此,在访问表单或报告中,在屏幕上显示比
=[UnitPrice]*[Quantity]
更复杂的动态内容的一个好方法是进入VBA

e、 g.在这个简化示例中,此报告的基础表有两个字段ShowTaxTaxRate。通过使文本框的控件源代码
=GetTaxInfo
我在VBA中引入了一些复杂性:

Public Function GetTaxInfo() As String

    Dim result As String
    If Me!ShowTax = 0 Then
        result = "Tax included @ " & Me!TaxRate

    Else
        result = ""
    End If

    GetTaxInfo = result

End Function
好的,这很有效。。。只要我在其他地方有一个涉及税率的字段。否则它只打印
#Error
。这就好像在VBA代码中使用字段之前需要预加载字段一样。这并不是世界末日,因为我可以在报告中设置一堆字段都不可见,但它不整洁

那么,是否在VBA代码中不能引用支持报表的字段,除非您已经以常规方式将该字段引用为烘焙到报表中的字段

我不记得以前遇到过这种限制。还是我有一份腐败的报告?(我已经尝试了通常的压缩/修复、导出/重新导入报告等)

编辑:


奇怪的是。。。现在它又开始工作了。而且——我很确定——报告中没有任何控制。这就是为什么我认为这是报告中的腐败

表单/报表上需要一个控件

如果这太混乱,您可以将函数放在模块中,并在RecordSource中使用(基于查询)。在其他地方也可以使用的情况下,在报告中隐藏所有这些逻辑是没有意义的

Public Function GetTaxInfo(ShowTax as Boolean, TaxRate as Single) As String 

    Dim result As String 
    If ShowTax = 0 Then 
        result = "Tax included @ " & TaxRate 

    Else 
        result = "" 
    End If 

    GetTaxInfo = result 

End Function 

在此报告中将控件设置为该字段以及其他。

您遇到了我认为在A2000时间框架中引入到Access中的bug。我推测,Access窗体/报表中引入ADO支持后,Access expression服务与窗体/报表记录源中字段的连接以某种方式断开,其结果如您所见,即。,recordsource中的字段在窗体/报表的VBA代码中不可访问,除非该字段是窗体/报表上控件的ControlSource。2000年的问题很小,但后来扩大了。唯一的解决方案是隐藏控件。顺便说一句,我刚刚检查了表单和报表之间有一个非常重要的区别:表单对象的默认“属性”是控件和字段集合的联合(即表单上的控件加上记录源中的字段)。我最近发现实际上没有独立的字段集合,但记录集中的所有字段都显示在表单的控件集合中。对于报告而言,情况并非如此。报表的默认集合中只有控件集合,它不包括recordsource中的字段。David,你的输入错误。。。。你是说“没有真正重要的东西”还是“有真正重要的东西”?我必须说,每次我遇到报告与表格相比的局限性时,都会非常沮丧。他们的行为和能力在很多方面都非常相似,这真的能吸引你out@David-如果您希望将上述信息从评论转移到回答,我们很乐意将其标记为“已接受答案”。您不需要在表单上进行控制,而是在报告上进行控制,引用给定事件中控件的事件代码需要在报表上放置控件以获取数据。访问一直都是这样的,但您不必使用该控件——您所需要的只是表单上使用字段作为其控制源的控件。此时,该字段可以直接在VBA代码中使用(即,不必使用控件的名称)。我很确定这与VBA在幕后创建的隐式属性包装有关(即,使用点运算符对表达式进行编译时检查的机制,即Me.MyField)。