ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 11903|回复: 14

[VBA程序开发] [转帖]CSDN-文档中心-有关office中的VB(VBA)编程应用

[复制链接]

TA的精华主题

TA的得分主题

发表于 2005-1-9 00:10 | 显示全部楼层 |阅读模式

标题 用VB+WORD模版+数据库来制作格式合同的方法 选择自 SoHo_Andy 的 Blog 关键字 WORD 模版 数据库 合同 VBA 出处 CSDN - 文档中心 - Visual Basic

用VB+WORD模版+数据库来制作格式合同的方法

概述:在应用程序中经常有定制格式报表的需要,如打印合同、货物清单、备忘录等等,使用第三方报表软件可以实现但是比较繁琐,实际上利用Word的自动化编程,使用VBA可以完成类似的功能,而且很实用。

步骤一、

word模版制作:

在第一行是合同标题 " 【书签1合同标题xxxxxxxx合同】"

第二行

******************************

合同编号: 【书签2合同编号】

签约单位: 【书签3签约单位】

签约地址: 【书签4签约地址】

签约日期: 【书签5签约日期】

.....

表格第一行 '表格第一行第一列中插入 书签4

表格第二行

...

货物名称 数量 规格
【书签6货物清单】
'实现代码如下

Dim cn As New ADODB.Connection

Dim AdoRs As New ADODB.Recordset

Dim WordTemps As New Word.Application

Private Sub Form_Load()

If cn.State = 1 Then

cn.Close

End If

cn.CursorLocation = adUseClient

cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\db1.mdb"

End Sub

'开始导出数据

Private Sub Command1_Click()

Dim strSQl As String

Dim REC As Integer

Dim i As Integer

WordTemps.Documents.Add App.Path + "\货物合同.doc", False

WordTemps.Selection.GoTo wdGoToBookmark, , , "合同标题"

WordTemps.Selection.TypeText “关于冬季货物的成交合同”

WordTemps.Selection.GoTo wdGoToBookmark, , , "合同编号"

WordTemps.Selection.TypeText “2004000001”

WordTemps.Selection.GoTo wdGoToBookmark, , , "签约单位"

WordTemps.Selection.TypeText “宏大科技公司,天天科技公司”

WordTemps.Selection.GoTo wdGoToBookmark, , , "签约地址"

WordTemps.Selection.TypeText “北京中关村大厦”

WordTemps.Selection.GoTo wdGoToBookmark, , , "签约时间"

WordTemps.Selection.TypeText fromat(Now, "yyyy-mm-dd")

strSQl = "select * from Matrixs"

AdoRs.Open strSQl, cn, adOpenKeyset, adLockOptimistic

REC = AdoRs.RecordCount

If REC < 1 Then

MsgBox "无商品记录!", vbOKOnly, "提示"

AdoRs.Close

Exit Sub

Else

AdoRs.MoveFirst

WordTemps.Selection.GoTo wdGoToBookmark, , , "货物清单"

For i = 1 To REC

WordTemps.Selection.TypeText AdoRs!名称

WordTemps.Selection.MoveRight unit:=wdCharacter, Count:=1 '右移一格

WordTemps.Selection.TypeText AdoRs!数量

WordTemps.Selection.MoveRight unit:=wdCharacter, Count:=1 '右移一格

WordTemps.Selection.TypeText AdoRs!规格

AdoRs.MoveNext

If AdoRs.EOF = False Then

WordTemps.Selection.InsertRowsBelow 1 '表格换行

End If

Next i

AdoRs.Close

WordTemps.Visible = True '显示WORD窗口

End If

End Sub

作者:soho_andy(冰)

[em08]
[此贴子已经被作者于2005-1-9 0:53:54编辑过]

TA的精华主题

TA的得分主题

 楼主| 发表于 2005-1-9 00:15 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

标题 Visual Basic 导出到 Excel 提速之法 选择自 lihonggen0 的 Blog 关键字 Excel 出处 CSDN - 文档中心 - Visual Basic

Excel 是一个非常优秀的报表制作软件,用VBA可以控制其生成优秀的报表,本文通过添加查询语句的方法,即用Excel中的获取外部数据的功能将数据很快地从一个查询语句中捕获到EXCEL中,比起往每个CELL里写数据的方法提高许多倍。

将下文加入到一个模块中,屏幕中调用如下ExporToExcel("select * from table")则实现将其导出到EXCEL中

