|
楼主 |
发表于 2014-10-23 16:15
|
显示全部楼层
本帖最后由 zhanglei1371 于 2014-10-23 17:04 编辑
需要的软件:VB6.0
office版本:2003
封装方法一、制作成为ActiveX dll其实对于这个个人感觉不如COM加载项有优势,因为对象支持的不如com加载项多。不过既然是dll,肯定能起到保护代码,无法被查看,即使使用vb_decompiler,得到的也是一堆垃圾,根本看不出有价值的东西。可以同时做出通用于word、excel、ppt的dll。
如下图:
封装为dll后即使用反编译软件vbdecompile查看,能看到标题,但内容却是和乱码无异。没有任何价值。
和com相比缺点:无法产生菜单、按钮。【也许可以,不过没找到教程介绍增加按钮的。】
实质:其实就是将过程搞进类模块中,然后通过类模块来执行相应的子过程。
步骤:
1. VB中创建工程:选择ACtiveXdll,右侧修改类模块名字为自己想要的名字,我的为MC。
2. 左侧窗口输入代码:
从我一年前发的得意之作中选几个作为测试代码:
http://club.excelhome.net/thread-1048572-1-1.html
- Public wd As Word.Application
- 'word中range、bookmarks、document、filedialog非vb对象,故需修改为object对象,所有对应的常量都应设置为值!
- Sub excel测试()
- Dim ex As Excel.Application
- Set ex = GetObject(, "excel.application")
- ex.ActiveSheet.Range("D3") = 456789
- ex.ActiveSheet.Range("F6").Value = "这是一个测试!!!"
- End Sub
- Sub word写入测试()
- 'On Error Resume Next
- Dim wd As Word.Application
- Set wd = GetObject(, "word.application")
- wd.Selection.TypeText "12345678" & vbNewLine
- wd.ActiveDocument.Range.InsertAfter "sdafasdfsadf45856"
- MsgBox "sdafsdaf"
- End Sub
- Sub ppt写入测试()
- Dim pt As PowerPoint.Application
- Set pt = GetObject(, "powerpoint.application")
- pt.ActivePresentation.Slides(1).Shapes(1).TextFrame.TextRange = "这是本类模块在ppt中的一个测试!" '写入第一个ppt中第一页的第一个文本框
- pt.ActiveWindow.Selection.TextRange.Text = "这个是对ppt中选定文本框写入的一个测试!!!" '写入选定文本框
- End Sub
- Sub 删除全文空白行()
- Dim t#
- Set wd = GetObject(, "word.application")
- wd.ScreenUpdating = 0
- t = Timer
- Dim S As Object
- Set S = wd.ActiveDocument.Content '
- S.Find.Execute "^13[ ^t" & ChrW(160) & "^11^13]{1,}", , , 2, , , , , , "^p", 2
- Set S = Nothing
- wd.ScreenUpdating = 1
- End Sub
- Sub 计算()
- Set wd = GetObject(, "word.application")
- a = 4
- B = 5
- MsgBox a + B
- wd.ActiveDocument.Content.InsertAfter a & B
- End Sub
- Sub 自动编号替换为手动编号()
- Dim S As Object
- Set wd = GetObject(, "word.application")
- If wd.Selection.Type = wdSelectionIP Then wd.Selection.Expand wdParagraph
- Set S = wd.Selection.Range
- wd.Selection.Range.ListFormat.ConvertNumbersToText
- With wd.Selection.Find
- .ClearFormatting
- .Replacement.ClearFormatting
- .Text = "([0-9]{1,})([..、^9^32" & ChrW(160) & ChrW(12288) & "]{1,})"
- .Wrap = 0
- .Replacement.Text = "\1. " '此处可改为顿号或其他
- .MatchWildcards = 1
- .Execute Replace:=wdReplaceAll
- End With
- End Sub
- Sub 每行插入表格n个图()
- On Error Resume Next
- Set wd = GetObject(, "word.application")
- wd.ScreenUpdating = False
- Dim D As Object, a, P As InlineShape, t As Table
- Dim B$, C$ '这里就体现了不定义变量的缺点:不定义的话生成的图片下面没有名字。
- If wd.Selection.Information(wdWithInTable) = True Then MsgBox "请将光标置于表格之外!": Exit Sub
- With wd.FileDialog(1) '★★★若是此处写成msoFileDialogFilePicker则不起作用,因为filedialog不是vb的对象,是vba特有,故其所有常量都应写值!!!★★★
- .Title = "请选择..."
- If .Show = -1 Then
- n = InputBox("请输入表格的列数:", "列数", 3)
- m = .SelectedItems.Count
- Debug.Print "共有" & m & "个图片"; m
- h = IIf(m / n = Int(m / n), 2 * m / n, 2 * (Int(m / n) + 1))
- Set t = wd.ActiveDocument.Tables.Add(wd.Selection.Range, h, n)
- t.Borders.Enable = True
- t.Borders.OutsideLineStyle = wdLineStyleDouble
- For Each a In .SelectedItems
- B = Split(a, "")(UBound(Split(a, "")))
- C = Split(B, ".")(0)
- Set P = wd.Selection.InlineShapes.AddPicture(FileName:=a, SaveWithDocument:=True)
- With P
- w = .Width
- .Width = Int(410 / n)
- .Height = .Width * .Height / w
- End With
- i = i + 1
- wd.Selection.MoveLeft wdCharacter, 1
- wd.Selection.MoveDown wdLine, 1
- wd.Selection.TypeText C
- wd.Selection.Cells(1).Select
- wd.Selection.ParagraphFormat.Alignment = wdAlignParagraphCenter '决定了首行居中
- wd.Selection.HomeKey
- wd.Selection.MoveDown wdLine, -1
- wd.Selection.MoveRight wdCharacter, 2
- Debug.Print i, n
- If i = Val(n) Then
- wd.Selection.MoveRight wdCharacter, 1
- wd.Selection.Cells(1).Select
- wd.Selection.EndKey
- wd.Selection.MoveDown wdLine, 1
- i = 0
- End If
- Next
- End If
- End With
- wd.ScreenUpdating = True
- End Sub
复制代码 这里有几个注意事项,也就是涉及到代码需要修改的地方:
1. wd程序方面:必须有这句:Set wd = GetObject(, "word.application"),否则所以的word操作都是空的!
2. 有些对象需要设置为object:如bookmarks、document、filedialog、range,暂时我就发现这几个;其常量需要修改为值。上面的filedialog(1)中的1就是例子
3. 这种方式不仅可以用于word,还能用于ppt、excel,需要点击工程 →引用 →勾选相关项目:
确定即可。
没有问题后就点文件 →生成工程1.dll即可。
其实这里是比较简单的,有什么问题,点生成dll时会有相关提示,按照提示去修改即可。
不过难点就是无法像vba那样方便的调试。出一点问题就需要测试半天,麻烦的要死...
OK,下一步就是调用dll了。
|
|