ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: zhoujibin1

[原创]Excel VBA 快速上手之宝典

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2006-7-23 20:25 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖已被收录到知识树中,索引项:开发帮助和教程
谢谢!什么时候发完?

TA的精华主题

TA的得分主题

 楼主| 发表于 2006-7-23 21:34 | 显示全部楼层
QUOTE:
以下是引用cmnemo在2006-7-23 20:25:34的发言:
谢谢!什么时候发完?

这两天就完成。

TA的精华主题

TA的得分主题

 楼主| 发表于 2006-7-23 22:25 | 显示全部楼层

3) 加密与注册
   
    对正版软件的注册,有效的方法是一机一码,即一台电脑一个注册码。即使别人获得了注册码和软件,在别的机子上也无法使用。这一机一码就是基于电脑硬盘的唯一物理地址。打个比方来理解这个方法:电脑上的硬盘物理地址为DISK_ID,经过钥匙串KEY1加密得到User_ID;软件开发人员然后根据钥匙串KEY1解密User_ID获得用户的DISK_ID,再经钥匙串KEY2加密获得所谓的注册号Reg_ID;用户输入Reg_ID并存在电脑注册表或文件上,软件启动后,调用注册核对功能,通过KEY2加密DISK_ID获得一字符串,与REG_ID对比,看是否一致,不一致则提示未注册并关闭程序运行。这里的KEY1和KEY2及加密解密算法,都存放在DLL中,核心程序也存放在该DLL中,所以该方法注册可以保证一机一码且安全。
下面就介绍多种字符串加密解密算法的一种,是我以前看啥资料想到后设计出的。

    基础原理如下:
A. 可见字符的ASC码:0-9的Asc码为48-57;大写A-Z的Asc码为65-90;小写a-z 的Asc码为97-122。Asc码是一整数型数据,占一个字节8位长度。
B. 异或操作(对应位的数字不同则为1,相同为0):举个例,电脑里一个字节的二进制数:01101110与11000011异或结果为10101101,该结果在与11000011再异或一次,其结果是01101110,这与开始的数相同,所以一个数对另一个数两次异或就会复原。

(1)加密步骤,PlainStr为待加密字串,KEY为钥匙字串。
第一步:取KEY第一个字符的Asc码和PlainStr每一个字符的Asc码异或,如果异或结果为可见字符的Asc码范围,则其Asc码对应的字符为新加密字符,否则新加密字符就是刚才的PlainStr对应位置的字符,各个加密字符合并就是被KEY第一个字符的Asc码加密过的字符串,并取代PlainStr。
第二步:循环第一步,依次用KEY的其余字符按第一步方法执行,得到最后的PlainStr。
第三步:异或操作后的PlainStr长度为偶数,则分为左右两半,左右两字符串各自进行反序,其后合并成一个字符串。
第四步:经过以上三步的操作,PlainStr字符串就经过钥匙字串KEY的加密。

(2)解密步骤,PlainStr为待解密字串,KEY为钥匙字串。
第一步:PlainStr长度为偶数,则分为左右两半,左右两字符串各自进行反序,其后合并成一个新的字符串PlainStr。
第二步:取KEY最后一个字符的Asc码和PlainStr每一个字符的Asc码异或,如果异或结果为可见字符的Asc码范围,则其Asc码对应的字符为新解密字符,否则新解密字符就是刚才的PlainStr对应位置的字符,各个解密字符合并就是被KEY最后一个字符的Asc码解密过的字符串,并取代PlainStr。
第三步:循环第二步,依次用KEY的其余倒序字符按第二步方法执行,得到最后的PlainStr。
第四步:经过以上三步的操作,PlainStr字符串就经过钥匙字串KEY的解密。

示例代码如下:
'****************************************************************************************************
'                                     加密解密算法
'可见字符ASC码:48-57(0-9);65-90(A-Z);97-122(a-z)
'异或结果为可见字符则异或
'偶数则把异或结果分成两半各自并反序,增加破解难度