Public Function ExporToExcel(strOpen As String) '********************************************************* '* 名称:ExporToExcel '* 功能:导出数据到EXCEL '* 用法:ExporToExcel(sql查询字符串) '********************************************************* Dim Rs_Data As New ADODB.Recordset Dim Irowcount As Integer Dim Icolcount As Integer Dim xlApp As New Excel.Application Dim xlBook As Excel.Workbook Dim xlSheet As Excel.Worksheet Dim xlQuery As Excel.QueryTable With Rs_Data If .State = adStateOpen Then .Close End If .ActiveConnection = Cn .CursorLocation = adUseClient .CursorType = adOpenStatic .LockType = adLockReadOnly .Source = strOpen .Open End With With Rs_Data If .RecordCount < 1 Then MsgBox ("没有记录!") Exit Function End If '记录总数 Irowcount = .RecordCount '字段总数 Icolcount = .Fields.Count End With Set xlApp = CreateObject("Excel.Application") Set xlBook = Nothing Set xlSheet = Nothing Set xlBook = xlApp.Workbooks().Add Set xlSheet = xlBook.Worksheets("sheet1") xlApp.Visible = True '添加查询语句,导入EXCEL数据 Set xlQuery = xlSheet.QueryTables.Add(Rs_Data, xlSheet.Range("a1")) With xlQuery .FieldNames = True .RowNumbers = False .FillAdjacentFormulas = False .PreserveFormatting = True .RefreshOnFileOpen = False .BackgroundQuery = True .RefreshStyle = xlInsertDeleteCells .SavePassword = True .SaveData = True .AdjustColumnWidth = True .RefreshPeriod = 0 .PreserveColumnInfo = True End With xlQuery.FieldNames = True '显示字段名 xlQuery.Refresh With xlSheet .Range(.Cells(1, 1), .Cells(1, Icolcount)).Font.Name = "黑体" '设标题为黑体字 .Range(.Cells(1, 1), .Cells(1, Icolcount)).Font.Bold = True '标题字体加粗 .Range(.Cells(1, 1), .Cells(Irowcount + 1, Icolcount)).Borders.LineStyle = xlContinuous '设表格边框样式 End With With xlSheet.PageSetup .LeftHeader = "" & Chr(10) & "&""楷体_GB2312,常规""&10公司名称:" ' & Gsmc .CenterHeader = "&""楷体_GB2312,常规""公司人员情况表&""宋体,常规""" & Chr(10) & "&""楷体_GB2312,常规""&10日 期:" .RightHeader = "" & Chr(10) & "&""楷体_GB2312,常规""&10单位:" .LeftFooter = "&""楷体_GB2312,常规""&10制表人:" .CenterFooter = "&""楷体_GB2312,常规""&10制表日期:" .RightFooter = "&""楷体_GB2312,常规""&10第&P页 共&N页" End With xlApp.Application.Visible = True Set xlApp = Nothing '"交还控制给Excel Set xlBook = Nothing Set xlSheet = Nothing

End Function

注:须在程序中引用'Microsoft Excel 9.0 Object Library'和ADO对象,机器必装Excel 2000

本程序在Windows 98/2000,VB 6 下运行通过。

作者Blog:http://blog.csdn.net/lihonggen0/

[em08]

TA的精华主题

TA的得分主题

 楼主| 发表于 2005-1-9 00:22 | 显示全部楼层

标题 在Outlook中添加自己的菜单 选择自 technofantasy 的 Blog 关键字 COM Add-in Outlook 出处 CSDN - 文档中心 - Visual Basic

在Outlook中添加自己的菜单

在Microsoft Office 2000中有一个新的功能:COM加载项(COM Add-In)。利用COM加载项,我们可以通过编写COM组件实现将自己的软件集成在Office系列产品中。例如金山词霸.Net就是利用COM加载项实现添加按钮到Word中。

下面的文章将通过如何通过VB编程实现添加按钮到OutLook象大家介绍如何实现COM加载项。要在VB中建立COM加载项,首先需要建立一个ActiveX DLL工程,然后在工程中建立一个类(Class),在类代码中实现Office规定的IDTExtensibility2接口。如果有读者做过或者接触过Shell扩展编程(Shell Extension)和接口(Interface)的话,这些可能都很好理解。如果没有接触过。可以将我们的COM加载项看成服务器,Outlook作为客户,客户如何调用服务器的功能呢?这就需要有一个规范,或者称为协议。服务器只要实现了协议规定的代码,客户就可以直接通过协议来调用服务器程序了,而不用管服务器是如何实现协议的,而Windows编程中接口 就是这样的协议。

下面来介绍如何实现COM加载项。首先建立一个新的 ActiveX DLL工程,VB会自动添加一个Class Module:Class1,将Class1的Name属性改为clsOutLook,将工程的Name属性改为MyOutlook,然后保存工程。要实现IDTExtensibility2接口,必须引入对IDTExtensibility2接口的定义。另外我们还需要引入Office以及Outlook库,点击菜单 Project | References 项,在 引用列表中选中如下的三项: Microsoft Add-in Desing Microsoft Outlook 9.0 Object Library Microsoft Office 10.0 Object Library 如下图所示:

然后打开clsOutLook,在其中添加如下代码: Option Explicit

Implements IDTExtensibility2

Dim WithEvents objApp As Outlook.Application Dim objButton As Office.CommandBarButton Dim objBar As Office.CommandBars Dim objMenuBar As Office.CommandBar Dim objFolder As Outlook.MAPIFolder

Dim WithEvents objMyButton As Office.CommandBarButton Dim WithEvents objResetBar As Office.CommandBarButton Dim WithEvents objNameSpace As Outlook.NameSpace

Private Sub IDTExtensibility2_OnAddInsUpdate(custom() As Variant) 'MsgBox "执行 " End Sub

Private Sub IDTExtensibility2_OnBeginShutdown(custom() As Variant) MsgBox "对象将被关闭!" Set objApp = Nothing Set objBar = Nothing Set objButton = Nothing Set objFolder = Nothing Set objMenuBar = Nothing Set objMyButton = Nothing Set objNameSpace = Nothing Set objResetBar = Nothing End Sub

Private Sub IDTExtensibility2_OnConnection(ByVal Application As Object, ByVal ConnectMode _ As AddInDesignerObjects.ext_ConnectMode, ByVal AddInInst As Object, custom() As Variant)

Dim objMyControl As Object MsgBox "连接到 Add-ins对象上" ' 获得Outlook的 Application 对象. Set objApp = Application ' 获得OutLook的MAPI NameSpace Namespace. Set objNameSpace = objApp.GetNamespace("MAPI") '弹出文件夹选择框 Set objFolder = objNameSpace.PickFolder() '添加及工具栏 Set objBar = objApp.ActiveExplorer.CommandBars Set objMenuBar = objBar.Add("我的菜单", , True, True) objMenuBar.Visible = True '添加主菜单 Set objMyControl = _ objMenuBar.Controls.Add(msoControlPopup, , , , True) objMyControl.Caption = "&Menu Item" ' 添加菜单项 Set objResetBar = objMyControl.Controls.Add( _ Type:=msoControlButton, Temporary:=True, Before:=1) objResetBar.Caption = "&Reset Menu" objResetBar.Enabled = True Set objMyButton = objMyControl.Controls.Add( _ Type:=msoControlButton, Temporary:=True, Before:=1) objMyButton.Caption = "&Test Menu" objMyButton.Enabled = True

