Access多条件格式研究笔记(上)

2023-05-16

之前见过论坛好几个帖子讨论过超过三个的条件格式,当时因为没有用过条件格式(通常遇到类似需求我就直接用VBA写代码了……),所以也无法加入讨论,但是开始留意条件这个这个功能。适逢周末有点空闲,就专门对多条件格式这个问题做了一下研究。

一、准备工作

  首先是熟悉和使用了一下条件格式,并实际应用了一下,感觉还不错,添加条件格式的窗口限制使用至多三个条件格式。条件格式可以设定的格式有:粗体,斜体,禁用,下划线,字体色,背景色,条件分三种类型,参数根据条件类型需要,可以有1-2个。

二、了解条件格式的数据对象

  既然想要突破三个条件格式,而微软又不允许超过三个,在条件格式的编辑窗口中被禁用了,那么我们是不是有可能自己在内存中添加更多的条件格式呢?

  首先想到的是找到条件格式的对象,于是我们新建了一个窗体,在上面添加了一个带条件格式的文本框,命名为Text0,打开VBA环境,在监视窗口中添加:Application.Forms(0).Text0,所有过程,所有模块。

  展开Text0的成员后,我们发现了一个成员“FormatConditions”,没错,就是他了!让我们展开这个成员,看看他的内部结构,展开后发现,好像是一个集合,既然是集合,那我们能不能用常规的集合成员添加方法Add来添加超过三个呢?同时我们注意到了FormatConditions的类型是“FormatConditions”。

  于是我们按F2打开对象浏览器。在对象浏览器中找到了FormatConditions这个集合,我们赫然看到,在成员中有个名为Add的方法。让我们来看看Add的声明:

Function Add(Type As AcFormatConditionType, [Operator As AcFormatConditionOperator = acBetween], [Expression1], [Expression2]) As FormatCondition

  OK!我们这就来动手试试看添加超过一下,我们新建一个模块,加入以下代码:

Option Compare Database
Option Explicit

Public Sub TestAdd()
    Dim FCs As Access.FormatConditions
    Set FCs = Application.Forms(0).Text0.FormatConditions

    FCs.Delete
    FCs.Add acFieldValue, acEqual, "=1"
    FCs.Add acFieldValue, acEqual, "=1"
    FCs.Add acFieldValue, acEqual, "=1"
    FCs.Add acFieldValue, acEqual, "=1"
End Sub

  让我们来运行一下,Access报如下错误:

运行时错误'7966'
您指定的格式条件号大于格式条件数


  点击调试按钮,我们看到程序挂起在第四个Add方法上,看来Microsoft的程序员没偷懒,这道门也被封了。

三、强制修改窗体

  看来当窗体被载入内存后,想要代码添加条件格式是不可能了,那么载入内存以前呢?是不是那个程序员也没偷懒呢?我们这就来尝试一下修改窗体。

  用Access来修改显然不现实,那我们就手工改,前面的帖子中,我曾经介绍过,用户窗体可以导出为.frm文件,但是Access窗体好像没这个功能,我们在工程资源窗口选择导出,结果把窗体导出成了一个.cls的类文件,里面只有窗体代码,没有窗体的设计。

  这时候我们想到了Access有两个未公开的函数,就是SaveAsText和LoadFromText。我们这就来试试看。

  打开立即窗口,在里面输入:

Application.SaveAsText acForm ,"窗体1","C:/1.frm"

  打开导出的文件,哈哈,果然是.frm格式,赶快找条件格式。在Text0定义段中,我们看到了以下内容:

ConditionalFormat = Begin
    0x0100000066000000010000000000000002000000000000000200000001010000 ,
    0xff000000c0c0c000000000000000000000000000000000000000000000000000 ,
    0x0000000000000000000000000000000000000000000000000000000000000000 ,
    0x310000000000
End

  我倒!怎么是二进制代码?该死的M$……没办法,分析二进制代码格式吧……

  经过半个小时的苦战……终于解读出二进制数据的全部格式:


0:(4Bytes) FC头
4:(4Bytes) nSize
8:(4Bytes) fcCount


    0:(4Bytes) AcFormatConditionType
    4:(4Bytes) AcFormatConditionOperator
    8:(4Bytes) pOffsetExpr1
    12:(4Bytes) pOffsetExpr2
    16:(1Byte) bEnabled
    17:(1Byte) bBold
    18:(1Byte) bItalic
    19:(1Byte) bUnderline
    20:(4Bytes) rgbsForeColor
    24:(4Bytes) rgbsBackColor
  
Strings(n) Unicode

  OK!现在让我们来自己手工写出第四个条件格式来:

ConditionalFormat = Begin
    0x010000009C000000040000000000000000000000000000000200000001010101 ,
    0x00000000ffffff00000000000000000004000000060000000101010100000000 ,
    0xffffff000000000000000000080000000a0000000101010100000000ffffff00 ,
    0x00000000000000000b0000000d0000000101010100000000ffffff0031000000 ,
    0x32000000310000003200000031000000320000003100000032000000
End

  (下面要做的工作我们需要随时保存,因为我们正在使用未经认证的数据,很有可能会导致Access崩溃)

  我们通过手工写出了四个条件格式的二进制存储数据,现在把他覆盖到.frm文件对应位置去。然后我们回到立即窗口,输入以下代码:

Application.LoadFromText acForm ,"窗体2","C:/1.frm"


  导入成功!我们把修改过的窗体加载为了“窗体2”。然后我们在设计模式下打开窗体二,选择Text0查看条件格式。天哪!条件格式窗口的控件都错位了,根本没法正常查看,明显的数据越界错误。

  罢了,惹不起,不看了。直接运行窗体……

  Access在数秒停顿后,终于被错误关闭了。

  Mission Failed ...

4、结束语

  通过各种途径的测试,我们已经可以肯定,在内存中,FormatCondition并不是一个变长的数据存储结构,仅仅通过界面来控制条件格式的数量。而是只有三条数据的存储空间,因此在一个TextBox控件中,是不可能通过设定方式来实现多个条件的。

5、后记

  虽然多条件格式从设计上而言,无法从数据角度来进行扩展,但是这并不意味着没有其他变通的方法,至少我们还有VBA。在本文的下篇中,将详细讲述多条件格式的实现。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Access多条件格式研究笔记(上) 的相关文章