'***********************************加密***************************************
Private Function Encrypt(PlainStr As String, key As String) as string
Dim Char As String, KeyChar As String, NewStr As String, AscCode As Long
Dim i As Integer, j As Integer, Side1 As String, Side2 As String

For j = 1 To Len(key)                  '钥匙字符串正向逐个取字符,用其Asc码和待加密字符串各字符的Asc码异或操作
    NewStr = ""
    KeyChar = Mid(key, j, 1)
    For i = 1 To Len(PlainStr)         '取待加密字符串各字符
        Char = Mid(PlainStr, i, 1)
        AscCode = Asc(Char) Xor Asc(KeyChar)   '对字符的Asc码异或操作
        If (AscCode <= 57 And AscCode >= 48) Or (AscCode <= 90 And AscCode >= 65) Or (AscCode <= 122 And AscCode >= 97) Then
            NewStr = NewStr & Chr(AscCode)     '异或后的Asc码是可见字符的Asc码,则把异或结果转成字符,加入异或结果字符串
        Else
            NewStr = NewStr & Char             '异或后的Asc码是不可见字符的Asc码,则把原先字符加入异或结果字符串
        End If
    Next i
    PlainStr = NewStr
Next j
If Len(PlainStr) Mod 2 = 0 Then                '异或结果字符串,其长度为偶数则分左右两半并各自反序
    Side1 = StrReverse(Left(PlainStr, (Len(PlainStr) / 2)))
    Side2 = StrReverse(Right(PlainStr, (Len(PlainStr) / 2)))
    PlainStr = Side1 & Side2                   '合并左右反序字符串
End If
Encrypt = PlainStr                             '生成加密结果字符串
End Function

'***********************************解密***************************************
Private Function Decrypt(PlainStr As String, key As String) as string
Dim Char As String, KeyChar As String, NewStr As String, AscCode As Long
Dim i As Integer, j As Integer, Side1 As String, Side2 As String
If Len(PlainStr) Mod 2 = 0 Then                '字符串为偶数长度,则分左右两半并各自反序
    Side1 = StrReverse(Left(PlainStr, (Len(PlainStr) / 2)))
    Side2 = StrReverse(Right(PlainStr, (Len(PlainStr) / 2)))
    PlainStr = Side1 & Side2                   '合并左右反序后字符串
End If

For j = Len(key) To 1 Step -1                  '反顺序逐个取钥匙字符串各字符,用其Asc码和待解密字符串各字符的Asc码异或操作
    NewStr = ""
    KeyChar = Mid(key, j, 1)                  
    For i = 1 To Len(PlainStr)                 '对字符串每个字符的Asc码进行异或
        Char = Mid(PlainStr, i, 1)
        AscCode = Asc(Char) Xor Asc(KeyChar)   '字符的Asc码进行异或
        If (AscCode <= 57 And AscCode >= 48) Or (AscCode <= 90 And AscCode >= 65) Or (AscCode <= 122 And AscCode >= 97) Then
            NewStr = NewStr & Chr(AscCode)     '异或后的Asc码是可见字符的Asc码,则把异或结果转成字符,加入异或结果字符串
        Else
            NewStr = NewStr & Char             '异或后的Asc码是不可见字符的Asc码,则把原先字符加入异或结果字符串
        End If
    Next i
    PlainStr = NewStr
Next j
Decrypt = PlainStr
End Function

TA的精华主题

TA的得分主题

 楼主| 发表于 2006-7-23 22:53 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

URUAf4WH.rar (36.49 KB, 下载次数: 496)


加密解密及硬盘物理地址综合示例。大家可以多研究分析下,可以研究出自己的加密解密方法。

TA的精华主题

TA的得分主题

 楼主| 发表于 2006-7-23 23:52 | 显示全部楼层

 

Excel VBA 软件注册 示例。 大家可以先试验注册,把用户机子码用Reg.exe小程序123加密,得到注册码。输入注册码注册。