End Sub

Private Sub IDTExtensibility2_OnDisconnection(ByVal RemoveMode As _ AddInDesignerObjects.ext_DisconnectMode, custom() As Variant) ' End Sub

Private Sub IDTExtensibility2_OnStartupComplete(custom() As Variant) ' End Sub

Private Sub objApp_ItemSend(ByVal Item As Object, Cancel As Boolean) Dim Prompt As String Prompt = "你确定要发送邮件: " & Item.Subject & "吗?" If MsgBox(Prompt$, vbYesNo + vbQuestion, "") = vbNo Then Cancel = True End If End Sub

Private Sub objResetBar_Click(ByVal Ctrl As Office.CommandBarButton, _ CancelDefault As Boolean) objMenuBar.Delete End Sub

保存工程,然后编译到MyOutlook.dll,COM加载项程序的代码就完成了。接下来需要 注册组件,Windows提供了regsvr32.exe供注册组件,方法是在Dos命令行下敲入:

regsvr32 MyOutlook.dll

系统就将MyOutlook添加到注册表中,打开注册表编辑器,可以在注册表中找到如下的注册项:

注:上图中左边列表中的Guid同你生成的会有不同,这个Guid是系统随即产生的。

打开文本编辑器,输入如下的内容: Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\Office\Outlook\Addins\MyOutlook.clsOutlook] "CommandLineSafe"=dword:00000000 "Description"="Outlook samples" "FriendlyName"="Outlook samples" "LoadBehavior"=dword:00000003

将上面输入的内容保存到以reg为后缀的文件,然后双击将其合并到注册表中。

COM加载项现在已经全部建立完毕并且连接到Outlook中了。打开Outlook,会弹出消息框提示: "连接到 Add-ins对象上",然后弹出文件夹选择框。在outlook窗口中,可以看到多了一个菜单项, 如下图所示:

现在建立一个新邮件,然后发送,系统会提示你:"你确定要发送邮件: 吗?"。点击取消, 将不会发送邮件。

现在来看上面的代码,在代码中我们实现了IDTExtensibility2接口,Outlook在启动时会调用接 口的OnConnection方法,将自身的Application对象作为参数ByVal Application As Object传递过去 我们只要在实现OnConnection方法时获得Application对象就可以访问Outlook中的诸如工具栏、文件 夹、联系人等对象了。 在Outlook关闭时会调用OnBeginShutdown方法,我们需要在实现该方法的代码中释放建立的所有 对象。IDTExtensibility2接口的另外三个方法我们不需要实现,但是代码要写在那里。否则程序会无 法编译通过。要断开COM加载项与Outlook的连接,我们只要打开注册表编辑器,转到下面的项:

HKEY_CURRENT_USER\Software\Microsoft\Office\Outlook\Addins

将其下的MyOutlook.clsOutlook项删除就可以了。

以上程序在Win2000中文版、Office 2000中文版、VB6下编译运行通过

作者Blog:http://blog.csdn.net/technofantasy/

[em08]

TA的精华主题

TA的得分主题

 楼主| 发表于 2005-1-9 00:24 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

标题 将阿拉伯数字转成中文字 选择自 firetoucher 的 Blog 关键字 阿拉伯数字 出处 CSDN - 文档中心 - Visual Basic

Private Function CChinese(StrEng As String) As String If Not IsNumeric(StrEng) Or StrEng Like "*.*" Or StrEng Like "*-*" Then If Trim(StrEng) <> "" Then MsgBox "无效的数字" CChinese = "": Exit Function End If Dim intLen As Integer, intCounter As Integer Dim strCh As String, strTempCh As String Dim strSeqCh1 As String, strSeqCh2 As String Dim strEng2Ch As String strEng2Ch = "零壹贰叁肆伍陆柒捌玖" strSeqCh1 = " 拾佰仟 拾佰仟 拾佰仟 拾佰仟" strSeqCh2 = " 万亿兆" StrEng = CStr(CDec(StrEng)) intLen = Len(StrEng) For intCounter = 1 To intLen strTempCh = Mid(strEng2Ch, Val(Mid(StrEng, intCounter, 1)) + 1, 1) If strTempCh = "零" And intLen <> 1 Then If Mid(StrEng, intCounter + 1, 1) = "0" Or (intLen - intCounter + 1) Mod 4 = 1 Then strTempCh = "" End If Else strTempCh = strTempCh & Trim(Mid(strSeqCh1, intLen - intCounter + 1, 1)) End If If (intLen - intCounter + 1) Mod 4 = 1 Then strTempCh = strTempCh & Mid(strSeqCh2, (intLen - intCounter + 1) \ 4 + 1, 1) If intCounter > 3 Then If Mid(StrEng, intCounter - 3, 4) = "0000" Then strTempCh = Left(strTempCh, Len(strTempCh) - 1) End If End If strCh = strCh & Trim(strTempCh) Next CChinese = strCh End Function

作者Blog:http://blog.csdn.net/firetoucher/

[em08]

TA的精华主题

TA的得分主题

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

标题 在word中动态创建菜单并处理菜单点击事件的代码-- 选择自 hnlzh 的 Blog 关键字 vba,menu 出处 CSDN - 文档中心 - Visual Basic

Sub Create_Menu() Const Menu_Name As String = "My New Main_Menu" Dim Before_number As Integer Dim X As Integer

