关于《未完满解决的问题,如能解决请使用评论》一文的网友评论如下

楼层:1    昵称:access911    时间:2004年2月8日0:40:00
Public Sub CreateDatabase(dbName As String) 
     sCnn = "Provider=Microsoft.Jet.OLEDB.4.0;Jet OLEDB:Engine Type=5;Data Source=" & dbName 
     cat.Create sCnn      
     Set tbl = New ADOX.Table 
     tbl.ParentCatalog = cat
     With tbl
     .Name = "tableName" 
     .Columns.Append "ID", adInteger 
     .Columns("ID").Properties("AutoIncrement").Value = True 
     .Columns.Append "aa", adDouble 
     .Columns("aa").Properties("NullAble") = True 
     .Columns("aa").Properties("Jet OLEDB:Allow Zero Length") = True       
     End With 
     catDB.Tables.Append tblNew(0) 
     Set catDB = Nothing 
END SUB 


搞定了,這樣就可以了.....
一定要這一句
tbl.ParentCatalog = cat
就ok 


另外要参考:
ParentCatalog 属性
      

指定表或列的父目录以访问提供者特有的属性。

设置和返回值

设置并返回 Catalog 对象。将 ParentCatalog 设置为打开的 Catalog,可允许在向 Catalog 集合追加表或列之前访问提供者特有的属性。

说明

某些数据提供者仅允许在创建时(向其 Catalog 集合中追加表或列时)写入提供者特有的属性值。要在向 Catalog 中追加这些对象之前访问这些属性,请先在 ParentCatalog 属性中指定 Catalog。

将表或列追加到非 ParentCatalog 的 Catalog 中时,将出现错误。

楼层:2    昵称:access911    时间:2004年3月4日23:14:00
关于内存溢出错误,有一个简单的解决方法,就是将文字以特定ANSI字符的编码方式编码后存储,比如URLENCODE、BASE64、RTF等编码方式
楼层:3    昵称:access911    时间:2004年6月24日16:21:00
Function adsfasdf()
    Dim Tbl As New ADOX.Table
    Dim Cat As New ADOX.Catalog
    Dim Col As New Column
    Dim pro
    On Error Resume Next
    Cat.ActiveConnection = CurrentProject.Connection
    'Tbl.ParentCatalog = Cat
    'Tbl.Name = "表1"
    Set Tbl = Cat.Tables("表1")
    Set Col = Tbl.Columns("dadf")
    Set pro = Col.Properties("Jet OLEDB:Compressed UNICODE strings")
    Debug.Print pro.Value
    pro.Value = False       '这行产生错误
    
    Debug.Print Err.Description
    '错误提示
    '多步 OLE DB 操作产生错误。如果可能,请检查每个 OLE DB 状态值。没有工作被完成。

    '如何纠正?

End Function

楼层:4    昵称:access911    时间:2004年7月4日14:08:00
关于《如何用 ADO 以及 ADOX 设置“必填”属性?》已经的到中国微软技术工程师的解答,解答如下(注意,中国微软技术工程师的解答并不是绝对正确的)

Q:
不好意思,我提问的目的是为了了解使用 ADO 来修改该属性为什么产生错误。而不是
为了用其他方式解决该问题,正如您所说的,我可以用DAO 来解决,也可以用 JET SQL
DDL 的WITH COMPRESSION 来解决。

但是我想了解,是否能够使用 ADO 来设置,或者还是我设置错误了。

您可能也已经看到了。

“有意思的是,我即使在表设计界面中将UNICODE 压缩改为否,这里的结果仍然是
TRUE”


A:
您的语句的用法是正确的,但是很遗憾的说:我们无法通过ADO来设置该属性。这是一个ADO已知的问题。所以说我们建议您通过DAO的方式去解决它:)


Q:
非常感谢您的回答。

如果说这是一个已知错误,能否帖出相关的 KB 的ID?


A:
这个错误并没有相应的KB来阐述,在内部的文档中有这样一段重现错误的代码可以与您一起分享
/////////////////////////
// Code
Dim conn As New ADOX.Catalog
Dim tbl As ADOX.Table
Dim p As ADOX.Property
Dim col As ADOX.Column

conn.ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\MyAcc2KDB;"
Set tbl = conn.Tables("MyTable")
Set col = tbl.Columns("TextField") // A Text Field 

For Each p In col.Properties
Debug.Print p.Name & ":" & p.Value & ":" & p.Type & ":" & p.Attributes
If p.Name = "Jet OLEDB:Allow Zero Length" Then
p.Value = True // This works
End If
bool = True
If p.Name = "Jet OLEDB:Compressed UNICODE Strings" Then
p.Value = True // Invalid Argument 0x80004005 
End If
Next
/////////////////////////

楼层:5    昵称:access911    时间:2004年7月25日11:56:00
全文本检索的应用(一) 
 
 
作者:allsky  来源:转载  加入时间:2003-6-6 Tvdown.Net 下载站
 
基本知识

1. SQL Server7 的 DeskTop 版中没有全文本检索。

2. 一个表只能有一个全文本检索。

3. 被检索的表必须有单列的唯一索引。

4. 全文本的索引存储在文件系统中,而非数据库中。

5. 更新全文本索引的过程比常规索引要耗时,而且也不象常规索引那样可以由数据库系统立即更新。

6. 全文本索引包含在全文本目录( Full-Text Catalog )中,每个数据库可以包含一个或多个目录,但一个目录不能属于多个数
据库。

7. 全文本检索只能在真正的表上创建,不能是视图,系统表,临时表。

8. 全文本检索会忽略某些噪音字( noise words),比如英文的 a,the,and,中文的'和','是'等等。

9. 如果在查询中包含 noise words ,就会引发错误,在应用程序中应去除这些 noise words。

启动全文本检索服务。

方法A:在企业管理器中打开 Support Services 文件夹,在 Full-Text Search 的右键菜单中选择 Start。

方法B:在 SQL Server Service Manager 的 Services 下拉列表中选择 Microsoft Search,并单击 Start/Continue 按
钮。

方法C:使用 net start mssearch 的命令行方式。

使用全文本检索向导( Full-Text Indexing Wizard )。

step1. 选择被检索的数据库,在 Tools 的菜单中,选择 Full-text Indexing,进入欢迎( Welcome )的屏幕,单击 next。

step2. 选择被检索的表,单击 next。

step3. 选择唯一索引,单击 next。

step4. 选择被索引的列,单击 Add,该列显示在右栏中。单击 next。

step5. 选择目录(选择已存在的目录,或创建新的目录),单击 next。

step6. 选择或创建 population schedule(可选项),单击 next。

step7. 单击 finish。

使用 SQL-DMO (以 VB 为例) 

step1. 在工程的引用中选择 Microsoft SQLDMO Object Library。

step2. 创建 SQLServer 对象。


Dim objSQL As New SQLDMO.SQLServer
objSQL.Connect "localhost", "sa", ""


step3. 创建新的目录,并加入到被索引的数据库目录中。

Dim objCatalog As New SQLDMO.FullTextCatalog

'使 pubs 为全文本检索的数据库
objSQL.Databases("pubs").EnableFullTextCatalogs