PgEfJAzt.rar (35.05 KB, 下载次数: 489)


考虑下,你能否破解得了我这种注册方法(当然是没有我的源代码了),附件中的源代码供参考学习。

[此贴子已经被作者于2006-7-24 0:10:10编辑过]

TA的精华主题

TA的得分主题

 楼主| 发表于 2006-7-24 00:09 | 显示全部楼层

                                           第四章 Excel VBA优化及结束语
                                               第一节 Excel VBA优化

    由于Microsoft Office办公套件的广泛应用,以及该软件版本的不断提升,功能不断完善,在Office办公套件平台上开发出的的VBA应用程序越来越多,而VBA是一种宏语言,在运行速度上有很大的限制。因此VBA编程的方法直接关系到VBA程序运行的效率,本节列举了一些提高VBA程序运行效率的方法。

方法1:尽量使用VBA原有的属性、方法和Worksheet函数
    由于Excel对象多达百多个,对象的属性、方法、事件多不胜数,对于初学者来说可能对它们不全部了解,这就产生了编程者经常编写与Excel对象的属性、方法相同功能的VBA代码段,而这些代码段的运行效率显然与Excel对象的属性、方法完成任务的速度相差甚大。例如用Range的属性CurrentRegion来返回Range 对象,该对象代表当前区。(当前区指以任意空白行及空白列的组合为边界的区域)。同样功能的VBA代码需数十行。因此编程前应尽可能多地了解Excel对象的属性、方法。
充分利用Worksheet函数是提高程序运行速度的极度有效的方法。如求平均工资的例子:
    For Each c In Worksheet(1).Range(″A1:A1000″)
   TotalValue = TotalValue + c.Value
  Next
  AverageValue = TotalValue / Worksheet(1).Range(″A1:A1000″).Rows.Count

而下面代码程序比上面例子快得多:
AverageValue=Application.WorksheetFunction.Average(Worksheets(1).Range(″A1:A1000″))

其它函数如Count,Counta,Countif,Match,Lookup等等,都能代替相同功能的VBA程序代码,提高程序的运行速度。

方法2:尽量减少使用对象引用,尤其在循环中
    每一个Excel对象的属性、方法的调用都需要通过OLE接口的一个或多个调用,这些OLE调用都是需要时间的,减少使用对象引用能加快VBA代码的运行。
1).使用With语句。
   Workbooks(1).Sheets(1).Range(″A1:A1000″).Font.Name=″Pay″
    Workbooks(1).Sheets(1).Range(″A1:A1000″).Font.FontStyle=″Bold″ ...
 则以下语句比上面的快
 With Workbooks(1).Sheets(1).Range(″A1:A1000″).Font
   .Name = ″Pay″
   .FontStyle = ″Bold″
   ...
  End With
2).使用对象变量。
  如果你发现一个对象引用被多次使用,则你可以将此对象用Set 设置为对象变量,以减少对对象的访问。如:
   Workbooks(1).Sheets(1).Range(″A1″).Value = 100
   Workbooks(1).Sheets(1).Range(″A2″).Value = 200
  则以下代码比上面的要快:
  Set MySheet = Workbooks(1).Sheets(1)
  MySheet.Range(″A1″).Value = 100
  MySheet.Range(″A2″).Value = 200
3).在循环中要尽量减少对象的访问。
  For k = 1 To 1000
   Sheets(″Sheet1″).Select
   Cells(k,1).Value = Cells(1,1).Value
  Next k
  则以下代码比上面的要快:
  Set TheValue = Cells(1,1).Value
  Sheets(″Sheet1″).Select
  For k = 1 To 1000
   Cells(k,1).Value = TheValue
  Next k

方法3:减少对象的激活和选择
    如果你的通过录制宏来学习VBA的,则你的VBA程序里一定充满了对象的激活和选择,例如Workbooks(XXX).Activate、Sheets(XXX).Select、Range(XXX).Select等,但事实上大多数情况下这些操作不是必需的。例如
  Sheets(″Sheet3″).Select
  Range(″A1″).Value = 100
  Range(″A2″).Value = 200
  