On Error Resume Next CommandBars("Menu Bar").Controls(Menu_Name).Delete '删除最后菜单 Before_number = CommandBars("Menu Bar").Controls.Count + 1

Err.Clear X = 1 '删除历史自定义菜单 Do Until Err.Number <> 0 CommandBars("Custom Popup " & X).Delete X = X + 1 Loop Err.Clear CommandBars("Menu Bar").Controls.Add Type:=msoControlPopup, Before:=Before_number CommandBars("Menu Bar").Controls(Before_number).Caption = Menu_Name For X = 1 To 10 '这里可以加入数据库的访问代码 CommandBars("Custom Popup 1").Controls.Add Type:=msoControlButton, Before:=X CommandBars("Custom Popup 1").Controls(X).Caption = "吸海垂虹" & X CommandBars("Custom Popup 1").Controls(X).OnAction = "NewMacros.Proc_Menu" Next

End Sub

Sub Proc_Menu() '这里可以加入菜单的处理代码 MsgBox CommandBars.ActionControl.Caption End Sub

作者Blog:http://blog.csdn.net/hnlzh/

[em08]

TA的精华主题

TA的得分主题

 楼主| 发表于 2005-1-9 00:28 | 显示全部楼层

标题 货币数字转化为大写格式 选择自 sindia 的 Blog 关键字 货币转化,大写 出处 CSDN - 文档中心 - Visual Basic Dim CHAp(21, 1) 初始化:

CHAp(0, 0) = "万": CHAp(0, 1) = 10000 CHAp(1, 0) = "仟": CHAp(1, 1) = 1000 CHAp(2, 0) = "佰": CHAp(2, 1) = 100 CHAp(3, 0) = "拾": CHAp(3, 1) = 10 CHAp(4, 0) = "元": CHAp(4, 1) = 1 CHAp(5, 0) = "角": CHAp(5, 1) = 0.1 CHAp(6, 0) = "分": CHAp(6, 1) = 0.01 CHAp(11, 0) = "壹": CHAp(11, 1) = 1 CHAp(12, 0) = "贰": CHAp(12, 1) = 2 CHAp(13, 0) = "叁": CHAp(13, 1) = 3 CHAp(14, 0) = "肆": CHAp(14, 1) = 4 CHAp(15, 0) = "伍": CHAp(15, 1) = 5 CHAp(16, 0) = "陆": CHAp(16, 1) = 6 CHAp(17, 0) = "柒": CHAp(17, 1) = 7 CHAp(18, 0) = "捌": CHAp(18, 1) = 8 CHAp(19, 0) = "玖": CHAp(19, 1) = 9 CHAp(20, 0) = "零": CHAp(20, 1) = 0 CHAp(21, 0) = "亿": CHAp(21, 1) = 100000000

Function SubtoChinese(price As Integer) '转化千百十 Dim i As Integer Dim num(15) As Integer i = 1 Do Until price = 0 num(i) = Int(price / CHAp(i, 1)) If num(i) <> 0 Then SubtoChinese = SubtoChinese & CHAp(num(i) + 10, 0) & CHAp(i, 0) price = price - num(i) * CHAp(i, 1) Else If SubtoChinese <> "" And Right(SubtoChinese, 1) <> "零" Then SubtoChinese = SubtoChinese & "零" End If End If i = i + 1 Loop If Right(SubtoChinese, 1) = "元" Then SubtoChinese = Left(SubtoChinese, Len(SubtoChinese) - 1) End If End Function

Function PricetoChinese(price As Double) If price >= 100000000 Then '大于1亿 PricetoChinese = PricetoChinese & PricetoChinese(Int(price / 100000000)) & "亿" price = price - Int(price / 100000000) * 100000000 End If If price >= 10000 Then PricetoChinese = PricetoChinese & SubtoChinese(Int(price / 10000)) & "万" price = price - Int(price / 10000) * 10000 End If If Int(price) <> 0 Then '如果万与千间无数,则应添零 If PricetoChinese <> "" And Int(price) < 1000 Then PricetoChinese = PricetoChinese & "零" End If PricetoChinese = PricetoChinese & SubtoChinese(Int(price)) price = price - Int(price) End If If PricetoChinese <> "" Then PricetoChinese = PricetoChinese & "元" If price = 0 Then '到元为止 PricetoChinese = PricetoChinese & "整" Else price = Int(price * 100) If Int(price / 10) <> 0 Then PricetoChinese = PricetoChinese & CHAp(Int(price / 10) + 10, 0) & "角" price = price - Int(price / 10) * 10 End If If price <> 0 Then PricetoChinese = PricetoChinese & CHAp(Int(price) + 10, 0) & "分" End If End If End Function 调用时:PricetoChinese(123432435.345)

作者Blog:http://blog.csdn.net/sindia/

[em08]

TA的精华主题

TA的得分主题

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

标题 一组有用的操作Excel的函数 选择自 redcoral 的 Blog 关键字 Excel,VBA 出处 CSDN - 文档中心 - Visual Basic

在用VB做程序的时候,它本身的报表并不太好使用,因此应用Excel输出数据,是一个好方法,以下是一组操纵Excel的函数据,希望能帮助大家.

'Excel VBA控制函数

'Write By WeiHua 2000.10.12

'检测文件 Function CheckFile(ByVal strFile As String) As Boolean Dim FileXls As Object Set FileXls = CreateObject("Scripting.FileSystemObject")

If IsNull(strFile) Or strFile = "" Then CheckFile = False Exit Function End If

If FileXls.FileExists(strFile) = False Then CheckFile = False Set FileXls = Nothing Exit Function Else CheckFile = True Set FileXls = Nothing End If End Function '检测工作表 Function CheckSheet(ByVal strSheet As String, ByVal strWorkBook As String, xlCheckApp As Excel.Application) As Boolean Dim L As Integer Dim CheckWorkBook As Excel.Workbook