随机推荐

  • 题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。

    题目 xff1a 输入一行字符 xff0c 分别统计出其中英文字母 空格 数字和其它字符的个数 1 程序分析 xff1a 利用 while 语句 条件为输入的字符不为 39 n 39 2 程序源代码 xff1a include lt std
  • 使用Kolla-Ansible部署OpenStack环境部署

    部署环境 角色机器名IP 系统 计算节点 OpenStackControl ens3 172 28 191 99 ens4 192 168 1 156 CentOS8 3控制节点OpenStackCompute ens3 172 28 19
  • Vmware虚拟机汇总整理

    目录 一 vmware安装 xff1a 1 安装vmware软件 xff1a xff08 1 xff09 下载软件包 xff1a xff08 2 xff09 执行安装程序 xff1a 2 设置vmware默认安装路径 xff1a 3 设置v
  • VB中实现延时(等待)的几种方法

    在程序流程中经常要延时一段时间后再继续往下执行 在VB中常用的有以下几种方法 因为Timer控件打乱了程序的流程所以一般不用它 1 使用Windows API函数Sleep 新建一个工程 添加一个TextBox控件和一个CommandBut
  • Ubuntu上CUDNN下载及安装过程详细介绍

    前言 显卡驱动以及CUDA安装好后 xff08 https blog csdn net avideointerfaces article details 100558457 xff09 xff0c 就可以根据cuda的版本以及平台类型 xf
  • 苹果开发者账号续费不成功?提示你的支付授权失败?看这里...

    苹果开发者账号续费失败 xff0c 提示 xff1a 你的支付授权失败 请核对你的信息并重试 或尝试其他支付方式 请联系你的银行了 公司开发者账号即将到期 xff0c 一年一度续费的重任又落到我肩膀上了 xff0c 那么我们就进入正题吧 一
  • WPF 开发 —— 几何图形(PathGeometry)

    参考资料 xff1a WPF 2D绘图 3 PathGeometry WPF 2D绘图 2 Geometry WPF 2D绘图 1 Shape WPF Geometry Transformation Tool
  • C++ 求三个数的乘积

    编程实现输入任意三个整数a b c xff0c 将这三个数的乘积输出 xff1b Input 三个整数 xff0c 每个数字空格隔开 分别表示a b c三个变量的值 xff08 1 lt a lt 100 1 lt b lt 1000 1
  • 中文Cookie导致Session丢失的问题

    在网络上 xff0c 已经有无数的文章讨论Session丢失问题 xff0c 其中的原因有非常多的种类 xff0c 在此不再赘述 下面我们描述一种特殊的Session丢失现象 xff1a 1 在绝大多数客户端上 xff0c Session都
  • Access.Image Decoder

    版本 xff1a V0 41 系统要求 xff1a Access 2000及以上版本 软件介绍 xff1a Access中的Image控件将所有图形数据保存在PictureData属性数组中 xff0c 通过修改PictureData xf
  • 直接粘贴剪贴版的位图数据到Image控件

    调用范例 xff1a Private Sub Command1 Click PasteToImage Me Image0 End Sub 模块段代码 xff1a Option Compare Database Option Explicit
  • Access.Image BMP图像高速切割函数

    本函数可以在你自己的程序中调用 xff0c 从已有BMP中切割任意一个矩形块 使用本函数 xff0c 即使你对BMP格式一窍不通 xff0c 也可以在自己的程序中自由地切割BMP xff08 比方说拼图游戏程序 xff09 附件包含 xff
  • 优化Microsoft Access提高速度

    压缩 压缩 要保证经常性的压缩你的程序代码 当你在开发和使用Microsoft Access数据库时 xff0c 你要经常性地增加和删除数据 代码等等 现在的问题是Microsoft Access并不能有效地释放已分配的但被删除的对象空间
  • LINUX Shell 下求两个文件交集和差集的办法

    假设两个文件FILE1和FILE2用集合A和B表示 xff0c FILE1内容如下 xff1a a b c e d a FILE2内容如下 xff1a c d a c 基本上有两个方法 xff0c 一个是comm命令 xff0c 一个是gr
  • 安装ensp 图文详解(超详细)

    文章目录 ensp的详细安装步骤 xff1a 分享安装包 xff08 在下载ensp之前需要安装好该三个应用 xff09 Virtualbox下载地址 xff1a https www virtualbox org wireshark下载 h
  • Microsoft Access秘密、技巧和陷阱

    摘要 这篇文章概括了当使用Microsoft Access 时 xff0c 通过使用Access Basic可以增加应用程序的执行速度 xff0c 减少编码量 xff0c 同时也减少在为Microsoft Windows应用程序接口编程时
  • 浅析Windows编程的剪贴板机制

    摘要 xff1a 本文对Windows剪贴板机制作了深入 全面的阐述 xff0c 具体内容包括 xff1a 文本 位图 DSP 自定义格式剪贴板的使用和多数据项和延迟提交技术 关键词 xff1a VC 43 43 6 0 xff1b 剪贴板
  • Matthew Curland的VB函数指针调用

    Matthew Curland简介 xff1a Visual Studio开发小组成员 xff0c 参与开发了VB的IntelliSense和Object Browser 他是VB资深专家 xff0c 对VB有非常深入的研究 xff0c 堪
  • Access中神秘的Criteria(上)

    看到这个标题 xff0c 很多读者可能会迷惑 xff0c 什么是Criteria xff1f 我用了这么久Access xff0c 怎么从来没听说国 我猜想很多读者都是怀着好奇的心情点击的这个主题 但是也许你不知道 xff0c Access
  • Access多条件格式研究笔记(上)

    之前见过论坛好几个帖子讨论过超过三个的条件格式 xff0c 当时因为没有用过条件格式 xff08 通常遇到类似需求我就直接用VBA写代码了 xff09 xff0c 所以也无法加入讨论 xff0c 但是开始留意条件这个这个功能 适逢周末有点空