'创建新的目录
objCatalog.Name = "ftcPubsTest"

'将新目录加入到目录集合中
objSQL.Databases("pubs").FullTextCatalogs.Add objCatalog

step4. 在表上创建全文本索引。

Dim objTable As New SQLDMO.Table

'指定被索引的表
Set objTable = objSQL.Databases("pubs").Tables("authors")

'指定目录名和唯一索引名
objTable.FullTextCatalogName = "ftcPubsTest"
objTable.UniqueIndexForFullText = "UPKCL_auidind"
objTable.FullTextIndex = True

'指定被索引的列
objTable.Columns("au_lname").FullTextIndex = True
objTable.Columns("au_fname").FullTextIndex = True

'激活该表上的全文本索引
objTable.FullTextIndexActive = True

step5. 启动全文本目录


objCatalog.Start SQLDMOFullText_Full


使用存储过程

step1. 使 pubs 为全文本检索的数据库


USE Pubs
go
sp_fulltext_database 'enable'

step2. 创建新的目录


sp_fulltext_catalog 'ftcPubsTest','create'


step3. 指定被索引的表


sp_fulltext_table 'authors','create','ftcPubsTest','UPKCL_auidind'


step4. 指定被索引的列


sp_fulltext_column 'authors','au_lname','add'
sp_fulltext_column 'authors','au_fname','add'


step5. 激活该表上的全文本索引


sp_fulltext_table 'authors','activate'


step6. 启动全文本目录


sp_fulltext_catalog 'ftcPubsTest','start_full'
 
-----------------------------------------------------------------------------------

作者:allsky  来源:转载  加入时间:2003-6-6 Tvdown.Net 下载站
 
CONTAINS 语法

我们通常在 WHERE 子句中使用 CONTAINS ,就象这样:SELECT * FROM table_name WHERE CONTAINS
(fullText_column,'search contents')。

我们通过例子来学习,假设有表 students,其中的 address 是全文本检索的列。

1. 查询住址在北京的学生


SELECT student_id,student_name
FROM students
WHERE CONTAINS( address, 'beijing' )

remark: beijing是一个单词,要用单引号括起来。

2. 查询住址在河北省的学生


SELECT student_id,student_name
FROM students
WHERE CONTAINS( address, '"HEIBEI province"' )

remark: HEBEI province是一个词组,在单引号里还要用双引号括起来。

3. 查询住址在河北省或北京的学生


SELECT student_id,student_name
FROM students
WHERE CONTAINS( address, '"HEIBEI province" OR beijing' )

remark: 可以指定逻辑操作符(包括 AND ,AND NOT,OR )。

4. 查询有 '南京路' 字样的地址


SELECT student_id,student_name
FROM students
WHERE CONTAINS( address, 'nanjing NEAR road' )

remark: 上面的查询将返回包含 'nanjing road','nanjing east road','nanjing west road' 等字样的地址。
          A NEAR B,就表示条件: A 靠近 B。

5. 查询以 '湖' 开头的地址


SELECT student_id,student_name
FROM students
WHERE CONTAINS( address, '"hu*"' )

remark: 上面的查询将返回包含 'hubei','hunan' 等字样的地址。
          记住是 *,不是 %。

6. 类似加权的查询


SELECT student_id,student_name
FROM students
WHERE CONTAINS( address, 'ISABOUT (city weight (.8), county wright (.4))' )

remark: ISABOUT 是这种查询的关键字,weight 指定了一个介于 0~1之间的数,类似系数(我的理解)。表示不同条件有不同的侧
重。

7. 单词的多态查询


SELECT student_id,student_name
FROM students
WHERE CONTAINS( address, 'FORMSOF (INFLECTIONAL,street)' )

remark: 查询将返回包含 'street','streets'等字样的地址。
         对于动词将返回它的不同的时态,如:dry,将返回 dry,dried,drying 等等。
 
-----------------------------------------------------------------------------------------

全文本检索的应用(三) 
 
 
作者:allsky  来源:转载  加入时间:2003-6-6 Tvdown.Net 下载站
 
CONTAINSTABLE 语法

我们通常在 FROM 子句中使用 CONTAINSTABLE ,就象这样:SELECT * FROM table_name,CONTAINTABLE
(fulltext_table,fullText_column,'search condition') WHERE ......。

CONTAINSTABLE 在查询方式上与 CONTAINS 几乎一样,所以就不用赘述了。CONTAINSTABLE 返回的是符合查询条件的表,在 
SQL 语句中我们可以把它当作一个普通的表来使用。

我们看一个例子,比较这两种表的不同。


SELECT FT_TBL.student_name,FT_TBL.student_score,KEY_TBL.RANK
FROM report AS FT_TBL INNER JOIN
     CONTAINSTABLE( student,address,
     'ISABOUT (city weight (.8), county wright (.4))' ) AS KEY_TBL
     ON FT_TBL.student_id = KEY_TBL.[KEY]
ORDER BY KEY_TBL.RANK


CONTAINSTABLE 返回的表包含有特殊的两列:KEY,RANK。

在第一部分里我们就强调了:被全文索引的表必须有唯一索引。这个唯一的索引列在返回的表中就成为 KEY。我们通常把它作为表
连接的条件。

在某些网站搜索时,结果中会出现表示匹配程度的数字,RANK 与此类似。它的值在0~1000之间,标识每一行与查询条件的匹配程
度,程度越高,RANK 的值大,通常情况下,按照 RANK 的降序排列。

FREETEXT 语法

FREETEXT 与 CONTAINS 类似,只是没有 CONTAINS 的精度高。在 CONTAINS 中,对查询条件的写法有很多要求,而 FREETEXT 
就没有,可以是任意的单词,词组或句子。看下面的例子:


SELECT CategoryName
FROM Categories
WHERE FREETEXT (Description, 'sweetest candy bread and dry meat' )


FREETEXTTABLE 语法

和 CONTAINSTABLE 一样,FREETEXTTABLE 返回带有 KEY,RANK 的表。举例说明:


SELECT FT_TBL.CategoryName, 
    FT_TBL.Description,
    KEY_TBL.RANK
FROM Categories AS FT_TBL INNER JOIN
    FREETEXTTABLE(Categories, Description, 
    'sweetest candy bread and dry meat') AS KEY_TBL
    ON FT_TBL.CategoryID = KEY_TBL.[KEY]


在 ASP 中使用全文本检索

Dim cnn 
Dim rs
Dim strSQL

strSQL = "SELECT book_name " &_
         "FROM books " &_
         "WHERE CONTAINS( description, '" & Request("search_condition") & "' )"

Set cnn = Server.CreateObject("ADODB.Connection")
Set rs = Server.CreateObject("ADODB.RecordSet")

cnn.Open "provider=sqloledb;datasource=.;initial catalog=books;user id=sa;pasword=;"
rs.Open strSQL,cnn


上面的例子十分简单,仅为示意。只要掌握了 CONTAINS 和 CONTAINSTABLE 的语法,在使用上和一般的 ADO 查询一样。

楼层:6    昵称:access911    时间:2004年8月8日13:27:00
本站1年来关键字搜索排行榜