If CheckFile(strWorkBook) And strSheet <> "" And Not IsNull(strSheet) Then For L = 1 To xlCheckApp.Workbooks.Count If GetPath(xlCheckApp.Workbooks(L).Path) & xlCheckApp.Workbooks(L).Name = strWorkBook Then Set CheckWorkBook = xlCheckApp.Workbooks(L) Exit For End If Next L Set CheckWorkBook = xlCheckApp.Workbooks.Open(strWorkBook) For L = 1 To CheckWorkBook.Worksheets.Count If CheckWorkBook.Worksheets(L).Name = Trim(strSheet) Then CheckSheet = True Exit For End If Next L

Else MsgBox "工作表不存在,可能是由文件名或工作表名引起的!" CheckSheet = False End If

End Function

'建立工作表 'CreateMethod:1追加 'CreateMethod:2覆盖 Function CreateSheet(ByVal strSheetName As String, ByVal strWorkBook As String, ByVal CreateMethod As Integer, xlCreateApp As Excel.Application) As Boolean Dim xlCreateSheet As Excel.Worksheet

If CheckFile(strWorkBook) Then xlCreateApp.Workbooks.Open (strWorkBook) If CreateMethod = 1 Then If CheckSheet(strSheetName, strWorkBook, xlCreateApp) = False Then Set xlCreateSheet = xlCreateApp.Worksheets.Add xlCreateSheet.Name = strSheetName xlCreateApp.ActiveWorkbook.Save CreateSheet = True Set xlCreateSheet = Nothing Else 'MsgBox strSheetName & "工作表已存在!" CreateSheet = False Set xlCreateSheet = Nothing End If ElseIf CreateMethod = 2 Then If CheckSheet(strSheetName, strWorkBook, xlCreateApp) = True Then Set xlCreateSheet = xlCreateApp.Worksheets(strSheetName) xlCreateSheet.Cells.Select xlCreateSheet.Cells.Delete xlCreateApp.ActiveWorkbook.Save CreateSheet = True Set xlCreateSheet = Nothing Else 'MsgBox strSheetName & "工作表不存在!" CreateSheet = False Set xlCreateSheet = Nothing End If End If End If

End Function '删除工作表 Function DeleteSheet(ByVal strSheetName As String, ByVal strWorkBook As String, xlDeleteApp As Excel.Application) As Boolean Dim i As Integer Dim xlDeleteSheet As Excel.Worksheet If CheckFile(strWorkBook) Then If CheckSheet(strSheetName, strWorkBook, xlDeleteApp) = True Then xlDeleteApp.Workbooks.Open (strWorkBook) If xlDeleteApp.Worksheets.Count = 1 Then MsgBox "工作薄不能全部删除," & strSheetName & "是最后一个工作表!" DeleteSheet = False Exit Function End If xlDeleteApp.Worksheets(strSheetName).Delete

xlDeleteApp.ActiveWorkbook.Save DeleteSheet = True Else DeleteSheet = False End If End If

End Function

'复制工作表 Function CopySheet(ByVal strSrcSheetName As String, ByVal strSrcWorkBook As String, ByVal strTagSheetName As String, ByVal strTagWorkbook As String, xlCopyApp As Excel.Application) As Boolean Dim xlSrcBook As Excel.Workbook Dim xlTagBook As Excel.Workbook Dim ExcelSource As Excel.Worksheet Dim ExcelTarget As Excel.Worksheet Dim Result As Boolean

If CheckFile(strSrcWorkBook) = False Or CheckFile(strTagWorkbook) = False Then Set ExcelSource = Nothing Set ExcelTarget = Nothing Set xlSrcBook = Nothing Set xlTagBook = Nothing CopySheet = False Exit Function Else

Set xlSrcBook = xlCopyApp.Workbooks.Open(strSrcWorkBook) If strSrcWorkBook = strTagWorkbook Then If strSrcSheetName = strTagSheetName Then Set ExcelSource = Nothing Set ExcelTarget = Nothing Set xlSrcBook = Nothing Set xlTagBook = Nothing CopySheet = False Exit Function End If Set xlTagBook = xlSrcBook Else Set xlTagBook = xlCopyApp.Workbooks.Open(strTagWorkbook) End If Set ExcelSource = xlSrcBook.Worksheets(strSrcSheetName) Set ExcelTarget = xlTagBook.Worksheets(strTagSheetName)

ExcelSource.Select ExcelSource.Cells.Copy ExcelTarget.Select ExcelTarget.Paste xlCopyApp.Application.CutCopyMode = xlCopy If strSrcWorkBook = strTagWorkbook Then xlTagBook.Save xlSrcBook.Save Else xlTagBook.Save End If Set ExcelSource = Nothing Set ExcelTarget = Nothing Set xlSrcBook = Nothing Set xlTagBook = Nothing CopySheet = True End If End Function '复制工作表 Function ExcelCopySheet(ByVal strSrcSheetName As String, ByVal strSrcWorkBook As String, ByVal strTagSheetName As String, ByVal strTagWorkbook As String, xlCopyApp As Excel.Application) As Boolean Dim xlSrcBook As Excel.Workbook Dim xlTagBook As Excel.Workbook Dim ExcelSource As Excel.Worksheet Dim ExcelTarget As Excel.Worksheet Dim Result As Boolean

If CheckFile(strSrcWorkBook) = False Or CheckFile(strTagWorkbook) = False Then Set ExcelSource = Nothing Set ExcelTarget = Nothing Set xlSrcBook = Nothing Set xlTagBook = Nothing CopySheet = False Exit Function Else

