For i = 1 To 50'循环写入数据 For j = 1 To 5 If i = 1 ThenobjExl.Selection.NumberFormatLocal = \"@\" '设置格式为文本 objExl.Cells(i, j) = \" E \" & i & j Else
objExl.Cells(i, j) = i & j End If Next Next
objExl.Rows(\"1:1\").Select '选中第一行 objExl.Selection.Font.Bold = True'设为粗体 objExl.Selection.Font.Size = 24 '设置字体大小 objExl.Cells.EntireColumn.AutoFit '自动调整列宽 objExl.ActiveWindow.SplitRow = 1 '拆分第一行 objExl.ActiveWindow.SplitColumn = 0'拆分列 objExl.ActiveWindow.FreezePanes = True'固定拆分
objExl.ActiveSheet.PageSetup.PrintTitleRows = \"$1:$1\" '设置打印固定行 objExl.ActiveSheet.PageSetup.PrintTitleColumns = \"\"'打印标题 objExl.ActiveSheet.PageSetup.RightFooter = \"打印时间: \" & _ Format(Now, \"yyyy年mm月dd日 hh:MM:ss\")
objExl.ActiveWindow.View = xlPageBreakPreview'设置显示方式 objExl.ActiveWindow.Zoom = 100 '设置显示大小 '给工作表加密码
32
objExl.ActiveSheet.Protect \"123\ Contents:=True, Scenarios:=True
objExl.Application.IgnoreRemoteRequests = False objExl.Visible = True '使EXCEL可见
objExl.Application.WindowState = xlMaximized'EXCEL的显示方式为最大化 objExl.ActiveWindow.WindowState = xlMaximized'工作薄显示方式为最大化 objExl.SheetsInNewWorkbook = 3'将默认新工作薄数量改回3个 Set objExl = Nothing'清除对象 Me.MousePointer = 0'修改鼠标 Exit Sub err1:
objExl.SheetsInNewWorkbook = 3
objExl.DisplayAlerts = False '关闭时不提示保存 objExl.Quit'关闭EXCEL
objExl.DisplayAlerts = True'关闭时提示保存 Set objExl = Nothing Me.MousePointer = 0 End Sub
=====================================
Visual Basic简称(VB)是设计Windows应用程序强有力的开发工具,“全球绝大多数Windows应用程序都是用VB开发的”; Excel是目前使用最广泛的办公应用软件之一,它具有强大的数学分析与计算功能,包括很多VB没有的求值数学表达式的函数和方法。由于Excel的应用程序对象是外部可创建的对象,所以能从VB应用程序内部来程序化操纵Excel。本文结合自己的实践和体会,谈谈如何在VB6.0应用程序中调用Exce12000,供大家参考。
一、Excel对象模型
33
为了在VB应用程序中调用Excel,必须要了解Excel对象模型。Excel对象模型描述了Excel的理论结构,所提供的对象很多,其中最重要的对象,即涉及VB调用Excel最可能用到的对象有:
二、调用Excel
在VB应用程序中调用Excel,实质是将Excel作为一个外部对象来引用,由Excel对象模型提供能从VB应用程序内部来程序化操纵的对象以及相关的属性、方法和事件。
1、在VB工程中添加对Excel类型库的引用
为了能从VB应用程序中访问Excel丰富的内部资源,使Excel应用程序运行得更快,需要在VB工程中添加对Excel类型库的引用。具体步骤如下:
a)从VB5“工程”菜单中选择“引用”;
b) 在“引用”对话框中选择Excel类型库:\"Microsoft Excel9.0 Object Library\"; c)单击左边小方框,使之出现“√”符号; d)按“确定”退出。
注:要想在VB应用程序中调用Excel,你的计算机系统中必须安装Excel。 2、引用Application对象
Application对象是Excel对象模型的顶层,表示整个Excel应用程序。在VB应用程序中调用Excel,就是使用Application对象的属性、方法和事件。为此,首先要声明对象变量:
Dim VBExcel As Object 或直接声明为Excel对象:
Dim VBExcel As Excel.Application
在声明对象变量之后,可用CreateObject函数或GetObject函数给变量赋值新的或已存在的Application对象引用。
a)用CreateObject函数生成新的对象引用: Set VBExcel=CreateObject (\"Excel.Application\")
字符串“Excel.Application”是提供Excel应用程序的编程ID,这个变量引用Excel应用程序本身。 b)用GetO场ect函数打开已存在的对象引用:
34
Set AppExcel=GetObject(\"SAMP.XLS\") 上面语句打开文件SAMP.XLS。 3、Application对象常用的属性、方法 属性、方法 方法
Visible属性 取True或False,表明Excel应用程序是否可见。 Left,Top属性 Excel窗口的位置; Height, Width属性 Excel窗口的大小;
WindowState属性 指定窗口的状态,取:XIMaximized(最大化)X1 Minimized(最小化)x1 Normal(缺省)。 Quit方法 退出Microsoft Excel;
Calculate方法 重新计算所有打开的工作簿、工作表或单元格。 Evaluate方法 求值数学表达式并返回结果。 示例1:求值数学表达式: Dim VBExcel As Object
Set VBExcel=CreateObject (\"Excel.Application\") X=VBExcel. Evaluate (\"3+5*(cos (1/log (99. 9)))\") 三、使用Excel应用程序
如前所述,在VB应用程序中调用Excel应用程序,就是使用Application对象的属性、方法和事件。下面分类给出其中常用的属性和方法。
1、使用工作薄
Workbook对象代表Excel应用程序中当前打开的一个工作簿,包含在Workbooks集合中。可以通过Workbooks集合或表示当前活动工作簿的Active Workbook对象访问Workbook对象。
常用的方法有: 属性、方法 意义
Add方法 创建新的空白工作簿,并将其添加到集合中。 Open方法 打开工作簿。
35
Activate方法 激活工作簿,使指定工作簿变为活动工作簿,以便作为Active Workbook对象使用。 Save方法 按当前路径和名称保存现有工作簿(如是首次保存,则将其保存到缺省名称中,如BOOK1.XLS)。 SaveAs方法 首次保存工作簿或用另一名称保存工作簿。 Close方法 关闭工作簿。
PrintOut方法 打印工作簿,语法为:
PrintOut (from, To, Copies, Preview, Printer, ToFile, Collate) 可选参数:
From:打印的起始页号。如省略将从起始位置开始打印。 To:打印的终止页号。如省略将打印至最后一页。 Copies:要打印的份数。如省略将只打印一份。
Preview:如果为True则Excel打印指定对象之前进行打印预览。如果为False,或省略则立即打印该对象。
Printer:设置活动打印机的名称。 ToFile:如果为True则打印输出到文件。 Collate:如果为True则逐份打印每份副本。 下面语句将活动工作簿的2到5页打印3份:
ActiveWorkbook.PrintOut From:=2 To 5 Copies:=3 示例2:生成、保存、关闭工作簿 Dim VBExcel As Excel.Application
Set VBExcel== CreateObject(\"Excel.Application\") With VBExcel .Workbooks.Add With ActiveWorkbook
.Save As\"C: \\Temp \\OUTPUT.XLS\" .Close
36
End With .Quit End With 2、使用工作表
Sheets集合表示工作簿中所有的工作表。可以通过Sheets集合来访问、激活、增加、更名和删除工作表。一个Worksheet对象代表一个工作表。
常用的属性、方法有: 属性、方法 意义
Worksheets属性 返回Sheets集合。 Name属性 工作表更名。
Add方法 创建新工作表并将其添加到工作簿中。 Select方法 选择工作表。 Copy方法 复制工作表。
Move方法 将指定工作表移到工作簿的另一位置。 Delete方法 删除指定工作表。 PrintOut方法 打印工作表。
示例3:将C盘工作簿中的工作表复制到A盘工作簿中: Dim VBExcel As Excel.Application
Set VBExcel=CreateObject(\"Excel.Application\") With VBExcel
.Workbooks.Open \"C:\\Temp\\OUTPUT.XLS\" .Workbooks.Open\"A:\\OUTPUT1.XLS\"
.Workbooks(\"OUTPUT.XLS\").Sheets (\"Sales\").Copy .Workbooks(\"OUTPUT1.XLS) .Workbooks(\"OUTPUT1.XLS\").Save
37
.Workbooks(\"OUTPUT.XLS\").Close .Workbooks(\"OUTPUTI.XLS\").Close .Quit End With 3、使用单元范围
Range对象代表工作表的某一单元格、某一行、某一列、某一选定区域或者某一三维区域。 常用的属性、方法有: 属性、方法 意义
Range属性 Range (arg)其中arg为A1--样式符号,表示单个单元格或单元格区域。 Cells属性 Cells (row, col )(其中row为行号,col为列号)表示单个单元格。 ColumnWidth属性 指定区域中所有列的列宽。 Rowl3eight属性 指定区域中所有行的行宽。 Value属性 指定区域中所有单元格的值(缺省属性)。 Formula属性 指定单元格的公式,由A1--样式引用。 Select方法 选择范围。
Copy方法 将范围的内容复制到剪贴板。 C1earContents方法 清除范围的内容。 Delete方法 删除指定单元范围。 4、使用图表
Chart对象代表工作簿中的图表。该图表既可为嵌人式图表(包含于ChartObject对象中)也可为分立的图表工作表。
常用方法有: 方法 意义
Add方法 新建图表工作表。返回Chart对象。 PrineOut方法 打印图表。
38
ChartWizard方法 修改给定图表的属性,其语法为:
ChartWizard(Source, Gallery, Format, P1otBy, CategoryLabels, SeriesLabels, HasLegend, Title, CategoryTitle, ValueTitle, ExtraTitle) 其中:
Source:包含新图表的源数据的区域。如省略,将修改活动图表工作表或活动工作表中处于选定状态的嵌人式图表。
Gallery:图表类型。其值可为下列常量之一:xlArea, x1Bar, xlColumn, xlLine, x1Pie, xlRadar,x1XYScatter, xlCombination, x13DArea, x13DBar、x13DColumn, x13DLine, x13DPie、x13 DSurface、xlDoughnut或xlDefaultAutoFormat。
Format:内置自动套用格式的编号。如省略,将选择默认值。 P1otBy:指定系列中的数据是来自行(xlRows)还是列(xlColumns)。 CategoryLabels:表示包含分类标志的源区域内行数或列数的整数。 SeriesLabels:表示包含系列标志的源区域内行数或列数的整数。 HasLegend:若指定True,则图表将具有图例。 Title:图表标题文字。
CategoryTitle:分类轴标题文字。 ValueTitle:数值轴标题文字。
ExtraTitle:三维图表的系列轴标题,或二维图表的第二数值轴标题。
可组合使用Add方法和ChartWizard方法,以创建包含工作表中数据的图表工作表。下例基于工作表“Sheetl”中单元格区域“A1:A20”中的数据生成新的折线图并打印。
With Charts.Add
.ChartWizard source:=Worksheets (\"sheet1\").Range (\"a1:a20\"),gallery:=xlLine, title:=“折线图表”
.Printout End With
39
5、使用Excel工作表函数
在VB语句中可使用大部分的Excel工作表函数,可通过WorksheetFunction对象调用Excel工作表函数。下面的Sub过程用Min工作表函数求出指定区域中单元格的最小值,并通过消息框显示结果值。
Sub UseFunction() Dim myRange As Range
Set myRange=Worksheets (\"Sheet1\").Range(\"B2:F10\") answer=Application.WorksheetFunction.Min(myRange) MsgBox answer End Sub
如果使用以区域引用为参数的工作表函数,必须指定一个Range对象。如可用Match工作表函数对A1:A10区域的所有单元格进行搜索。
Sub FindFirst()
my Var=Application.WorksheetFunction.Match (9, Worksheets( 1).Range(\"A1:A10\"),0) MsgBox myVar End Sub
要在单元格中插人工作表函数,可将该函数指定为对应于Range对象的Formula属性值。在以下示例中,将当前工作簿Sheetl内A1:B3区域的Formula属性指定为RAND工作表函数(此函数产生二个随机数)。
Sub InsertFormula()
Worksheets (\"Sheet1\" ).Range(\"A1:B3\").Formula=\"RAND()\" End Sub
以上简要介绍了Excel对象模型中部分对象及其属性和方法,更详细的信息可参阅Excel 2000帮助中的“Microsoft Excel Visual Basic参考”一节的内容。实际上,Microsoft Office家族的Word,PowerPoint, Access和Project等应用程序都可以在VB应用程序中调用,其原理和步骤完全相同,只是其对象模型有所不同而已。
---- VB程序中直接调用Excel的格式如下:
40
Private Sub menudy_Click(Index As Integer) \\这是一个打印菜单 Select Case Index Case 0
On Error GoTo kung
aaa = Shell(“D:Program FilesMicrosoft OfficeOfficeEXCEL.EXE c:cnglcngl.xls\Case 1
On Error GoTo kong \\作为空表处理 aaa = Shell(“D:Program FilesMicrosoft OfficeOfficeEXCEL.EXE c:cnglcngly.xls\Case 3 Case 4 Case 5 End Select Exit Sub kung:
aaa = Shell(“EXCEL.EXE c:cnglcngl.xls\Exit Sub kong:
aaa = Shell(“EXCEL.EXE c:cnglcngly.xls\End Sub
----由于Word97和Excel97等高版本的Office组件都有和VB 的接口:VB 编辑器,所以我们可以直接利用 VB 编辑器编写我们需要的程序。步骤如下:进入Excel97后,用鼠标点击菜单栏中的“工具”按钮,选择“宏”,再选择“VB 编辑器”。
41
----“VB编辑器”的编辑界面非常类似于“Visual Basic\"的界面。我们可以从它的控件“工程资源管理器”中插入需要的“添加用户窗体、添加模块、添加类模块”,并且从“属性窗口”中加入属性。
----例如,我们可以制定一个打印窗体,通过程序来实现数据定位和循环调用打印过程。 Public panduan As Boolean
Private Sub CommandButton1_Click() change
If panduan Then Unload Me Else
TextBox1.Text = “\" End If End Sub Sub change()
If Not judgeday(TextBox1.Text) Then GoTo error panduan = True Dim sql As String Dim db As Database Dim rs As Recordset
sql = “SELECT * From 数据表\" sql = sql + “ WHERE (((数据表.日期)= #\" + TextBox1.Text + “#))\"
Setdb =OpenDatabase(Application.ThisWorkbook.Path +“cngl.mdb\")
Set rs = db.OpenRecordset(sql, dbOpenDynaset) If rs.EOF Then
42
MsgBox (“此日期无数据\") Exit Sub End If
daima1 = rs.Fields(“代码\")
Sheet1.Range(“e5\").Value = rs.Fields(“日期\") Sheet1.Range(“f7\").Value = rs.Fields(“数据表记录\") Sheet1.Range(“d13\").Value = rs.Fields(“整数100\") Sheet1.Range(“d15\").Value = rs.Fields(“整数50\") Sheet1.Range(“d17\").Value = rs.Fields(“整数10\") Sheet1.Range(“d19\").Value = rs.Fields(“整数5\") Sheet1.Range(“d21\").Value = rs.Fields(“整数2\") Sheet1.Range(“d23\").Value = rs.Fields(“整数1\") Sheet1.Range(“h13\").Value = rs.Fields(“其他100\") Sheet1.Range(“h15\").Value = rs.Fields(“其他50\") Sheet1.Range(“h17\").Value = rs.Fields(“其他10\") Sheet1.Range(“h19\").Value = rs.Fields(“其他5\") Sheet1.Range(“h21\").Value = rs.Fields(“其他2\") Sheet1.Range(“h23\").Value = rs.Fields(“其他1\") Sheet1.Range(“d37\").Value = Sheet1.Range (“d13\").Value * 100 + Sheet1.Range(“d15\"). Value * 50 + Sheet1.Range(“d17\").Value * 10 + Sheet1.Range(“d19\").Value * 5 + Sheet1.Range (“d21\").Value * 2 + Sheet1.Range(“d23\").Value Sheet1.Range(“h37\").Value = Sheet1.Range (“h13\").Value * 100 + Sheet1.Range(“h15\").
43
Value * 50 + Sheet1.Range(“h17\").Value * 10 + Sheet1.Range(“h19\").Value * 5 + Sheet1.Range (“h21\").Value * 2 + Sheet1.Range(“h23\").Value Dim sql1 As String Dim db1 As Database Dim rs1 As Recordset
sql1 = “SELECT * From 代码字典\" sql1 = sql1 + “WHERE (((代码字典.代码)= \" & daima1 & “))\"
Setdb1 =OpenDatabase(Application.ThisWorkbook.Path + “cngl.mdb\")
Set rs1 = db1.OpenRecordset(sql1, dbOpenDynaset) Sheet1.Range(“h41\").Value = rs1.Fields(“代码字典名称\") Exit Sub error:
MsgBox (“日期输入错误\") panduan = False End Sub
Private Sub TextBox1_Change() End Sub
Private Sub UserForm_Activate() dyxjkc.Top = 30 dyxjkc.Left = 230 End Sub
----具体的表格画线可以由Excel自动完成,因此简化了VB 编程的步骤,并且节约调试程序和画线定
44
位的时间。
这两天编了一个程序,基本功能是从自动站B文件(ACCESS数据库文件)查询当月的日数据生成月简表,调出数据很好实现,程序的核心源码是把这些数据写入一个Excel模板中,这是我以前就想学会的一个功能,但没有好好去找资料,为编这个程序在网上查找了一些资料,只用一小段代码就实现了把数据写入Excel模板中的功能,下面是基本源码,后面附几篇用VB控制的文章,希望对大家有益。(如果大家感兴趣的话,我可以把那个从自动站中调用数据并形成日数据EXCEL文件的源码发上来)
Dim exl As New Excel.Application Dim book As New Excel.Workbook Dim sheet As New Excel.Worksheet '先使用excel制作一个模板
Set book = exl.Workbooks.Open(\"你制作的excel的路径\") Set sheet = book.Worksheets(1) '在excel的格子中写入你想打印的内容 With sheet
.Cells(Row, col) = \"\" End With sheet.PrintOut book.Close Set book = Nothing exl.Quit Set exl = Nothing
45
Excel、Access、VB的结合应用
---- 微软公司的Office系列办公软件相信已是众所周知,其中Excel强大的统计制表功能、Access功能完备的数据处理能力深受众多用户所喜爱。Visual Bsaic更是微软公司又一有力的产品,它简单易学,在Windows编程中的应用十分广泛。本文通过介绍数据处理及复杂表格的打印,来讨论VB与Excel及Access的结合运用。
---- 由于笔者所在的公司员工众多,在进行职工养老保险缴费的计算工作时,若使用劳动局编制的软件(用Foxbase编写),无论是在管理或维护方面均显得力不从心。于是在公司领导的强烈要求下,决定由笔者构思重新编制。基本思路是:1.将所有员工资料输入Access进行处理,以便于维护。2.在Excel中预先制成有表头的空表(Access相对欠缺处理复杂表格的能力),对需要进行金额汇总或其他运算的单元格可直接输入公式。3.在VB中编写程序代码,从Access中提取数据填入Excel对应表格相应的单元格,并输出至打印机。
---- 部分窗体及源程序代码如下: ---- 1.程序主模块
---- 定义Excel、Access对象变量,显示系统启动画面,进入系统主程序界面。强调一下,在编写程序之前须加入对Excel及Access库函数的引用,具体操作是:选择菜单栏'工程'\\'引用…',将'可使用的引用'列表框内'Microsoft Access 8.0 Object Library'和 'Microsoft Excel 8.0 Object Library'两项前的复选框标为选中,按\"确定\"返回。
mdsMain.bas
'定义数据库记录集及Excel对象变量 Public ex As New Excel.Application Public exwbook As Excel.Workbook Public exsheet As Excel.Worksheet Public mydatabase As Database Public myrecordset1 As Recordset [定义记录集]
46
…… ……
Public Opt As Integer '报表选项 [Opt为frmSelreport.frm返回值] Public isYN As Boolean Sub Main() Load frmSplash frmSplash.Show
frmSplash.Label2.Caption = \" 系统正在加载Access数据库...\"
Set mydatabase = OpenDatabase(\"c:\\sbda\\sbda.mdb\") Set myrecordset1 = mydatabase.OpenRecordset (\"报表打印(一)\") [此处对记录集赋值] …… ……
frmSplash.Label2.Caption = \" 系统正在加载Excel电子表格...\"
Set ex = CreateObject(\"excel.application\")
Set exwbook = ex.Workbooks.Open(\"c:\\sbda\\sbda.xls\") Load FrmInput '将数据输入窗体加载到内存中 Unload frmSplash
Load FrmMain'将主程序界面加载到内存中 End Sub
---- 2.报表打印模块
47
---- 其中ExcelDoForVB1()是一子程序,由prnProess()调用,作用是从Access中提取所需数据资料,填入Excel对应工作表(Worksheet)的相应单元格(Cells)中,然后打印已填入数据的表格;prnProess()则负责实现对VB通用对话框(Commom Dialog)中打印功能的控制。
mdlPrint.bas Option Explicit '定义循环计数变量
Public nRow As Integer, nCol As Integer, nBtoE As Integer '定义变量接收打印对话框返回值 Public BeginPage, EndPage, NumCopies '程序运行时需进行判断的各种标志 Public nflag, Flag, ifNum '数据记录集中指针移动数
Public PageN As Integer, n As Integer 'bar1为进度条 Public bar1 As Object Sub prnProess() '控制通用对话框打印功能
Set bar1 = FrmPrint.PgsBar1 '进度条 On Error GoTo errhandle:
If Flag = 0 Then '当打印对话框中选\"全部\"时 Select Case Opt'选择需要打印的表格 Case 1 nflag = 1
myrecordset1.MoveFirst
48
myrecordset1.MovePrevious PageN = 1
Do While nflag = 1 Call ExcelDoForVB1 '数据填入Excel单元格打印 PageN = PageN + 1 Loop Case 2 …… …… End Select Else
If Flag = 2 Then' 当打印对话框中选\"页\"时
If EndPage - BeginPage = 0 Then ifNum = 0 Else
If EndPage - BeginPage > 0 Then ifNum = 1 Else ifNum = 2 End If End If
Select Case ifNum Case 2
49
Exit Sub Case 0
Select Case Opt ' 选择需要打印的表格 Case 1
myrecordset1.MoveFirst n = (BeginPage - 1) * (49 - 4 + 1) - 1 myrecordset1.Move n PageN = BeginPage Call ExcelDoForVB1
'数据填入Excel单元格并打印Case 2 …… …… End Select Case 1
Select Case Opt '选择需要打印的表格 Case 1
myrecordset1.MoveFirst n = (BeginPage - 1) * (49 - 4 + 1) - 1 myrecordset1.Move n PageN = BeginPage
50
For nBtoE = BeginPage To EndPage Call ExcelDoForVB1 '填入Excel单元格并打印 PageN = PageN + 1 Next nBtoE Case 2 …… …… End Select End Select End If End If
FrmMain.Visible = True Exit Sub errhandle:
FrmPrint.Visible = False FrmMain.Visible = True End Sub
---- 注意,下段仅通过ExcelDoForVB1()对\"报表(一)\"的处理,来说明数据填入Excel并打印的整个过程。
Sub ExcelDoForVB1() '打印报表(一) FrmPrint.Visible = True
Set exsheet = exwbook.Worksheets(\"sheet1\") ex.Sheets(\"Sheet1\").Select ex.Range(\"A4:U49\").Select
51
ex.Selection.ClearContents ex.Range(\"A4\").Select bar1.Min = 0 bar1.Max = 45 For nRow = 4 To 49
bar1.Value = nRow - 4 '进度显示栏进程 myrecordset1.MoveNext If myrecordset1.EOF Then nflag = 0 Exit For End If
For nCol = 1 To 21
exsheet.Cells(nRow, nCol) = myrecordset1.Fields(nCol - 1) Next nCol Next nRow
exsheet.Cells(52, 21) = \"第 \" + CStr(PageN) + \" 页\" FrmPrint.Visible = False bar1.Value = 0
ActiveWindow.SelectedSheets.PrintOut Copies:=NumCopies End Sub
---- 虽然本文针对的是大多数已熟练掌握数据库技术,且精通编程之道的朋友们。但笔者认为仍有必要提一提将数据输入Access的过程,因为编出来的软件更多是面向各类普通用户,对他们来说最要紧的是好用,而其间的一系列关联并不想深究。所以设计一个好的输入界面十分有必要,在设计时可以运用VB提供的Data控件,当然若是考虑性能的话还可以用代码直接操纵数据。关于如何使用Data控件访问数据库,
52
在Visual Basic的联机手册(Online book)中有很详细的说明,此处不再赘述。
---- 文中的所有程序在Visual Bsaic5.0中文专业版及Office97中文版中调试通过。 ---- 例如合并A2~A5这4个单元格,你录制的宏代码会是这样: Range(\"A2:A5\").Select With Selection
.HorizontalAlignment = xlCenter .VerticalAlignment = xlBottom .WrapText = False .Orientation = 0 .AddIndent = False .ShrinkToFit = False .MergeCells = False End With Selection.Merge
---- 而自己编程只要一句 Range.(“A2:A5”).mergecells=True 就可以解决问题。
---- 表头形式定了,再就是表头的内容。如果单元格中的文本长度超过了列宽,往往只能显示部分内容,行尾那一格的内容则会“越境”进入右边那个空白单元格,很不美观。这个问题可以通过在程序中设置列宽加以解决。
---- Columns(14).columnwidth=12 ‘设置第14列列宽为12(缺省列宽为8.38) ---- 如果你不愿意劳神去逐列估计实际所需的列宽,干脆来一行 ---- Columns(“a:i”).autofit ‘a到i列自动调整列宽 ---- 让Excel随机应变吧。
---- 但也许你不喜欢这种方法,认为表头撑大了列宽,弄得浏览一张小表格还得向右滚动,太不方便了。要是能保持默认列宽,让文本自动换行就好了。没问题,Excel包你满意。
---- Rows(3).WrapText=True ‘让第三行各单元格中的文本自动换行
53
---- 不过你最好再加一句 Rows(3) .VerticalAlignment = xlTop 让表头自动向上对齐,这样比较符合习惯。
---- 你还可以给表头打上底色,让你的读者不至于看了打哈欠。 ---- Rows(2). Interior .ColorIndex = 5 '设置第2行底色为蓝色 ---- 再给表格的标题上色,这样更醒目一点。 ---- Rows(1).Font.ColorIndex=4
---- 表头完成后该填数据了,一个一个地填实在是太慢了,如果你的数据是存放在一个二维数组中,那问题就简单多了。
Dim Data(3,4) ………… ‘数据处理 Range(“a2:d4”).Value=Data
---- 这样可以一次填入一个表的所有数据,够快了吧!不过提醒一句,Range对象大小最好与数组匹配,小了无法显示所有数据,大了则会在空白单元格只填入“N/A”表示没有取
用EXCEL来打印报表并生成折线图 Private Sub PrintFunc() on error goto PrintFunc_Err Dim Ct As Object
Set ex = CreateObject(\"Excel.Application\") '增加工作表 ex.Workbooks.Add '输出数据
ex.Range(\"A1\").Value = \"系列1\" ex.Range(\"A2\").Value = 8 ex.Range(\"A3\").Value = 16 ex.Range(\"A4\").Value = 7
54
ex.Range(\"A5\").Value = 22 ex.Range(\"A6\").Value = 13 ex.Range(\"A7\").Value = 15 ex.Range(\"A8\").Value = 11 ex.Range(\"B1\").Value = \"系列2\" ex.Range(\"B2\").Value = 5 ex.Range(\"B3\").Value = 6 ex.Range(\"B4\").Value = 17 ex.Range(\"B5\").Value = 10 ex.Range(\"B6\").Value = 3 ex.Range(\"B7\").Value = 9 ex.Range(\"B8\").Value = 16 '设定表格样式
ex.Range(\"A1\ex.Cells(, 1).ColumnWidth = 25 ex.Cells(, 2).ColumnWidth = 25 ’插入折线图
Set Ct = ex.Worksheets(\"sheet1\").ChartObjects.Add(0, 130, 350, 250) Ct.Chart.ChartWizard Source:=ex.Worksheets(\"sheet1\").Range(\"A2:B8\"), _ gallery:=xlLine, Title:=\"New Chart\" ex.Visible = True '打印预揽
ex.ActiveWindow.SelectedSheets.PrintPreview '关闭EXCEL ex.Visible = False
55
ex.Worksheets(\"sheet1\").ChartObjects.Delete ex.ActiveWorkbook.Close savechanges:=False PrintFunc_Err: Set ex = Nothing Set Ct = Nothing end Sub
56
在现代管理信息系统的开发中,经常涉及到数据信息的分析、加工,最终还需把统计结果形成各种形式的报表提供给领导决策参考,或进行外部交流。在VisualBasic中制作报表,通常是用数据环境设计器(Data
EnvironmentDesigner)与数据报表设计器(DataReportDesigner),或者使用第三方产品来完成。但对于大多数习惯于Excel报表的用户而言,用以上方法生成的报表在格式和功能等方面往往不能满足他们的要求。
由于Excel具有自己的对象库,在VisualBasic工程中可以加以引用,通过对Excel使用OLE自动化,可以创建一些外观整洁的报表,然后打印输出。这样实现了VisualBasi应用程序对Excel的控制。本文将针对一个具体实例,阐述基于VB和EXCEL的报表设计及打印过程。
1)创建Excel对象
Excel对象模型包括了128个不同的对象,从矩形、文本框等简单的对象到透视表,图表等复杂的对象。下面简单介绍一下其中最重要,也是用得最多的五个对象。
(1)Application对象
Application对象处于Excel对象层次结构的顶层,表示Excel自身的运行环境。 (2)Workbook对象
Workbook对象直接地处于Application对象的下层,表示一个Excel工作薄文件。 (3)Worksheet对象
Worksheet对象包含于Workbook对象,表示一个Excel工作表。 (4)Range对象
Range对象包含于Worksheet对象,表示Excel工作表中的一个或多个单元格。 (5)Cells对象
Cells对象包含于Worksheet对象,表示Excel工作表中的一个单元格。如果要启动一个Excel,使用Workbook和Worksheet对象,下面的代码启动了Excel并创建了一个新的包含一个工作表的工作薄:
DimzsbexcelAsExcel.Application Setzsbexcel=NewExcel.Application zsbexcel.Visible=True
如要Excel不可见,可使zsbexcel.Visible=False
57
zsbexcel.SheetsInNewWorkbook=1 Setzsbworkbook=zsbexcel.Workbooks.Add 2)设置单元格和区域值
要设置一张工作表中每个单元格的值,可以使用Worksheet对象的Range属性或Cells属性。 Withzsbexcel.ActiveSheet .Cells(1,2).Value=\"100\" .Cells(2,2).Value=\"200\" .Cells(3,2).Value=\"=SUM(B1:B2)\" .Range(\"A3:A9\")=\"中国人民解放军\" EndWith
要设置单元格或区域的字体、边框,可以利用Range对象或Cells对象的Borders属性和Font属性: Withobjexcel.ActiveSheet.Range(\"A2:K9\").Borders'边框设置 .LineStyle=xlBorderLineStyleContinuous .Weight=xlThin .ColorIndex=1 EndWith
Withobjexcel.ActiveSheet.Range(\"A3:K9\").Font'字体设置 .Size=14 .Bold=True .Italic=True .ColorIndex=3 EndWith
通过对Excel单元格和区域值的各种设置的深入了解,可以创建各种复杂、美观、满足需要的、具有自己特点的报表。
3)预览及打印
58
生成所需要的工作表后,就可以对EXCEL发出预览、打印指令了。 zsbexcel.ActiveSheet.PageSetup.Orientation=xlPortrait' 设置打印方向
zsbexcel.ActiveSheet.PageSetup.PaperSize=xlPaperA4' 设置打印纸的打下
zsbexcel.Caption=\"打印预览\"'设置预览窗口的 标题
zsbexcel.ActiveSheet.PrintPreview'打印预览 zsbexcel.ActiveSheet.PrintOut'打印输出
通过打印方向、打印纸张大小的设置,不断进行预览,直到满意为止,最终进行打印输出。 为了在退出应用程序后EXCEL不提示用户是否保存已修改的文件,需使用如下语句: zsbexcel.DisplayAlerts=False zsbexcel.Quit'退出EXCEL zsbexcel.DisplayAlerts=True
如此设计的报表打印是通过EXCEL程序来后台实现的。对于使用者来说,根本看不到具体过程,只看到一张张漂亮的报表轻易地被打印出来了。
4)具体实例
下面给出一个具体实例,它在window98、VisualBasic6.0、 MicrosoftOffice97的环境下调试通过。
在VB中启动一个新的StandardEXE工程,在“工程”菜单的“引用”选项下引用ExcelObjectLibrary然后在Form中添加一个命令按钮cmdExcel最后在窗体中输入如下代码:
DimzsbexcelAsExcel.Application PrivateSubcmdExcel_Click() Setzsbexcel=NewExcel.Application zsbexcel.Visible=True
59
zsbexcel.SheetsInNewWorkbook=1 Setzsbworkbook=zsbexcel.Workbooks.Add
Withzsbexcel.ActiveSheet.Range(\"A2:C9\").Borders'边框设置 .LineStyle=xlBorderLineStyleContinuous .Weight=xlThin .ColorIndex=1 EndWith
Withzsbexcel.ActiveSheet.Range(\"A3:C9\").Font'字体设置 .Size=14 .Bold=True .Italic=True .ColorIndex=3 EndWith
zsbexcel.ActiveSheet.Rows.HorizontalAlignment= xlVAlignCenter'水平居中
zsbexcel.ActiveSheet.Rows.VerticalAlignment= xlVAlignCenter'垂直居中 Withzsbexcel.ActiveSheet .Cells(1,2).Value=\"100\" .Cells(2,2).Value=\"200\" .Cells(3,2).Value=\"=SUM(B1:B2)\" .Cells(1,3).Value=\"中国人民解放军\" .Range(\"A3:A9\")=\"50\" EndWith
zsbexcel.ActiveSheet.PageSetup.Orientation=xlPortrait'
60
xlLandscape
zsbexcel.ActiveSheet.PageSetup.PaperSize=xlPaperA4 zsbexcel.ActiveSheet.PrintOut zsbexcel.DisplayAlerts=False zsbexcel.Quit
zsbexcel.DisplayAlerts=True Setzsbexcel=Nothing
61
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应用程序版开发了一套“通用报表分析系统”。该系统用于拥有众多子公司的母公司的每月财务报表合并汇总。所有子公司的统计报表如资产负债表、损益表是由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公式自动计算功能完成所有报表的汇总计算。按“显示报表”按钮,选择表名,可以浏览报表数据。
62
具体的方法是: 一、 建立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自动获取外部数据
63
(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
64
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 + \"月\"
65
Sheets(\"资产负债表\").Range(\"e4\").FormulaR1C1 = \"'\" + s3 ActiveWorkbook.SaveAs FileName:=staticsfile, FileFormat _
:=xlNormal, Password:=\"\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( _
66
\"=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
vb 判断 已打开的EXCEL表格 是否被关闭
悬赏分:15 - 提问时间2009-2-12 10:09 问题为何被关闭
一个FORM中 有按钮及TEXT若干 其中一个按钮可以调用EXCEL 要求 VB能自动判断
1、当EXCEL被打开后 该FORM上 所有控件的Endabled=False 2、当EXCEL被各种原因关闭后 该FORM上 所有控件的Endabled=True
提问者: awpawpak47 - 魔法学徒 一级
答复 共 1 条
检举
67
你可以在打开Excel后加入代码,让控件Endabled=False ,再操作完后,释放Excel后再将控件Endabled=True 比如:
Dim objExcel As Excel.Application Dim objWorkBook As Excel.Workbook
Set objExcel = CreateObject(\"Excel.Application\") Set objWorkBook = objExcel.Workbooks.Open(\"d:\\1.xls\") objExcel.Visible = False
'设置活动工作表
Dim objSheet As Excel.Worksheet
Set objSheet = objExcel.Worksheets(\"sheet1\")
Command2.Endabled=False '等等 objSheet.Cells(2, 1) = \"mather\" '中间操作
objWorkBook.Save objWorkBook.Close
68