可改为:
  With Sheets(″Sheet3″)
   .Range(″A1″).Value = 100
   .Range(″A2″).Value = 200
  End With

方法4:关闭屏幕更新
    如果你的VBA程序前面三条做得比较差,则关闭屏幕更新是提高VBA程序运行速度的最有效的方法,缩短运行时间2/3左右。关闭屏幕更新的方法:
  Application.ScreenUpdate = False
  请不要忘记VBA程序运行结束时再将该值设回来:
 Application.ScreenUpdate = True

方法5:变量类型确定,少用变体变量
    Option Explicit 语句, 在模块级别中使用,强制显式声明模块中的所有变量。 如果模块中使用了 Option Explicit,则必须使用 Dim、Private、Public、ReDim 或 Static 语句来显式声明所有的变量。如果使用了未声明的变量名在编译时间会出现错误。如果没有使用 Option Explicit 语句,一般所有未声明的变量都是 Variant 类型的。
注意 使用 Option Explicit 可以避免在键入已有变量时出错,在变量的范围不是很清楚的代码中使用该语句可以避免混乱.

方法6:关闭Excel系统提示
   '本示例关闭所有打开的工作簿。如果某个打开的工作簿有改变,Microsoft Excel 将显示询问是否保存更改的对话框和相应提示。
Workbooks.Close
实际开发程序时,需要关闭提示信息对话框,给用户简洁高效的体验.
 Application.DisplayAlerts = False  '信息警告关闭
 请不要忘记VBA程序运行结束时再将该值设回来: 
 Application.DisplayAlerts = True  '信息警告开启
 
 关闭信息警告后, 保存文档及关闭需要先保存,在关闭
 
 Workbooks("filename.xls").Save       '文件保存
 
 Workbooks("filename.xls").Close SaveChanges:=True  
 '文件关闭, 不出现是否要保存的窗口,并保存所有对此工作簿的更改。
    Workbooks("BOOK1.XLS").Close SaveChanges:=False  
    '本示例关闭 Book1.xls,并放弃所有对此工作簿的更改。
    这样可以提高程序的简洁性,给用户服务.
   
方法7: 提高关键代码和循环代码的效率
    不同方法执行效率的差异,但千万不要因为追求效率而损失了代码的可读性、清晰性。效率的优化必须是针对关键代码的优化,对于一些在程序执行过程中,只执行很少次数的代码,没有必要牺牲可读性而进行优化。对于代码执行效率,千万不要人云亦云,必要时候,自己动手测试一下,结果往往会出 乎意料。
代码执行时间的测算VBA和VB中,没有专门的代码执行事件测算工具和方法,笔者一般是使用Timer函数,其返回值是一个Single类型的数值,代表从午夜开始到现在经过的秒数,此数值包括小数部分,但精确程度在Windows NT,2000和XP下大概接近10毫秒。如果要测试一段代码的执行速度,可以使用如下方法:
 
 #001 Sub MeasureTime()
 #002    
 #003     Dim Time1 As Single, Time2 As Single
 #004     Dim TotalTime As Single
 #005     Dim Times As Long
 #006     Dim i As Long
 #007    
 #008     Times = 10000
 #009     Time1 = Timer
 #010    
 #011     For i = 1 To Times Step 1
 #012         Mytest1
 #013     Next i
 #014    
 #015     Time2 = Timer
 #016    
 #017     TotalTime = (Time2 - Time1) * 1000
 #018     MsgBox "执行时间: " & TotalTime & " 毫秒(次数:" _
 #019         & Times & ")"
 #020        
 #021 End Sub
 #022
 #023 Sub Mytest1()
 #024    
 #025     Dim i As Long
 #026     Dim s As String
 #027     i = Rnd
 #028     s = Format(i, "#.00")
 #029    
 #030 End Sub
 
    过程MeasureTime可以测试一个过程的执行速度,因为一般一个过程执行会很快,所以使 用循环,执行n次(第8行设置),在第12行调用测试的过程,通过循环前的时间(第9行)和 循环后的时间(第15行),计算总共执行时间(第17行)。使用这个方法,就可以做一些测试,看哪些方法执行效率更高。另外,由于Windows的多任务特定,测试时最好关闭其他无关程序,以获得较准确的测试结果。
   