Set xlSrcBook = xlCopyApp.Workbooks.Open(strSrcWorkBook) If strSrcWorkBook = strTagWorkbook Then If strSrcSheetName = strTagSheetName Then Set ExcelSource = Nothing Set ExcelTarget = Nothing Set xlSrcBook = Nothing Set xlTagBook = Nothing CopySheet = False Exit Function End If Set xlTagBook = xlSrcBook Else Set xlTagBook = xlCopyApp.Workbooks.Open(strTagWorkbook) End If Set ExcelSource = xlSrcBook.Worksheets(strSrcSheetName) Set ExcelTarget = xlTagBook.Worksheets(strTagSheetName)

ExcelSource.Select ExcelSource.Copy before ExcelTarget.Select ExcelTarget.Paste xlCopyApp.Application.CutCopyMode = xlCopy If strSrcWorkBook = strTagWorkbook Then xlTagBook.Save xlSrcBook.Save Else xlTagBook.Save End If Set ExcelSource = Nothing Set ExcelTarget = Nothing Set xlSrcBook = Nothing Set xlTagBook = Nothing CopySheet = True End If End Function

'关闭Excel应用 Function CloseExcelApp(xlApp As Object) On Error Resume Next xlApp.Quit Set xlApp = Nothing End Function

'建立Excel应用 Function CreateExcelApp(QuitApp As Boolean) As Object On Error Resume Next Dim xlObject As Object If CheckExcel Then

Set xlObject = GetObject(, "Excel.Application") If err.Number <> 0 Then Set xlObject = Nothing Set xlObject = CreateObject("Excel.Application") CreateExcelApp = xlObject Else If QuitApp Then xlObject.Quit Set xlObject = Nothing Set xlObject = CreateObject("Excel.Application") End If CreateExcelApp = xlObject End If

End If

End Function

'检测EXCEL环境 Function CheckExcel() As Boolean Dim xlCheckApp As Object Set xlCheckApp = CreateObject("Excel.Application")

If xlCheckApp Is Nothing Then MsgBox "对不起,系统未检测到EXCEL安装,请重新检查EXCEL是否被正确安装!" CheckExcel = False xlCheckApp.Quit Set xlCheckApp = Nothing Exit Function Else xlCheckApp.Quit CheckExcel = True Set xlCheckApp = Nothing End If End Function

Function CreateWorkBook(ByVal strWorkBook As String, xlApp As Excel.Application) Dim xlCreateWorkBook As Excel.Workbook

Set xlCreateWorkBook = xlApp.Workbooks.Add

