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 12:38 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖已被收录到知识树中,索引项:开发帮助和教程
期待中

TA的精华主题

TA的得分主题

发表于 2006-7-23 13:40 | 显示全部楼层

TA的精华主题

TA的得分主题

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

感觉这一节不好讲,很难。如果详细讲,那就是另外一套书了。所以感觉后继乏力呀!

TA的精华主题

TA的得分主题

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

四、示例
(1)弹出一个对话框,提示计算机的名称,并且扬声器喇叭会鸣叫。
  1Q0UyQV2.rar (8.44 KB, 下载次数: 648)


Private Declare Function Beep Lib "kernel32" (ByVal dwFreq As Long, ByVal dwDuration As Long) As Long
Private Const MAX_COMPUTERNAME_LENGTH As Long = 31
Private Declare Function GetComputerName Lib "kernel32" Alias "GetComputerNameA" (ByVal lpBuffer As String, nSize As Long) As Long

Sub ComputerName()
    Dim dwLen As Long
    Dim strString As String
    '创建缓冲区32位
    dwLen = MAX_COMPUTERNAME_LENGTH + 1
    strString = String(dwLen, "X")
    '获得计算机名称
    GetComputerName strString, dwLen
    '获得实际名称字串
    strString = Left(strString, dwLen)
    '播放频率为4500赫兹的扬声器声音,持续100微秒
    For I = 0 To 5
        Beep 4500, 100
        DoEvents
    Next
    '显示计算机名称
    MsgBox "电脑名称是 " & strString & ", 我搞对了吗?"
End Sub

[此贴子已经被作者于2006-7-23 16:42:47编辑过]

TA的精华主题

TA的得分主题

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

(2)API函数ShellExecute的使用,打开网页和发送邮件。

API函数ShellExecute的介绍:
【VBA声明】
Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
【别名】
  ShellExecuteA
【说明】
  查找与指定文件关联在一起的程序的文件名
【返回值】
  Long,非零表示成功,零表示失败。
【参数表】
  hwnd -----------  Long,指定一个窗口的句柄,有时候,windows程序有必要在创建自己的主窗口前显示一个消息框
  lpOperation ----  String,指定字串“open”来打开lpFlie文档,或指定“Print”来打印它
  lpFile ---------  String,想用关联程序打印或打开一个程序名或文件名
  lpParameters ---  String,如lpszFlie是可执行文件,则这个字串包含传递给执行程序的参数
  lpDirectory ----  String,想使用的完整路径
  nShowCmd -------  Long,定义了如何显示启动程序的常数值。参考ShowWindow函数的nCmdShow参数

示例代码:

Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _
    (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, _
    ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
Private Const SW_SHOWNORMAL As Long = 1

Private Sub CommandButton1_Click()
    Unload Me
End Sub

Private Sub Label4_Click()
    '启动邮件程序
    ShellExecute 0, "Open", "mailto:zhoujibin123@1126.com", "", "", SW_SHOWNORMAL
    Unload Me
End Sub

Private Sub Label5_Click()
    '启动网络程序
    ShellExecute 0, "Open", "http://club.excelhome.net/dispbbs.asp?boardid=2&replyid=462739&id=178278&page=1&skin=0&Star=1", "", "", SW_SHOWNORMAL
    Unload Me
End Sub

6UbSFi2F.rar (19.14 KB, 下载次数: 643)

TA的精华主题

TA的得分主题

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

                                                            第二节 Excel VBA 程序的保密


       Excel VBA 程序的保密是个难点,大家对此都感兴趣,原因是想保护核心代码和技术以及对商业的Excel VBA 程序进行安全保障。Excel 对 VBA 工程加密仅起简单保护作用,稍懂一点的程序员就可手工破解或使用网上的破解软件。目前唯一能保障 VBA 代码就一个方法,把VBA 核心代码封装到动态连接库(DLL)文件中。大家可以放心动态连接库,因为它是很难被反编译的(反编译的代价比开发还大)、非常安全。下面就开始介绍如何制作和使用动态连接库DLL。

一、动态连接库DLL的制作和使用
1)用VB6 企业版下ActiveX.DLL 工具开发,在缺省类代码窗口输入下面代码:

 Sub copy12(x As Integer, y As Integer)            '目的是把表x单元格值赋值给表y
   '定义将要用到的变量数据,对象变量,整型数据变量
 Dim xlapp As Object, xlbok As Object,xlsht1 As Object,xlsht2 As Object, xlrng As Object
    Dim i As Integer, j As Integer, irow1 As Integer, icol1 As Integer
    Dim irow2 As Integer, icol2 As Integer, cellssum As Integer
   
    Set xlapp = GetObject(, "Excel.Application")   '取得Excel实例
    Set xlbok = xlapp.activeworkbook             '取得Excel实例下活动工作簿
    Set xlsht1 = xlbok.Worksheets(x)             '取得Excel实例下活动工作簿的第x表格
    Set xlsht2 = xlbok.Worksheets(y)             '取得Excel实例下活动工作簿的第y表格
    Set xlrng = xlsht1.UsedRange                 '取得Excel实例下活动工作簿的第x表格的已用区域

    cellssum = xlrng.Count                            'x表格的已用区域的单元格数目

    irow1 = xlrng.cells(1).row                         '已用区域的第1单元格的行
    icol1 = xlrng.cells(1).Column                   '已用区域的第1单元格的列
    irow2 = xlrng.cells(cellssum).row             '已用区域的最后单元格的行
    icol2 = xlrng.cells(cellssum).Column       '已用区域的最后单元格的列
   
    For i = irow1 To irow2                            '从已用区域第1行到最后一行循环
       For j = icol1 To icol2                           '从已用区域第1列到最后一列循环
          xlsht2.cells(i, j) = xlsht1.cells(i, j)      '把x表已用区域单元格数据赋值给y表相同位置
       Next                                                    '此处目的可用别方法实现,或加判断实现别的
    Next
   
    Set xlapp = Nothing                                '清除定义的对象为空
    Set xlbok = Nothing
    Set xlsht1 = Nothing
    Set xlsht2 = Nothing
    Set xlrng = Nothing