方法8 注意单元格写法
 cells(1,1) >>>>> range("a1")>>>>.[a1]
 cells(1,1) 符合 EXCEL 结构,最快
 range("a1") 有对象,稍稍慢
 [A1] 写的快,运行慢

方法9 不要直呼其名
    a= Worksheets(1).Name >>>>> a=Worksheets("Sheet1").name

方法10 少用RANGE对象,可用数组取代,速度快5-10倍,Test2就比Test1快。

Sub Test1()
Dim i As Long, j As Long, buf As Long
 For i = 1 To 10000
  For j = 1 To 100
   buf = Cells(i, j)
  Next j
 Next i
End Sub

Sub Test2()
 Dim i As Long, j As Long, buf As Long, C As Variant
  C = Range("A1:CV10000")
 For i = 1 To 10000
  For j = 1 To 100
   buf = C(i, j)
  Next j
 Next i
End Sub

方法11 注意函数的类型, 尽量少用Variant变量,多用整型变量,如多用整型变量函数。

 Chr$  ChrB$ Command$
 CurDir$ Date$ Dir$
 Error$ Format$ Hex$
 Input$ InputB$ LCase$
 LeftB$ LTrim$
 Mid$ MidB$ Oct$
 Right$ RightB$ RTrim$
 Space$ Str$ String$
 Time$ Trim$ UCase$
这些字符型函数 就比chr date space 等快,因为不加后缀类型指定的函数,其返回值是Variant类型结果。

TA的精华主题

TA的得分主题

 楼主| 发表于 2006-7-24 00:13 | 显示全部楼层
总于到了末尾了,明天再说说感想就收工了。希望对大家有所帮助,能尽快使用VBA开发程序,减轻工作上的重复劳动。让大家都能用VBA,数据计算和作图等,不再是我们麻烦事,把主要精力放在问题的解决设计上。

TA的精华主题

TA的得分主题

 楼主| 发表于 2006-7-24 00:30 | 显示全部楼层

估计最后还要加个综合开发实例,介绍下窗体设计,菜单和工具栏等。第一章要加一个简单介绍Excel基本使用和宏的录制等。

加上更多示例,文字修改,图表,重新排定等,争取能做成《Excel VBA 之快速上手》,预计定价26元。

其实核心的东西,我都奉献给大家了,到时真的出书了,还希望大家继续支持。

[此贴子已经被作者于2006-7-24 0:31:23编辑过]

TA的精华主题

TA的得分主题

发表于 2006-7-24 02:13 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

没错,宏是VBA入门的最佳途径.而对了解VB语言的人来说,宏是使用EXCEL的最便捷方式.

对于前者是强调入门理解.而对后者是强调如何修改宏语句的窍门.

乱弹了.

楼主辛苦!

TA的精华主题

TA的得分主题

发表于 2006-7-24 08:26 | 显示全部楼层
QUOTE:
以下是引用zhoujibin1在2006-7-24 0:30:08的发言:

估计最后还要加个综合开发实例,介绍下窗体设计,菜单和工具栏等。第一章要加一个简单介绍Excel基本使用和宏的录制等。

加上更多示例,文字修改,图表,重新排定等,争取能做成《Excel VBA 之快速上手》,预计定价26元。

其实核心的东西,我都奉献给大家了,到时真的出书了,还希望大家继续支持。


继续等待,也希望新书出世

[em24][em24][em24][em24][em24][em24][em24][em24]
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-6-4 14:18 , Processed in 0.057093 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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