access: 324  
FLASH: 200  
自动编号: 170  
关系: 136  
TREEVIEW: 132  
Excel: 106  
密码: 106  
存储过程: 104  
导入: 104  
规格: 96  
加密: 90  
备份: 89  
链接: 89  
字串: 89  
图片: 83  
开发版: 82  
计算列: 79  
压缩: 77  
查询: 76  
报表: 73  
导出: 69  
日期: 67  
保留字: 65  
安全: 62  
ado: 59  
文本: 59  
sql: 58  
参数: 58  
字段: 58  
ole : 57  
打包: 57  
数据定义: 56  
事务: 55  
in 子句: 54  
MDAC: 53  
余额: 53  
主键: 53  
连接: 52  
图片 关系: 50  
重复: 50  
链接表: 47  
c/s: 46  
权限: 46  
MDE: 45  
随机: 45  
隐藏: 44  
菜单: 43  
记录: 41  
压缩 修复: 41  
word: 40  
80004: 39  
md5: 39  
ODBC: 39  
同义词: 39  
INSTALLSHIELD: 38  
update: 37  
删除: 36  
子窗体: 36  
shift: 35  
大小写: 34  
修复: 34  
分页: 33  
参数 查询: 32  
函数: 32  
数据库: 32  
体积: 32  
bt: 31  
insert: 31  
时间: 31  
access sql server: 30  
索引: 30  
系统表: 30  
复制: 29  
更新: 29  
默认值: 29  
%: 28  
create table: 28  
视图: 28  
行号: 28  
允许空: 28  
注册: 28  
组合框: 28  
datagrid: 27  
exe: 27  
大写: 27  
a: 26  
SWF: 26  
打印: 26  
四舍五入: 26  
opens: 25  
stream: 25  
备注: 25  
滚轮: 25  
远程: 25  
MSysObjects: 24  
窗体: 24  
数据类型: 24  
in: 23  
like: 23  
msde: 23  
步进: 23  
二进制: 23  
事务处理: 23  
数据: 23  
文件: 23  
d: 22  
参数查询: 22  
环境: 22  
库存: 22  
文本 文件: 22  
用api禁止鼠标滚轮: 22  
ASP: 21  
s: 21  
where: 21  
类型: 21  
adox: 20  
alter: 20  
必填: 20  
表: 20  
表名: 20  
命令行: 20  
asp 图片: 19  
NULL: 19  
runtime: 19  
建表: 19  
列表框: 19  
启动: 19  
信息: 19  
中级: 19  
字段类型: 19  
自动增加: 19  
create: 18  
default: 18  
错误: 18  
独占: 18  
jet: 17  
sql server: 17  
vba: 17  
查找: 17  
打开: 17  
交叉表: 17  
临时表: 17  
说明: 17  
主键 SQL: 17  
"create table": 16  
Alter table: 16  
chm: 16  
dao: 16  
ini: 16  
join: 16  
tree: 16  
编号: 16  
算法: 16  
用户: 16  
case: 15  
DISTINCT: 15  
in子句: 15  
ldb: 15  
office: 15  
replace: 15  
纪录: 15  
键: 15  
控件: 15  
列表: 15  
选项卡: 15  
引用: 15  
转换: 15  
dlookup: 14  
docmd: 14  
ListView: 14  
TXT: 14  
创建表: 14  
导入导出: 14  
概念: 14  
工作组: 14  
恢复: 14  
技巧: 14  
锁定: 14  
提示: 14  
新建: 14  
dbf: 13  
ftp: 13  
保存: 13  
创建: 13  
进销存: 13  
排序: 13  
替换: 13  
图: 13  
图标: 13  
新建 数据库: 13  
页小计: 13  
硬盘: 13  
字串 加密: 13  
自动: 13  
ACCESS开发版: 12  
insert into: 12  
instr: 12  
JET SQL: 12  
ORACLE: 12  
select: 12  
sum: 12  
表 存在: 12  
登陆 密码: 12  
关联: 12  
默认: 12  
外部: 12  
颜色: 12  
溢出: 12  
.ldb: 11  
comdlg: 11  
帮助: 11  
动态: 11  
计算: 11  
连接 字串: 11  
破解: 11  
鼠标: 11  
数据库与图片的关系如何处理?: 11  
所有 表: 11  
统计: 11  
文本框: 11  
新手来看: 11  
邮件: 11  
支票: 11  
追加: 11  
字符串: 11  
80004005: 10  
delete: 10  
msysobject: 10  
union: 10  
winsock: 10  
版本: 10  
编译: 10  
变量: 10  
存在: 10  
定义: 10  
对话框: 10  
发布: 10  
复杂 报表: 10  
宏: 10  
进度: 10  
拼音: 10  
日志: 10  
数据备份: 10  
所有表: 10  
图片554: 10  
序号: 10  
自动编号 删除: 10  
最大: 10  
count: 9  
delphi: 9  
dll: 9  
format: 9  
runsql: 9  
标题: 9  
表 信息: 9  
导: 9  
分辨率: 9  
公式: 9  
关闭: 9  
局域网: 9  
模糊查询: 9  
内存溢出 : 9  
任务栏: 9  
删除表: 9  
数据访问页: 9  
图像: 9  
新建 表: 9  
字段 信息: 9  
自定义函数: 9  
activex: 8  
api: 8  
CAPTION: 8  
create view: 8  
CurrentProject: 8  
date: 8  
dump: 8  
IME: 8  
isnull: 8  
MDW: 8  
mstsc: 8  
write conflict: 8  
保留: 8  
背景: 8  
标量: 8  
表 名: 8  
财务: 8  
传递: 8  
登录: 8  
多用户: 8  
更改 密码: 8  
汇总: 8  
剪贴板: 8  
进度条: 8  
连接字串: 8  
屏蔽: 8  
前辈: 8  
锁: 8  
网络: 8  
用户名: 8  
优化: 8  
注册表: 8  
4: 7  
5: 7  
adp: 7  
BOM: 7  
FULL JOIN: 7  
gif: 7  
guid: 7  
ID: 7  
IDENTITY: 7  
install: 7  
jro: 7  
office开发版: 7  
OpenSchema: 7  
r: 7  
sqlserver: 7  
TOOLBAR: 7  
查找文件: 7  
纯 ACCESS: 7  
赋值: 7  
格式: 7  
工资: 7  
共享: 7  
截取: 7  
进制: 7  
可更新: 7  
快捷: 7  
路径: 7  
内存不足: 7  
南京企业: 7  
批量: 7  
平均值: 7  
其他数据库: 7  
如何用sql查询获取表得信息: 7  
筛选: 7  
身份证: 7  
鼠标滚轮: 7  
同步: 7  
图表: 7  
文本文件: 7  
文件夹: 7  
下拉框: 7  
写冲突: 7  
信息 表: 7  
修改: 7  
压缩数据库: 7  
压缩修复: 7  
影响: 7  
运行 JET SQL: 7  
字段名: 7  
最后一条记录: 7  
"alter table": 6  
2003: 6  
800: 6  
8004: 6  
access911: 6  
Access的优点: 6  
CurrentProject对象和CodeProject对象的区别: 6  
exists: 6  
FALSH: 6  
fox: 6  
index: 6  
mac地址: 6  
MEMO: 6  
MS Jet SQL for Access 2000: 6  
recordset: 6  
TransferDatabase: 6  
transform: 6  
word.application: 6  
表结构: 6  
不能打开注册表关键字 : 6  
布尔: 6  
菜单: 6  
插入: 6  
当前记录: 6  
登陆: 6  
分析: 6  
个性: 6  
更改表名: 6  
合并: 6  
合计: 6  
技术: 6  
脚本: 6  
结构: 6  
金额: 6  
累计: 6  
连续: 6  
列: 6  
目录: 6  
内存: 6  
年龄: 6  
其他: 6  
上海: 6  
数组: 6  
所有记录中均未找到搜索关键字: 6  
添加记录: 6  
条形码: 6  
通讯: 6  
图书: 6  
文件名: 6  
销售: 6  
小数: 6  
新增: 6  
约束: 6  
注释: 6  
字段 类型: 6  
: 5  
*.*: 5  
@@IDENTITY : 5  
2000: 5  
aa: 5  
access excel: 5  
and: 5  
asf: 5  
BT : 5  
COMMDLG: 5  
datacombo: 5  
datediff: 5  
ddl: 5  
des: 5  
EXCEL ACCESS: 5  
excel 导入: 5  
findfirst: 5  
grid: 5  
iif: 5  
jsp: 5  
line: 5  
mda: 5  
mso: 5  
mso.exe: 5  
mysql: 5  
network connection may has been lost: 5  
OpenDatabase: 5  
outlook: 5  
PRIMARY KEY: 5  
Procedure: 5  
rar: 5  
RC4: 5  
relation: 5  
rnd: 5  
sql server access: 5  
sql 存储过程: 5  
sub: 5  
top: 5  
union all : 5  
vb: 5  
保护: 5  
仓库: 5  
查询 变量: 5  
出错: 5  
窗体 标题栏: 5  
创建 数据库: 5  
打印当前记录: 5  
大小: 5  
代码: 5  
代码注释器: 5  
当前: 5  
导入表: 5  
调用: 5  
反编译: 5  
服务器: 5  
复选框: 5  
工具栏: 5  
关机: 5  
关键字: 5  
交叉: 5  
金额大写: 5  
考勤: 5  
空: 5  
空字符串: 5  
类型转换: 5  
连接 字串 加密: 5  
连接数据库: 5  
两个数据库: 5  
乱码: 5  
人民币: 5  
删除文件: 5  
数据库窗口: 5  
刷新: 5  
搜索: 5  
速度: 5  
添加: 5  
添加用户: 5  
托盘: 5  
唯一: 5  
未知: 5  
下载: 5  
限制: 5  
新建数据库: 5  
学: 5  
页: 5  
邮件合并: 5  
粘贴: 5  
只读: 5  
周: 5  
逐渐: 5  
属性: 5  
字段数: 5  
字体: 5  
最大化: 5  
"alter table" add: 4  
access runtime: 4  
access sql: 4  
access to vb: 4  
access2000: 4  
access教程: 4  
Admin: 4  
ado 新建: 4  
AutoExec: 4  
b: 4  
comm : 4  
convert: 4  
cpu: 4  
create index: 4  
csv: 4  
database: 4  
datasource: 4  
decimal: 4  
dsum: 4  
email: 4  
EXECUTE : 4  
FileDialog: 4  
fso: 4  
if: 4  
internet: 4  
into: 4  
IP: 4  
java: 4  
JET DB: 4  
JET SQL 中级: 4  
jpg: 4  
list: 4  
mdb: 4  
mschart: 4  
my sql: 4  
notinlist: 4  
ODBC 注册: 4  
Office XP Developer: 4  
office*开发版: 4  
oledb: 4  
openrowset: 4  
outlook express: 4  
password: 4  
qa: 4  
query: 4  
RGB: 4  
run: 4  
runcommand: 4  
SELECT INTO: 4  
sheet: 4  
shell: 4  
sql语句: 4  
substr: 4  
t: 4  
time: 4  
timer: 4  
tran: 4  
VBA代码实现数据库压缩修复: 4  
view: 4  
xp: 4  
报表打印: 4  
比较: 4  
标签 菜单: 4  
拨号: 4  
参数传递: 4  
仓库管理: 4  
撤消: 4  
成本: 4  
储存过程: 4  
窗口: 4  
存储: 4  
打开文件: 4  
大小写转换: 4  
导出 文本: 4  
导出: 4  
导入 EXCEL: 4  
导入 文本: 4  
的: 4  
对象: 4  
多条件查询: 4  
复杂: 4  
改名: 4  
更改 字段名: 4  
更改密码: 4  
关闭 计算机: 4  
关于如何生成随机记录: 4  
过程: 4  
还: 4  
环境变量: 4  
机器名: 4  
解密: 4  
禁止滚轮: 4  
警告: 4  
开发: 4  
连接表: 4  
连接字符串: 4  
名次: 4  
命令按钮: 4  
判断: 4  
屏蔽 F11: 4  
其他 数据库: 4  
求和: 4  
人事: 4  
任意: 4  
日记帐: 4  
如何连接加密数据库: 4  
入门: 4  
上传: 4  
升级: 4  
实例: 4  
树: 4  
数据 定义 查询: 4  
数据 类型: 4  
数据表: 4  
数据源: 4  
数字: 4  
条件: 4  
通信: 4  
通用界面: 4  
退出: 4  
网页: 4  
网站: 4  
位操作: 4  
文档: 4  
无聊: 4  
系统时间: 4  
下拉: 4  
新增记录: 4  
性能: 4  
修改表: 4  
选择: 4  
学习: 4  
压缩: 4  
引号: 4  
隐藏: 4  
隐藏Access主窗口: 4  
用纯ASP代码实现图片上传并存入数据库中 : 4  
原材料仓库管理软件: 4  
月: 4  
运行时: 4  
再论 Access 应用程序的打包: 4  
增加 字段: 4  
找不到可安装的 ISAM: 4  
重复记录: 4  
重命名: 4  
主健: 4  
追加查询: 4  
字段 属性: 4  
字段属性: 4  
自动更新: 4  
自动构建查询: 4  
自动填充: 4  
最小化: 4  