End Sub

Function Getstrgs(STRG As String, FC As String, LC As String) As Variant 
'求字符间各子串赋值给数组
    Dim ss() As String
    On Error Resume Next
    Sum = 0
    For i = 1 To Len(STRG) - 1
        If Mid(STRG, i, 1) = FC Then
            For j = i + 1 To Len(STRG)
                If Mid(STRG, j, 1) = LC Then Sum = Sum + 1
            Next
        End If
    Next
    If Sum < 1 Then
        MsgBox "No substring found!"
        Exit Function
    End If
    ReDim ss(Sum - 1) As String
    Sum = 0
    For i = 1 To Len(STRG) - 1
        If Mid(STRG, i, 1) = FC Then
            For j = i + 1 To Len(STRG)
                If Mid(STRG, j, 1) = LC Then
                    ss(Sum) = Mid(STRG, i + 1, j - i - 1)
                    Sum = Sum + 1
                End If
            Next
        End If
    Next
    Getstrgs = ss
End Function

以上代码仅展示类中的过程和函数,以便在VBA中使用。
2)修改将要引用的类名称,在VB6的类属性窗口修改,本例修改为 mycopy1to2
3)工程保存,本例保存为sheetcopy1to2
4)DLL生成,本例保存为sheetcopy1to2.dll
  
   2,3,4步骤我想对大家来说,不应该存在问题的。

二.VBA中调用DLL
1)VBE窗口下,点工具菜单-引用,在点弹出窗口的浏览按钮,找到你的DLL文件,最好和EXCEL文件放一个目录下,便于下一步骤。
2)DLL的注册,如下:

Private Sub Workbook_BeforeClose(Cancel As Boolean)
  Shell "Regsvr32 /u /s " & Chr(34) & ThisWorkbook.Path & "\sheetcopy1to2.dll" & Chr(34)
End Sub

Private Sub Workbook_Open()
  '一定要先引用 dll,才可以自动注册."Regsvr32 /s " 中/s是表示不出现对话框
  On Error GoTo errline
  Shell "Regsvr32 /s " & Chr(34) & ThisWorkbook.Path & "\sheetcopy1to2.dll" & Chr(34)
  Exit Sub
errline:
  MsgBox "程序在注册DLL函数时出现错误!"
End Sub

也可以在Windows 开始菜单下的运行命令对话框中运行 Regsvr32 "DLL全路径/文件名.dll" 来注册DLL文件

3)VBA中使用DLL的过程和函数,代码示例如下
VBE下新建如下模块:
Sub mycopy1to2()
 Dim bb As New mycopy1to2        '定义bb为DLL中的类mycopy1to2
 bb.copy12 1, 2                            '表格1内容到表格2,使用类mycopy1to2新实例bb的过程
 Set bb = Nothing
End Sub

Sub mycopy2to3()
 Dim bb As New mycopy1to2
 bb.copy12 2, 3                           '表格2内容到表格3
 Set bb = Nothing
End Sub

Sub mycopy3to1()
 Dim bb As New mycopy1to2
 bb.copy12 3, 1
 Set bb = Nothing
End Sub

Sub string1()
 Dim aa As Variant
 Dim bb As New mycopy1to2       '定义bb为DLL中类 mycopy1to2 新实例
 aa = bb.Getstrgs(Cells(1, 1), Cells(1, 2), Cells(1, 3)) 
 '使用类mycopy1to2新实例bb的函数
 For i = 0 To UBound(aa)                       
    '用DLL中类的函数求字符串的各子串
    Cells(i + 2, 1) = aa(i)
Next
 Set bb = Nothing
End Sub

   代码能理解多少就多少,这是次要的,主要是学会如何轻松使用DLL保护自己的VBA代码。学到这,相信大家应该已经会制作DLL文件和在VBA中使用它了。

[此贴子已经被作者于2006-7-23 18:25:15编辑过]

TA的精华主题

TA的得分主题

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

动态连接库DLL的制作和使用 示例

 

yjfkONrU.rar (17.66 KB, 下载次数: 794)

TA的精华主题

TA的得分主题

发表于 2006-7-23 18:32 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2006-7-23 18:55 | 显示全部楼层
继续努力,我居然幸运的占有了 100 楼!
[此贴子已经被作者于2006-7-23 18:55:56编辑过]

TA的精华主题

TA的得分主题

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

2) 获得硬盘物理地址

为什么要获得物理地址,那是因为电脑上唯一不变的就是硬盘物理地址号码。比如网卡的物理地址,大家都会改动。因此获得该硬盘物理地址号码用来加密和注册,便显得非常之重要。其获得地址的代码如示例,由于其较长,所以这里就省略。实际使用时,把该代码和注册加密的代码封装到DLL库中使用。

 

7jUFuldH.rar (20.32 KB, 下载次数: 473)
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-4-28 20:15 , Processed in 0.041460 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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