设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

12下一页
返回列表 发新帖
查看: 4292|回复: 11
打印 上一主题 下一主题

[Access本身] 【原创 / 文章】Access多条件格式研究笔记(上)

[复制链接]
跳转到指定楼层
1#
发表于 2005-8-29 02:50:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
之前见过论坛好几个帖子讨论过超过三个的条件格式,当时因为没有用过条件格式(通常遇到类似需求我就直接用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$……没办法,分析二进制代码格式吧……

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

04Bytes) FC头

44Bytes) nSize

84Bytes) 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!现在让我们来自己手工写出第四个条件格式来:

<DIV class=quote>ConditionalFormat = Begin

    0x010000009C000000040000000000000000000000000000000200000001010101 ,

    0x00000000ffffff000000000000000000040000
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 分享淘帖 订阅订阅
2#
发表于 2005-8-29 06:10:00 | 只看该作者
佩服 [em02]

点击这里给我发消息

3#
发表于 2005-8-29 10:05:00 | 只看该作者
很不错 ,我以前也做过类似的尝试, 从这个文件可看到微软不少的心思.

http://www.office-cn.net/Article/Class5/Class21/200312/262.html

可再试试像 Charset解决繁简问题  嵌入的图像格式导出嵌入的文件等,这样来实现更多的一些功能

4#
发表于 2005-8-29 17:10:00 | 只看该作者
很好这样好的程序员思路值得学习同时非常感谢无私奉献LucasLynn
5#
 楼主| 发表于 2005-8-29 23:57:00 | 只看该作者
以下是引用tmtony在2005-8-29 2:05:00的发言:

很不错 ,我以前也做过类似的尝试, 从这个文件可看到微软不少的心思.

http://www.office-cn.net/Article/Class5/Class21/200312/262.html

可再试试像 Charset解决繁简问题  嵌入的图像格式导出嵌入的文件等,这样来实现更多的一些功能



嵌入的图像导出我发过源码了。

点击这里给我发消息

6#
发表于 2005-8-30 02:16:00 | 只看该作者
accessxp后在saveastext里加了CRC校验, 如果校验不对,偶尔会出现死机现象. 有两种方法,一种是转为2000格式生成,另一种是使用loadfromtext后,编绎所有模块,或随意加上一个窗体(可再删除它), 然后保存整个MDB.试试.
7#
发表于 2005-8-30 02:31:00 | 只看该作者
很欣赏LucasLynn将问题的解决过程记录下来的方法,因为对于编程人员来说,有时候解决方法的思路比结果还可贵。
8#
发表于 2006-8-24 14:52:00 | 只看该作者
如果多条件格式是可以轻松实现的,没道理微软会不做上去
9#
发表于 2006-10-7 07:56:00 | 只看该作者
高手啊.
10#
发表于 2009-10-24 11:57:44 | 只看该作者
学习下编程思路。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-29 02:17 , Processed in 0.101402 second(s), 34 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表