xlCreateWorkBook.SaveAs (strWorkBook) End Function Function GetPath(strPath As String) As String GetPath = IIf(Len(strPath) = 3, strPath, strPath & "\") End Function

这上面的函数只不过是一部分,其于的因为专用目的,写不标准,以后也许会整理出来一份标准的函数库的!w.hua@ynmail.com

作者Blog:http://blog.csdn.net/redcoral/

[em08]

TA的精华主题

TA的得分主题

 楼主| 发表于 2005-1-9 00:31 | 显示全部楼层

标题 如何保护发行的软件中Access数据库不被别人打开 选择自 arfayr 的 Blog 关键字 Access,VB 出处 CSDN - 文档中心 - Visual Basic

用Access工作组工具定义一个工作组如:MyOwnAccess,添加一个用户如:MySelf,用这个用户登陆,然后把老数据库倒过来,定义所有的功能只给MySelf一个人,让其他的用户没有任何权限。

然后把工作组文件一起打包,修改连接Access数据库的语句,如: DRIVER=Microsoft Access Driver (*.mdb);UID=20010202;UserCommitSync=Yes;" & "SystemDB=" & App.Path & "\SYSLOG;DBQ=" & MdbPathName & ";pwd=54839202" SYSLOG为改名称后的Access工作组文件。只要把密码设置好就可以防止别人打开了。

作者Blog:http://blog.csdn.net/arfayr/

[em08]

TA的精华主题

TA的得分主题

 楼主| 发表于 2005-1-9 00:34 | 显示全部楼层

标题 使用VB实现Excel自动获取外部数据 选择自 ShowMan 的 Blog 关键字 使用VB实现Excel自动获取外部数据 出处 http://member.netease.com/~vbsoft/files CSDN - 文档中心 - Visual Basic

使用VB实现Excel自动获取外部数据 Excel表格生成和公式设置十分强大便利,是一个强有力的信息分析与处理工具。Visual Basic是一套可视化、面向对象、事件驱动方式的结构化高级程序设计语言,正成为高效率的Windows应用程序开发工具。由于微软的努力,Visual Basic应用程序版可作为一种通用宏语言被所有微软可编程应用软件共享。

Excel面始之初带有表格处理类软件中功能最强的宏语言,通过单击“工具”菜单中的“宏”,选择宏名来调用宏过程。随后发展至Visual Basic for Application专用版,可制作按钮、复选框、单选钮等控件,赋控件以宏名,单击控件运行宏,事件驱动方式就Click(单击)一种。新近推出的Office97套件中的Excel97,在“工具”菜单中选择“宏”后,就会发现增加了“Visual Basic编辑器”功能。运用这个新增功能,就完全与Visual Basic编程无异了。在菜单栏上单击鼠标右键,选择弹出式菜单中的“控件工具箱”,在“控件工具箱”工具条上,单击待添加的控件按钮,在工作表中将控件拖曳到所需位置和大小,单击鼠标右键选中“属性”设置控件属性后,双击控件就会出现Visual Basic编辑器。选择该控件的一个事件如Click或Change,编写程序。在工作表中操作该控件,如鼠标单击、键入字符等,则触发相应事件,执行相应程序。

笔者在Excel97平台,采用Visual Basic应用程序版开发了一套“通用报表分析系统”(界面如图1)。该系统用于拥有众多子公司的母公司的每月财务报表合并汇总。所有子公司的统计报表如资产负债表、损益表是由FoxBase编制的财务软件生成的dbf文件,取名为ATV001xx.dbf----xx月份资产负债表,ATV002xx.dbf----xx月份损益表等。一个子公司的所有dbf文件放在一个单独的目录中,如C:\T\palm1,C:\T\palm2等。母公司每月份生成的汇总报表为TTTyymm.xls(yy----年份,mm----月份),它有“资产负债表”、“损益表”等若干工作表组成。每张工作表是由所有子公司相应的dbf文件的相应项目的数据相加而成。只要将dbf文件逐一转化到TTTyymm.xls中去,很容易利用Excel的公式设置功能生成母公司的每张汇总报表。 这套系统的关键在于如何将所有dbf文件转换到同一个Excel工作簿中。直接通过“文件”菜单中的“打开”项, 选择文件类型为dBase文件(*.dbf), 可将dbf文件转换到Excel工作簿中,但这工作簿只存转换而来的一张工作表,其他表都自动关闭了。另外,通过“工具”菜单中的“向导”,选择“文件转换”后, 只是将一系列dbf文件转换为一系列xls文件而已。于是采用建立ODBC数据源获取外部数据的办法, 将dbf文件逐一转换到一个Excel工作簿内, 且用Visual Basic for Application将转换过程自动化。只要按一下图1中的“生成报表”按钮, 就能完成所有dbf 文件的转换, 且利用Excel公式自动计算功能完成所有报表的汇总计算。按“显示报表”按钮,选择表名,可以浏览报表数据。 具体的方法是:

一、 建立ODBC数据源 (1) 打开“数据”菜单, 选择“获取外部数据”, 然后单击“新建查询”; (2) 在“选择数据源”对话框中, 双击“<新数据源>”; (3) 出现“创建新数据源”对话框,输入数据源名称, 选择驱动程序如Microsoft dBase Driver(*.dbf), 单击“连接”; (4) 在“ODBC dBase安装”对话框中, 单击“使用当前工作目录”前的复选框, 去掉缺省( , 单击“选定目录(s)”, 选择子公司存放dbf文件的目录如C:\T\palm1, 连按“确定”; (5) 当出现Microsoft Quary对话框时, 单击“关闭”, 退出。不要理会出现的警示信息,因为此时只需建立数据源, 并不需要用Microsoft Query查询数据; (6) 重复上述步骤, 在(4)中改换另一家子公司的目录, 就为另一家子公司建立一个数据源。必须建立所有子公司的数据源。

二、手动获取外部数据 (1) 单击“数据”,选取“获取外部数据”,单击“新建查询”; (2) 出现“选取数据源”对话框,点中“使用查询向导创建/ 编辑查询”前的复选框,然后双击数据源名,如palm1; (3) 在“查询向导——选择列”对话框中选择一个查询表名,单击 > 键,“查询中用到的列”框内会出现表中所有列名,单击“下一步”; (4) 出现“查询向导——过滤数据”,单击“下一步”; (5) 出现“查询向导——排序顺序”,单击“下一步”; (6) 出现“查询向导——完成”,点中“将数据返回Microsoft Excel”前的单选钮,单击“完成”; (7) 出现“将外部数据返回到Excel”对话框,选中“新建工作表”,按“确定”; (8) 在建立查询的工作簿内新建工作表,并放入转换好的数据。这样就将一个 dbf 文件转换好了。 (9)重复上述过程,所有子公司的dbf文件转换到同一个工作簿中。

三、 使用VB实现Excel自动获取外部数据 (1) 进行手动获取外部数据(1)步骤前,单击“工具”菜单中的“宏”,选择“录制新宏”,在“宏名”的编辑框中键入宏名dbftoxls,按“确定”键; (2) 完成手动获取外部数据(1)-(8)步骤; (3) 单击“工具”菜单中的“宏”,选择“停止录制”。这样就将获取外部数据的过程记录为宏。 (4) 编辑dbftoxls宏,加以修改,使它作为Visual Basic模块表中的一个子程序,并设置调用参数。 提供的程序如下:

`设置初值 Const apppath = "c:\my documents\palmxls\" Const modulefile = apppath + "module.xls" Const staticspre = "TTT" Const dbfpre = "ATV00"

`调用dbftoxls的模块 Private Sub Cmdgeneratetable_Click() Dim staticsfile As String Dim s1 As String Dim s2 As String Dim s3 As String Dim idyes As Integer Dim dbfstring As String

On Error GoTo errhandler1 idyes = 6 s1 = txtyear.Text s1 = Mid(s1, 3, 2) s2 = txtmonth.Text If Len(s2) = 1 Then s2 = "0" + s2 End If staticsfile = apppath + staticspre + s1 + s2 + ".xls" If FileLen(staticsfile) > 0 Then choice = MsgBox("该年月报表已存在,是否重新生成?", vbYesNo + vbExclamation + vbDefaultButton1, "") If choice = idyes Then Workbooks.Open FileName:=staticsfile For i = 0 To companynum - 1 For j = 0 To tablenum - 1 dbfstring = dbfpre + Trim(Str$(j + 1)) + s2 sqlstring = sqlstringfunc(dbfstring, fieldlist(), tablefieldnum(j)) Call dbftoxls(s(i, j), sqlstring) Next j Next i ActiveWorkbook.Save ActiveWorkbook.Close End If End If Exit Sub

errhandler1: Select Case Err Case 53 Workbooks.Open FileName:=modulefile s3 = s1 + "年" + s2 + "月" Sheets("资产负债表").Range("e4").FormulaR1C1 = "'" + s3 ActiveWorkbook.SaveAs FileName:=staticsfile, FileFormat _ :=xlNormal, Password:="", WriteResPassword:="", ReadOnlyRecommended:= _ False, CreateBackup:=False For i = 0 To companynum - 1 For j = 0 To tablenum - 1 dbfstring = dbfpre + Trim(Str$(j + 1)) + s2 sqlstring = sqlstringfunc(dbfstring, fieldlist(), tablefieldnum(j)) Call dbftoxls(s(i, j), sqlstring) Next j Next i ActiveWorkbook.Save ActiveWorkbook.Close End Select End Sub

`dbftoxls子程序 Sub dbftoxls(activesheetname, sqlstring) Sheets(activesheetname).Activate Cells.Select Selection.Clear Range("a1").Select With ActiveSheet.QueryTables.Add(Connection:=Array(Array( _ "ODBC;CollatingSequence=ASCII;DBQ=C:\T\palm1;DefaultDir=C:\T \palm1;Deleted=1;Driver={Microsoft dBase Driver (*.dbf)};DriverId=533;FIL" _ ), Array( _ "=dBase III;ImplicitCommitSync=Yes;MaxBufferSize=512;MaxScanRows= 8;PageTimeout=600;SafeTransactions=0;Statistics=0;Threads=3;Use" _ ), Array("rCommitSync=Yes;")), Destination:=Range("A1")) .Sql = Array( sqlstring) .FieldNames = True .RefreshStyle = xlInsertDeleteCells .RowNumbers = False .FillAdjacentFormulas = False .RefreshOnFileOpen = False .HasAutoFormat = True .BackgroundQuery = True .TablesOnlyFromHTML = True .Refresh BackgroundQuery:=False .SavePassword = True .SaveData = True End With End Sub

作者Blog:http://blog.csdn.net/ShowMan/

[em08]

TA的精华主题

TA的得分主题

 楼主| 发表于 2005-1-9 00:36 | 显示全部楼层

标题 VB千里行-操作Word与Excel 选择自 hktl 的 Blog 关键字 vb 出处 http://www.chinabyte.com/builder/detail.shtm?buiid=870&parid=1&cate=GJBC CSDN - 文档中心 - Visual Basic

  本文将告诉你如何使用VB代码连接Office应用程序,并简要接触一下在文件中输入数据的方法。实际上,在VB中用代码与Word和Excel进行会话并控制它们,是可行的。但是请注意,首先需要在机器上安装office应用程序,才能在VB代码中存取它们的对象。

   下面就是一些例子,告诉你如何与这些程序会话,并控制它们。

Option Explicit

Dim xlsApp As Excel.Application Dim wrdApp As Word.Application

   只要相关的对象库已经被选择,在应用程序中进行对象变量的赋值是可能的。Microsoft Excel 8.0对象库是相对于Excel的,而 Microsoft Word 8.0 对象库是为Word服务的。

   在VB的IDE环境中,从“工程”菜单中选择“引用”,可以看到系统可用的所有库列表。

Private Sub Command1_Click() Set xlsApp = Excel.Application With xlsApp 'Show Excel .Visible = True 'Create a new workbook .Workbooks.Add 'Put text in to the cell that is selected .ActiveCell.Value = "Hi" 'Put text into A3 regardless of the selected cell .Range("A3").Value = "This is an example of connecting to Excel" End With End Sub    在上面的程序段中,我们在变量xlsApp中建立了一个对象,这样Excel就对用户可见了。当Excel象这样启动后,并不包含一个工作簿,所以必须创建或者执行打开操作。这里,我们建立了一个新的工作簿,然后,就可以操作其中的信息,或者打印,或者保存,或者你任意想做的事情。

Private Sub Command2_Click() 'close the workbook xlsApp.Workbooks.Close 'Close Excel xlsApp.Quit End Sub

   上面这段代码执行关闭程序的功能。首先,关闭工作簿,这将出现一个提示对话框,询问用户是否想保存修改;然后,退出应用程序。

Private Sub Command3_Click() Set wrdApp = New Word.Application With wrdApp 'Show Word .Visible = True 'Create New Document .Documents.Add 'Add text to the document .ActiveDocument.Content.Text = "Hi" .ActiveDocument.Content.Text = "This is a test example" End With End Sub

   上面这段代码中,在变量wrdApp中设置引用Word程序的对象。同样,当Word按照这种方式启动后,不会包含一个文档,所以,必须执行建立或者打开操作。这里是建立了一个新文档,然后可以操作其中的信息了,打印、保存、发送邮件,等等...

   但是,在Word文档中放置文本并非容易!特别是与Excel一起工作时。为了简单地在特定的地方放置文本,需要有一个bookmark标记。这意味着,需要事先建立一个模板。

Private Sub Command4_Click() 'Close the current document wrdApp.ActiveDocument.Close 'Close Word wrdApp.Quit End Sub

   上面这段代码的功能是关闭应用程序。首先,关闭当前文档,这时可能需要用户保存修改。然后,退出程序。

Private Sub Form_Unload(Cancel As Integer) 'Clear the memory Set xlsApp = Nothing Set wrdApp = Nothing End Sub

   最后一段代码就是关闭VB应用程序。这是优秀程序员编程的好习惯。

   Well I hope this brief tutorial is helpful. It does not touch on much of what you can do to the office applications once they're open, but should give you an idea of how to get started.

   好了,简单的介绍到此结束。我希望能抛砖引玉,让你更加随意地操作Office应用程序!

作者Blog:http://blog.csdn.net/hktl/

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

本版积分规则

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

GMT+8, 2024-11-24 03:39 , Processed in 0.037408 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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