楼层:7    昵称:access911    时间:2005年4月5日16:39:00
EXCEL 中的 IS 类函数
全部显示

IS 类函数
 
请参阅

本部分描述了用来检验数值或引用类型的九个工作表函数。

这些函数,概括为 IS 类函数,可以检验数值的类型并根据参数取值返回 TRUE 或 FALSE。例如,如果数值为对空白单元格的引用,函数 ISBLANK 返回逻辑值 TRUE,否则返回 FALSE。

语法

ISBLANK(value)
ISERR(value)
ISERROR(value)
ISLOGICAL(value)
ISNA(value)
ISNONTEXT(value)
ISNUMBER(value)
ISREF(value)
ISTEXT(value)

Value    为需要进行检验的数值。分别为:空白(空白单元格)、错误值、逻辑值、文本、数字、引用值或对于以上任意参数的名称引用。

函数 如果为下面的内容,则返回 TRUE 

ISBLANK 值为空白单元格。 
ISERR 值为任意错误值(除去 #N/A)。 
ISERROR 值为任意错误值(#N/A、#VALUE!、#REF!、#DIV/0!、#NUM!、#NAME? 或 #NULL!)。 
ISLOGICAL 值为逻辑值。 
ISNA 值为错误值 #N/A(值不存在)。 
ISNONTEXT 值为不是文本的任意项(注意此函数在值为空白单元格时返回 TRUE)。 
ISNUMBER 值为数字。 
ISREF 值为引用。 
ISTEXT 值为文本。 

说明
IS 类函数的参数 value 是不可转换的。例如,在其他大多数需要数字的函数中,文本值“19”会被转换成数字 19。然而在公式 ISNUMBER("19") 中,“19”并不由文本值转换成别的类型的值,函数 ISNUMBER 返回 FALSE。 
IS 类函数在用公式检验计算结果时十分有用。当它与函数 IF 结合在一起使用时,可以提供一种方法用来在公式中查出错误值(请参阅下面的示例)。 
示例 1

如果您将示例复制到空白工作表中,可能会更易于理解该示例。

操作方法

创建空白工作簿或工作表。 
请在“帮助”主题中选取示例。不要选取行或列标题。 


从帮助中选取示例。

按 Ctrl+C。 
在工作表中,选中单元格 A1,再按 Ctrl+V。 
若要在查看结果和查看返回结果的公式之间切换,请按 Ctrl+`(重音符),或在“工具”菜单上,指向“公式审核”,再单击“公式审核模式”。 
   




 A B 
公式 说明(结果) 
=ISLOGICAL(TRUE) 检查 TRUE 是否为逻辑值 (TRUE) 
=ISLOGICAL("TRUE") 检查 TRUE 是否为逻辑值 (FALSE) 
=ISNUMBER(4) 检查 4 是否为数值 (TRUE) 
 

示例 2

如果您将示例复制到空白工作表中,可能会更易于理解该示例。

操作方法

创建空白工作簿或工作表。 
请在“帮助”主题中选取示例。不要选取行或列标题。 


从帮助中选取示例。

按 Ctrl+C。 
在工作表中,选中单元格 A1,再按 Ctrl+V。 
若要在查看结果和查看返回结果的公式之间切换,请按 Ctrl+`(重音符),或在“工具”菜单上,指向“公式审核”,再单击“公式审核模式”。 
   






 A 
数据 
Gold 
Region1 
#REF! 
330.92 
#N/A 
公式 说明(结果) 
=ISBLANK(A2) 检查单元格 C2 是否为空白 (FALSE) 
=ISERROR(A4) 检查 #REF! 是否为错误值 (TRUE) 
=ISNA(A4) 检查 #REF! 是否为错误值 #N/A (FALSE) 
=ISNA(A6) 检查 #N/A 是否为错误值 #N/A (TRUE) 
=ISERR(A6) 检查 #N/A 是否为错误值 (FALSE) 
=ISNUMBER(A5) 检查 330.92 是否为数值 (TRUE) 
=ISTEXT(A3) 检查 Region1 是否为文本 (TRUE) 
 

楼层:8    昵称:access911    时间:2005年7月15日20:10:00
 VB计算农历的算法     选择自 feng_sundy 的 Blog  
关键字   VB计算农历的算法 
出处    
 
 '下面是一个关于VB的农历算法  


'日期数据定义方法如下 

'前12个字节代表1-12月为大月或是小月,1为大月30天,0为小月29天, 

'第13位为闰月的情况,1为大月30天,0为小月29天,第14位为闰月的月 

'份,如果不是闰月为0,否则给出月份,10、11、12分别用A、B、C来表 

'示,即使用16进制。最后4位为当年家农历新年-即农历1月1日所在公历 

'的日期,如0131代表1月31日。 

'GetYLDate函数使用方式如下tYear为要输入的年,tMonth为月,tDay为 

'日期,YLyear是返回值,返加农历的年份,如甲子年,YLShuXing返回 

'的是属象,如鼠。IsGetGl是设置是不是通过农历取公历值,如果是, 

'前三个返回相应的公历日期,而且返回值是一个公历日期。 


Function GetYLDate(tYear As Integer, tMonth As Integer, tDay As Integer, _ 

          YLyear As String, YLShuXing As String, _ 

          Optional IsGetGl As Boolean) As String 


  On Error Resume Next 

  Dim daList(1900 To 2011) As String * 18 

  Dim conDate As Date, setDate As Date 

  Dim AddMonth As Integer, AddDay As Integer, AddYear As Integer, getDay As Integer 

  Dim RunYue As Boolean 

  If tYear > 2010 Or tYear < 1901 Then Exit Function '如果不是有效有日期,退出 

  '1900 to 1909 

  daList(1900) = "010010110110180131" 

  daList(1901) = "010010101110000219" 

  daList(1902) = "101001010111000208" 

  daList(1903) = "010100100110150129" 

  daList(1904) = "110100100110000216" 

  daList(1905) = "110110010101000204" 

  daList(1906) = "011010101010140125" 

  daList(1907) = "010101101010000213" 

  daList(1908) = "100110101101000202" 

  daList(1909) = "010010101110120122" 

  daList(1910) = "010010101110000210" 

  daList(1911) = "101001001101160130" 

  daList(1912) = "101001001101000218" 

  daList(1913) = "110100100101000206" 

  daList(1914) = "110101010100150126" 

  daList(1915) = "101101010101000214" 

  daList(1916) = "010101101010000204" 

  daList(1917) = "100101101101020123" 

  daList(1918) = "100101011011000211" 

  daList(1919) = "010010011011170201" 

  daList(1920) = "010010011011000220" 

  daList(1921) = "101001001011000208" 

  daList(1922) = "101100100101150128" 

  daList(1923) = "011010100101000216" 

  daList(1924) = "011011010100000205" 

  daList(1925) = "101011011010140124" 

  daList(1926) = "001010110110000213" 

  daList(1927) = "100101010111000202" 

  daList(1928) = "010010010111120123" 

  daList(1929) = "010010010111000210" 

  daList(1930) = "011001001011060130" 

  daList(1931) = "110101001010000217" 

  daList(1932) = "111010100101000206" 

  daList(1933) = "011011010100150126" 

  daList(1934) = "010110101101000214" 

  daList(1935) = "001010110110000204" 

  daList(1936) = "100100110111030124" 

  daList(1937) = "100100101110000211" 

  daList(1938) = "110010010110170131" 

  daList(1939) = "110010010101000219" 

  daList(1940) = "110101001010000208" 

  daList(1941) = "110110100101060127" 

  daList(1942) = "101101010101000215" 

  daList(1943) = "010101101010000205" 

  daList(1944) = "101010101101140125" 

  daList(1945) = "001001011101000213" 

  daList(1946) = "100100101101000202" 

  daList(1947) = "110010010101120122" 

  daList(1948) = "101010010101000210" 

  daList(1949) = "101101001010170129" 

  daList(1950) = "011011001010000217" 

  daList(1951) = "101101010101000206" 

  daList(1952) = "010101011010150127" 

  daList(1953) = "010011011010000214" 

  daList(1954) = "101001011011000203" 

  daList(1955) = "010100101011130124" 

  daList(1956) = "010100101011000212" 

  daList(1957) = "101010010101080131" 

  daList(1958) = "111010010101000218" 

  daList(1959) = "011010101010000208" 

  daList(1960) = "101011010101060128" 

  daList(1961) = "101010110101000215" 

  daList(1962) = "010010110110000205" 

  daList(1963) = "101001010111040125" 

  daList(1964) = "101001010111000213" 

  daList(1965) = "010100100110000202" 

  daList(1966) = "111010010011030121" 

  daList(1967) = "110110010101000209" 

  daList(1968) = "010110101010170130" 

  daList(1969) = "010101101010000217" 

  daList(1970) = "100101101101000206" 

  daList(1971) = "010010101110150127" 

  daList(1972) = "010010101101000215" 

  daList(1973) = "101001001101000203" 

  daList(1974) = "110100100110140123" 

  daList(1975) = "110100100101000211" 

  daList(1976) = "110101010010180131" 

  daList(1977) = "101101010100000218" 

  daList(1978) = "101101101010000207" 

  daList(1979) = "100101101101060128" 

  daList(1980) = "100101011011000216" 

  daList(1981) = "010010011011000205" 

  daList(1982) = "101001001011140125" 

  daList(1983) = "101001001011000213" 

  daList(1984) = "1011001001011A0202" 

  daList(1985) = "011010100101000220" 

  daList(1986) = "011011010100000209" 

  daList(1987) = "101011011010060129" 

  daList(1988) = "101010110110000217" 

  daList(1989) = "100100110111000206" 

  daList(1990) = "010010010111150127" 

  daList(1991) = "010010010111000215" 

  daList(1992) = "011001001011000204" 

  daList(1993) = "011010100101030123" 

  daList(1994) = "111010100101000210" 

  daList(1995) = "011010110010180131" 

  daList(1996) = "010110101100000219" 

  daList(1997) = "101010110110000207" 

  daList(1998) = "100100110110150128" 

  daList(1999) = "100100101110000216" 

  daList(2000) = "110010010110000205" 

  daList(2001) = "110101001010140124" 

  daList(2002) = "110101001010000212" 

  daList(2003) = "110110100101000201" 

  daList(2004) = "010110101010120122" 

  daList(2005) = "010101101010000209" 

  daList(2006) = "101010101101170129" 

  daList(2007) = "001001011101000218" 

  daList(2008) = "100100101101000207" 

  daList(2009) = "110010010101150126" 

  daList(2010) = "101010010101000214" 

  daList(2011) = "101101001010000214" 

  AddYear = tYear 

  RunYue = False 

   

  If IsGetGl Then 

    AddMonth = Val(Mid(daList(AddYear), 15, 2)) 

    AddDay = Val(Mid(daList(AddYear), 17, 2)) 

    conDate = DateSerial(AddYear, AddMonth, AddDay) 

    AddDay = tDay 

    For i = 1 To tMonth - 1 

      AddDay = AddDay + 29 + Val(Mid(daList(tYear), i, 1)) 

    Next i 

    'MsgBox DateDiff("d", conDate, Date) 

    setDate = DateAdd("d", AddDay - 1, conDate) 

    GetYLDate = setDate 

    tYear = Year(setDate) 

    tMonth = Month(setDate) 

    tDay = Day(setDate) 

    Exit Function 

  End If 

CHUSHIHUA: 

  AddMonth = Val(Mid(daList(AddYear), 15, 2)) 

  AddDay = Val(Mid(daList(AddYear), 17, 2)) 

  conDate = DateSerial(AddYear, AddMonth, AddDay) 

  setDate = DateSerial(tYear, tMonth, tDay) 

  getDay = DateDiff("d", conDate, setDate) 

  If getDay < 0 Then AddYear = AddYear - 1: GoTo CHUSHIHUA 

  ' addday = NearDay 

  AddDay = 1: AddMonth = 1 

  For i = 1 To getDay 

    AddDay = AddDay + 1 

    If AddDay = 30 + Mid(daList(AddYear), AddMonth, 1) Or (RunYue And AddDay = 30 + Mid(daList(AddYear), 13, 1)) Then 

      If RunYue = False And AddMonth = Val("&H" & Mid(daList(AddYear), 14, 1)) Then 

        RunYue = True 

      Else 

        RunYue = False 

        AddMonth = AddMonth + 1 

      End If 

      AddDay = 1 

    End If 

     

  Next 

 

  md$ = "初一初二初三初四初五初六初七初八初九初十十一十二十三十四十五十六十七十八十九二十廿一廿二廿三廿四廿五廿六廿七廿八廿九三十" 

  dd$ = Mid(md$, (AddDay - 1) * 2 + 1, 2) 

  mm$ = Mid("正二三四五六七八九十寒腊", AddMonth, 1) + "月" 

  YouGetDate = DateSerial(AddYear, AddMonth, AddDay) 

  tiangan$ = "甲乙丙丁戊已庚辛壬癸" 

  dizhi$ = "子丑寅卯辰巳午未申酉戌亥" 

  Dim ganzhi(0 To 59) As String * 2 

  For i = 0 To 59 

   ganzhi(i) = Mid(tiangan$, (i Mod 10) + 1, 1) + Mid(dizhi$, (i Mod 12) + 1, 1) 

  'ff$ = ff$ + ganzhi(i) 

  Next i 

  'MsgBox ff$, , Len(ff$) 

  YLyear = ganzhi((AddYear - 4) Mod 60) 

  shu$ = "鼠牛虎兔龙蛇马羊猴鸡狗猪" 

  YLShuXing = Mid(shu$, ((AddYear - 4) Mod 12) + 1, 1) 

  If RunYue Then mm$ = "闰" + mm$ 

   

  GetYLDate = mm$ + dd$ 


End Function 


'下面是一个使用的例子,你需要在窗体上加上一个按扭,并命名为Command1,然后将下列代码复制到窗体的代码中 

Private Sub Command1_Click() 

  Dim ty As Integer, tm As Integer, td As Integer, yl As String, sx As String 

  '取公历1999年10月28日的农历日期 

  ty = 1999 

  tm = 10 

  td = 28 

  t = GetYLDate(ty, tm, td, yl, sx) 

  MsgBox t 

  MsgBox ty & "-" & tm & "-" & td & " " & yl & " " & sx 

  '取1999年农历十月28的公历日期 

  t = GetYLDate(ty, tm, td, yl, sx, True) 

  MsgBox t 

  MsgBox ty & "-" & tm & "-" & td & " " & yl & " " & sx 

   

End Sub
 

楼层:9    昵称:access911    时间:2005年7月25日17:42:00
程序编制技巧
在VB中使用枚举变量 
VB编程技巧几例 
使用 IIF 和 SWITCH 以精减代码 
变量的地址 
向文件中写入非 ASCII 字符 
VB中感叹号“!”与圆点“.”的用法差异 
0、""(空字串)、Null、Empty、与 Nothing 的区别 
巧用Visual Basic的RND()函数 
利用 lstrlen 计算中英文混合字串的长度 
利用 StrConv 计算中英文混合字串的长度 
如何传递不固定个数的叁数?

在VB中使用枚举变量 
    VB5 引入枚举变量,使用它,我们可以显著地改变应用程序的易读性:
Public Enum TimeOfDay
Morning = 0
Afternoon = 1
Evening = 2
End Enum
Sub Main()
Dim RightNow As TimeOfDay
If Time >= #12:00:00 AM# And Time < #12:00:00 PM# Then
RightNow = Morning
ElseIf Time >= #12:00:00 PM# And Time < #6:00:00 PM# Then
RightNow = Afternoon
ElseIf Time >= #6:00:00 PM# Then
RightNow = Evening
End If
End Sub

返回 

 
VB编程技巧几例
山东 许振华 
 
1 文本框内容的自动选择。
    在软件安装等一些场合需要将文本框中的内容自动选择,比如选择确省安装路径,在VB中可用如下的事件驱动代码:
sub text1_getfocus()
text1.selstart=0 ’选择起始位置
text1.sellength=65000 ’选择长度
end sub
sellength接近文本框允许的最大长度(65535),这样做是为了
强迫VB使用文本的实际长度。
 
2 防止自身多次运行。
    由于WINDOWS的多任务处理功能, 有些程序可能打开后忘记了,下次用时还可能再打开,这样做会占用系统资源降低系统效率。为了防止自身被多次运行,可利用VB应用对象提供的PrevInstance属性来检测内存中是否已有一个自身的副本,若有则给出提示后结束。一般将检测代码放在FORM_LOAD()中,因为程序一运行就要检测。
代码如下:
sub form_load()
if App.PrevInstance then
msg$=App.exename & ”has already run”
msgbox msg$,48 ’给出程序已运行的提示和一惊叹号以示警告
end
endif
end sub
3 格式化输入。
    在数据输入过程中,有些数据要求一定的格式,比如限制输入的只能为数字或英文字符,这可用VB的格式输入文本框来实现。它与文本框(TEXT BOX)功能基本相似,但多了一个MASK属性,MASK属性常用的设定如下:
       #—限定仅能输入数字0~9;
       A— 限定输入为英文字符及数字;
       ?—限定仅能输入英文字符;
       .—限定小数点位置;
       :—限定时间分隔号;
       /—限定日期分隔号
    不需编写代码,只要在设计时将格式化文本框对象(MASKED EDIT)的MASK属性设计好所需格式即可。比如 ## - ## - ## 可输入12-11-96。
4 用MSGBOX函数设计版权信息。
    MsgBox函数可用来设计简易的版权信息,它只能显示文本,如果要求不高的话可采用它,优点是非常方便,比如在菜单ABOUT项中显示版权信息。
    MsgBox函数的用法如下:MsgBox msg [, [type][, title] ]
       msg —需要显示的文字信息,如版权信息。
       type—按钮显示选择项。
       如 0 只显示 OK按钮(确省选择),4 显示 Yes 和 No 按钮
       title—标题文字信息。
    MSGBOX最多能显示1024个字符, 超出的将被截去;它可自动换行,如果你想强制换行的话需要在换行处加入换行符CHR(10)。
例子:
Sub Form_Click ()
Msg1 = ” Copyright (c) 1996” & Chr(10) & ”Ver
1.0 ” ’分两行显示
MsgBox Msg1, 0, ”Copyright demo” ’只显示一个OK按钮
End Sub

返回 

 
使用 IIF 和 SWITCH 以精减代码 
    在很多地方你都可以使用一个更紧凑的 IIf 函数来代替 If...Else...Endif 的结构: 例:返回两个值中较大的一个 maxValue = IIf(first >= second, first, second)
    Switch 则是一个很少使用的函数,可是在很多方面它都提供比 If...ElseIf 结构更好的 例:判断 "x" 是正、负还是 null?
        Print Switch(x<0,"负",x>0,"正", True, "Null")

返回 

 
变量的地址 
    VB5 内置了一个 VarPtr 函数,可是此函数在 VB4 中没有提供。可是你知道吗?VB4 的运行库中已经包含了此函数。只是在用它之前,我们需要声明一下:
        #If Win16 Then
        Declare Function VarPtr Lib "VB40016.DLL" (variable As Any) As Long
        #Else
        Declare Function VarPtr Lib "VB40032.DLL" (variable As Any) As Long
        #End If
    此函数在传递一个 Type 结构(如果此结构要求其一段是另一个变量或记录的地址)给一个外部的 API 程序时十分有用。

返回 

 
向文件中写入非 ASCII 字符 
    如何向一个文件中写入非ASCII字符(ASCII码在128-255之间)?这在 VB3 中按常规方法就可以很好处理。但是,自 VB4 起,微软引入 Unicode 后,此问题就显得有些麻烦。方法如下:
      Dim a As Byte '如果你不用 Unicode,微软推荐使用 Byte 类型替换 String 类型
      a=&HF5 '此处直接给处 ASCII 码即可
      Open "test.dat" For Binary As #1
      Put #1, , a
      Close (1)

返回 

 
VB中感叹号“!”与圆点“.”的用法差异
河北 马昱 
    在Visual Basic中,惊叹号“!”与圆点“.”都用于给对象命名,但两者语法上却存在很大的区别,这点在编程时尤其需要注意。
    圆点操作符“.”用来表示对象的属性和方法,在引用时,需要用到对象的Name、圆点和需要的属性或方法。例如要引用文本框Textl中的文本属性时可用reponse$=Text1.Text,再如要改变Form1窗体返回或读取对象高度的单位时用Form1.ScaleHeigh=2000表示。
    感叹号“!”常用于当一个控件作为一个特性访问的情况下,例如引用Fomr2中Text1文本框文本属性时,可采用response$=Form2!text1.text语法格式。
    虽然两者的语法应用结构有较大差异,但两条语句的性能是相同的,值得注意的是如果你在感叹号“!”的位置使用“.”可以获得对窗体上Text1特性的直接访问权,为了进一步增加感性认识,你不妨运行下面的例子来试试。
    1.建立一个新项目,并在Form1窗体中增加一个命令控件。
    2.双击Form1窗体,编辑Form-Load事件并输入:
        Form1!Command1.Caption=”Text”
        Form1.Command1.Caption=”It Works”
    3.运行试项目,这时你就会在Command1命令框中看到字符串It Works。
    为了在程序中清楚地界定引用的控件名和该控件的属性或方法,增加程序的可读性,最好使用感叹号“!”,这也是VB的推荐方式。

返回 

 
0、""(空字串)、Null、Empty、与 Nothing 的区别 
    先回答以下问题吧! 经过以下的叙述之后, 变量 A、B、C、D 分别等于 0、""、Null、 Empty、 Nothing 的哪一个?
Dim A
Dim B As String
Dim C As Integer
Dim D As Object
    A 等于 Empty, 因为尚未初始化的「不定型变量」都等于 Empty。但如果检测 A = "" 或 A = 0, 也都可以得到 True 值。
    B 等于 "", 因为尚未初始化的非固定长度「字串」都等于 "" 。 但请注意 B<> Null。
    C 等于 0, 这个还有问题吗?
    D 等于 Nothing, 尚未设定有物件的「物件变量」都等于 Nothing, 但请不要使用 D = Nothing , 而要使用 D Is Nothing 来判断 D 是否等于 Nothing, 因为判断 是否相等的符号是 Is 不是 = 。
    最令人迷惑的地方是 Null 这个保留字, 请看以下语句:
Print X = Null
Print X <> Null
    结果都是输出 Null(不是 True 也不是 False), 这是因为任何一个运算式只要含有 Null , 则该运算式就等于 Null, 实际上想要判断某一数据是否为 Null 绝对不能使用:
        If X = Null Then ' 永远都会得到 Null
    而要使用:
        If IsNull(X) Then
    哪一种数据会等于 Null 呢? 除了含有 Null 运算式之外, 就属没有输入任何数据的「数据字段」(在数据库中) 会等于 Null。

返回 

 
巧用Visual Basic的RND()函数
浙江 傅昌盛 
    Visual Basic的RND()函数有一个重要的特征:当RND()的参数(我们称这里可以称它为种子)为负值时,同一种子(负值)产生同一个随机数序列。同时Visual Basic还具有强大的二进制技术功能,这样我们可以按以下思路实现文件内容加密:
      X=RND(-KEY) ’KEY为正数
      VAULE=INT(256*RND) ’产生一个随机数(以此为密码)
      Open FILENAME$ For Binary As #FILENUM’打开文件
      Get #FILENUM,I,A ’取文件内容
      B=A XOR VAULE ’得到加密文件
    结合
      C=B XOR VAULE’得到解密文件(B为加密后文件内容)
    注意:这里的A非整个文件内容,可以是极少部分、几个字节甚至单个字节,若为单字节,则文件中的每个字节同不同的数异或,破译难度可见有多么大。具体过程:
      Sub ENDECODE(FILENAME$,MA,FILE2$)'参数为:源文件,密码,目标文件
      Dim FILENUM As Integer,X As Single,I As Single
      Dim CHARNUM As Integer,RANDOMINTEGER As Integer
      Dim SINGLECHAR As String *1,filen2 As Integer'取单字节
      If MA<0 Them
      MA=MA*(-1)
      End If
      X=Rnd(-MA)'参数为负
      FILENUM=FreeFile
      Open FILENAME$ For Binary As #FILENUM '二进制方式打开源文件
      filen2=FreeFile
      Open FILE2$ For Output As #filen2’以顺序文件打开目标文件
      For i=1 To LOF(FILENUM)'LOF()文件字节长
      Get #FILENUM,i,SINGLECHAR'取单字节内容
      CHARNUM=Asc(SINGLECHAR)
      RANDOMINTEGER=Int(256*Rnd)'得到字母表
      CHARNUM=CHARNUM Xor RANDOMINTEGER'异或
      Print #filen2,Chr$(CHARNUM);’写入目标文件
      Next I
      Close FILENUM
      Close filen2
      ok ’调用成功对话框
      End Sub
        调用格式:ENDECODE 源文件名,密码,目标文件名
    上面过程可以对任何EXE、COM、文本等文件进行加解密(奇数次加密,偶数次解密),重演性极好,保密性特优,若对上述过程进一步加工,如进行多重随机等手段处理,那么将会更上一层楼,在此不累述。
    顺便提一下,上面过程若对目标文件同样以二进制文件打开、写入,那么只能对纯西文文本进行加解密,对于纯中文文本则通过修改取双字节、I的步长为2来实现,其它(中西文结合文本、EXE、COM等文件)则将得不到预期结果,其原因可以能是ASCII大于127的字符,不能正常显示,不能用put语句正常写入文件(得到的只是空格),有兴趣者不妨一试。

返回 

 
利用 lstrlen 计算中英文混合字串的长度 
在 32-bit 版本的 VB 底下, 将每一个字符都视为两个 Byte, 所以
Len("中英Mixed") 等于 7
LenB("中英Mixed") 等于 14
但是在很多场合底下, 我们希望中文字长度以 2 计算, 英文字母长度以 1 计算, 此时使用的方法如下:
' 欲计算字串 S 的长度
N = 0
For I = 1 To Len(S)
C = Asc(Mid(S, I, 1)) ' 取得第 I 个字符组的字符码
If C >= 0 And C < 128 Then ' 英文
N = N + 1
Else ' 中文
N = N + 2
End If
Next
看起来程序有点罗唆, 如果您不喜欢这个方法, 可以使用 Windows API 的 lstrlen 函数, 假设假计算 S 的长度, 则 API 声明式如下:
Private Declare Function lstrlen Lib "kernel32" Alias "lstrlenA" (ByVal lpString As String) As Long
而调用的叙述则是:
n = lstrlen("中英Mixed" + Chr(0))
Print n ' n 将等于 9
请注意调用 lstrlen 时必须加上 Chr(0), 因为此一函数是根据 Chr(0) 来判断字串的结束。
调用 lstrlen 除了程序比较简短之外, 速度也比我们写 VB 程序判断中英文字然后计算长度来的快。

返回 

 
利用 StrConv 计算中英文混合字串的长度 
上一周说明利用 Windows API 的 lstrlen 计算中英文混合字串的长度之后,台中的 Rose 读者来函, 说还有更简单的计算方法, 如下:
LenB(StrConv("中英Mixed", vbFromUnicode))
说真的, 因为笔者懂得调用 Windows API, 所以竟然忽略了此一 VB 内建的函数,可见闻道有先后, 在此笔者亦希望先闻道的读者能够将您的心得发表出来, 与喜欢 VB 的读者交流。
StrConv 的作用是字串内容的转换, 其中将叁数二设定成 vbFromUnicode,作用是把「双位元」的字串转换成中文字占用 2 Bytes、英文占用 1 Bytes 的字串,所以紧接着调用 LenB, 便可以计算出中英文混合字串的长度。

返回 

 
如何传递不固定个数的叁数? 
定义副程序时, 我们必须把叁数一一列出来, 例如:
Sub MySub( P1, P2, ┅)
但如果我们将来调用副程序时, 可能会传入不固定个数的叁数, 那么副程序该如何定义呢?答案如下:
Sub MySub( ParamArray P() ) ' 把叁数 P 定义成一个阵列
如此定义副程序之后, 以下都是将来可能出现的调用叙述:
MySub "ABC" ' 只传递一个叁数
MySub 1, 3, 9, 988, 776, 234 ' 传递 6 个整数叁数
MySub 123, "abc", Date() ' 传递 3 个不同型别的叁数
以最后一个调用叙述为例, P(0) 叁数将等于 123, P(1) 叁数等于 "abc", P(2) 叁数则等于 Date() 函数的传回值, 而由于 P() 是一个阵列, 我们可以利用以下方法读取每一个叁数:
For i = 0 To UBound(P)
    ' P(i) 等于第 i 个叁数
Next
最后, 请注意以 ParamArray 所定义的叁数一定是 Variant(不定型) 型别, 若要判断每一个个别叁数的资料型别, 可以使用 TypeName 函数。

返回 
 

 


请发表你的评价

昵称:
密码:
验证码: 看不清,换一张
评论:

 

 

上述言论由发言人自行负责, http://Access911.net 不对该言论负任何责任