注册 登录
Office中国论坛/Access中国论坛 返回首页

的个人空间 http://www.office-cn.net/?0 [收藏] [复制] [分享] [RSS]

日志

删除标签和报表中不需要的空白行

已有 172 次阅读2008-1-20 09:33 |个人分类:ACCESS

删除标签和报表中不需要的空白行
列徽标图像

2004 年 9 月 20 日

作者 Sal Ricciardi

有些地址只包含几行,而其他地址还需要一个或两个额外的行。在本部分中,将学习在各个地址具有不同的行时,如何删除出现在标签和报表中的空白行。我们提供了一个示例函数,可用于删除不需要的空间。



适用于
Microsoft Office Access 2003
Microsoft Access 2000 和 2002
Microsoft Access 97


参阅所有 Office 专栏
参阅所有“使用 Access 完成任务”专栏

问题:如何删除报表中不需要的行,如地址中的空行?

通过将“可以缩小”属性 (属性:控件、字段或对象的命名属性,可以通过设置属性来定义对象的某种特征(如大小、颜色或屏幕位置)或对象行为的某个方面(如对象是否隐藏)。)设置为“是”并仔细定位控件 (控件:允许用户控制程序的图形用户界面对象,如文本框、复选框、滚动条或命令按钮等。可使用控件显示数据或选项、执行操作或使用户界面更易阅读。)的位置,通常可以删除空行。只要控件不与其他行重叠,并且在该行上没有其他内容,该方法就有效。在其他时候,如在固定的图形对象与要缩小的区域重叠时,则需要使用一些自定义 Microsoft Visual Basic® for Applications (VBA) 代码删除空白行。VBA 是 Access 使用的编程语言。在本专栏的下文中将介绍一种使用自定义 VBA 函数的解决方案。

在地址的中间具有空白行的标签

介绍“可以缩小”和“可以扩大”属性

Access 使用两个属性决定是否调整控件的大小以适应控件中包含的数据 —“可以扩大”属性和“可以缩小”属性。“可以扩大”属性指示 Access 在打印或预览时是否垂直扩大控件以显示控件中的所有数据。“可以缩小”属性指示 Access 在打印或预览时是否垂直缩小控件以删除空白区域。可以为文本框控件、窗体和报表节、子窗体控件和子报表控件设置“可以扩大”和“可以缩小”属性。 

要删除空行,可以将一行上每个文本框的“可以缩小”属性都设置为“是”。关键是要记住以下内容:Access 垂直缩小控件,因此,限制文本框的整个垂直区域必须为空。这就意味着如果一行上有几个控件,则这些控件必须都为空,Access 才能自动删除这些空间。

对文本框使用“可以缩小”属性

“可以缩小”属性的默认设置为“否”,因此控件不能缩小,除非将该设置更改为“是”。如果还希望报表节缩小,则必须也将报表节的“可以缩小”属性设置为“是”

要确保应该为空的所有控件确实为空,则必须构建控件来源表达式,以便在没有要分隔或添加标点的数据时,省略用于分隔的逗号和标点。建议首先使用这种方法,因为散乱的逗号会影响报表的外观。例如,假定要在一行上的“城市”、“地区”和“邮政编码”字段中包含值,并在城市后面有一个逗号。请考虑以下示例控件来源。 


=Trim([城市] & (", " + [地区]) & " " & [邮政编码])

该示例假定“城市”字段始终包含数据,但是“地区”字段不一定包含。仅在存在地区的数据时,该表达式才在城市后面添加逗号;否则插入一个空格。以下部分很关键。


(", " + [地区])

产生这种效果是因为合并字符串时使用的是 + 运算符而不是 &,这会导致 Access 执行所谓的“Null 传播”。这意味着如果表达式的任何部分包含空值,则整个表达式为空值,并且会删除逗号。因此,如果 [地区] 包含空值,则将括在括号中的全部内容视为空值,并且会删除逗号。这样,在“地区”字段中的值为空时,就可以防止插入散乱的逗号,有助于确保在所有字段都不包含数据时是一个空白行。如果将“可以缩小”设置为“是”,则 Access 可以删除该空白行。

请注意,仅在“地区”字段由于缺少值而导致包含空值时,才会出现这种效果。如果将该字段的“允许空字符串”属性设置为“是”以允许在字段中存在空字符串(通常不建议这样做),则需要对控件来源使用一个不同的表达式,如下面的示例所示:


=Trim([城市] & IIf([地区] Is Null Or [地区]="",
" ",", " & [地区] & " ") & [邮政编码])

此表达式使用 IIf 函数确定 [地区] 是否为空,并由此确定是否需要逗号。

尝试创建可根据需要垂直收缩的控件时,请牢记以下几点:

  • 如果控件以任何方式在其垂直边界内重叠,即使只有一个像素重叠,这些控件也不会收缩,除非它们都为空。
  • 控件之间的空白区域不受“可以缩小”属性的影响。这意味着如果在控件之间存在垂直区域,则即使在周围的控件缩小之后,该区域依然存在。
  • 位于页面页眉节或页面页脚节中的控件可以缩小。然而,这些节本身并不具有“可以缩小”属性,因此页面页眉节和页面页脚节无法缩小。

控件重叠时

如果另一个控件(如包含徽标的固定图形对象)与文本框控件使用的垂直区域重叠,则使用“可以缩小”属性不起作用。在这种情况下,无法使整个垂直行为空,因此不能依靠 Access 自动执行该操作。此时,您可以自己执行缩小操作。为此,请对整个行块使用单个文本框,然后使用 CanShrinkLines 函数合并行的内容,如下所示。例如,考虑对文本框使用以下控件来源:


=CanShrinkLines([名称],[地址1],[地址2],
Trim([城市]) & (", " + [地区]) & " " & [邮政编码],[国家/地区])

下面显示的自定义函数 CanShrinkLines 自动为每个参数创建一行,该参数为空或空值时除外。通过忽略为空或空值的参数,该函数自动删除不需要的行。每行向该函数传递一个参数或表达式,使用逗号分隔。如果某个字段为空,则忽略该字段,后面的字段上移一行。


Public Function CanShrinkLines(ParamArray arrLines())
' Pass this function the lines to be combined
' For example: strAddress =
' CanShrinkLines(Name, Address1, Address2, City, St, Zip)
Dim x As Integer, strLine As String
  For x = 0 To UBound(arrLines)
    If Not IsNull(arrLines(x)) And arrLines(x) <> "" Then
      strLine = strLine & arrLines(x) & vbCrLf
    End If
  Next
  CanShrinkLines = strLine
End Function

CanShrinkLines 函数的作用是通过测试参数数组中的每个参数来确定它为空值还是等于空字符串 ("")。从技术角度来看,空值和空字符串不一样,因为空值表示不存在数据,而空字符串表示存在空字符串形式的数据。在此处,其中任一项都生成要用来删除的空行。

如果参数为空或空字符串,则该函数通过使用 VBA 常量 vbCrLf 追加一个回车和换行符来创建一行,然后将该行追加到任何现有的行。这样就最终形成一个由多个行组成的长字符串,其中的任一行都不为空。

创建函数

要自己创建 CanShrinkLines 函数,请启动 Access 并按照下列步骤操作:

  1. “文件”菜单上,单击“打开”,浏览到要在其中插入函数的数据库,然后双击该文件将其打开。
  2. 在“数据库”窗口中,单击“模块”
  3. 单击“新建”以创建一个新模块。
  4. 在“代码”窗口中,完全按照本文中上面所示键入 CanShrinkLines 函数。
  5. “文件”菜单上,单击“保存”
  6. 键入模块名称,如 MainModule,然后按 Enter。
  7. “调试”菜单上,单击“编译”
  8. “文件”菜单上,单击“关闭并返回到 Microsoft Office Access”

在数据库中创建函数之后,可以在 Access 对象(如窗体和报表)中使用该函数。

在报表中使用函数

使用 CanShrinkLines 函数很简单。假设您要创建一些公司地址标签,其左侧包含徽标,右侧包含地址。因为徽标将与地址的区域重叠,所以不能依靠单独使用“可以缩小”属性,而应该为地址创建一个文本框,并将“控件来源”属性更改为以下内容:


=CanShrinkLines([公司名称],[联系人职称],[地址1],
[地址2],Trim([城市]) & (", "+[地区]) & " " & [邮政编码],[国家/地区])

报表的设计和生成的标签可能如下所示:

“设计”视图中的标签和打印结果

评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-5-30 12:24 , Processed in 0.052988 second(s), 14 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

返回顶部