Excel宏技巧II自动隐藏表格中无数据的行表1是数据源,经常改变;表2引用表1中某列有数据的单元格(利用动态位址已实现。)由于表1的改变,表2的大小随之而变。问题:如何实现表2中没有数据的行(有公式)自动隐藏?谢谢赐教!Subabc()Fori=1To300IfCells(i,1).value=ThenRows(i).Hidden=TrueNextiEndSub你写的语句可以解决隐藏的问题,可是如果我执行了它之后,再在表1中增加数据,表2不会自动显示有了数据的行。如何修改?将此宏设为自动运行(打开文件时)Subabc()Fori=1To300IfCells(i,1).valueThenRows(i).Hidden=falseNextiEndSub用VBA如何自动合并列的内容?SubMergeTest()Fori=3To30Cells(i,3)=Cells(i,1)&Chr(10)&Cells(i,2)NextEndSub基于VB和EXCEL的报表设计及打印在现代管理信息系统的开发中,经常涉及到数据信息的分析、加工,最终还需把统计结果形成各种形式的报表提供给领导决策参考,或进行外部交流。在VisualBasic中制作报表,通常是用数据环境设计器(DataEnvironmentDesigner)与数据报表设计器(DataReportDesigner),或者使用第三方产品来完成。但对于大多数习惯于Excel报表的用户而言,用以上方法生成的报表在格式和功能等方面往往不能满足他们的要求。由于Excel具有自己的对象库,在VisualBasic工程中可以加以引用,通过对Excel使用OLE自动化,可以创建一些外观整洁的报表,然后打印输出。这样实现了VisualBasic应用程序对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.ApplicationSetzsbexcel=NewExcel.Applicationzsbexcel.Visible=True如要Excel不可见,可使zsbexcel.Visible=Falsezsbexcel.SheetsInNewWorkbook=1Setzsbworkbook=zsbexcel.Workbooks.Add2)设置单元格和区域值要设置一张工作表中每个单元格的值,可以使用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=1EndWithWithobjexcel.ActiveSheet.Range(A3:K9).Font'字体设置.Size=14.Bold=True.Italic=True.ColorIndex=3EndWith通过对Excel单元格和区域值的各种设置的深入了解,可以创建各种复杂、美观、满足需要的、具有自己特点的报表。3)预览及打印生成所需要的工作表后,就可以对EXCEL发出预览、打印指令了。zsbexcel.ActiveSheet.PageSetup.Orientation=xlPortrait'设置打印方向zsbexcel.ActiveSheet.PageSetup.PaperSize=xlPaperA4'设置打印纸的打下zsbexcel.Caption=打印预览'设置预览窗口的标题zsbexcel.ActiveSheet.PrintPreview'打印预览zsbexcel.ActiveSheet.PrintOut'打印输出通过打印方向、打印纸张大小的设置,不断进行预览,直到满意为止,最终进行打印输出。为了在退出应用程序后EXCEL不提示用户是否保存已修改的文件,需使用如下语句:zsbexcel.DisplayAlerts=Falsezsbexcel.Quit'退出EXCELzsbexcel.DisplayAlerts=True如此设计的报表打印是通过EXCEL程序来后台实现的。对于使用者来说,根本看不到具体过程,只看到一张张漂亮的报表轻易地被打印出来了。4)具体实例下面给出一个具体实例,它在window98、VisualBasic6.0、MicrosoftOffice97的环境下调试通过。在VB中启动一个新的StandardEXE工程,在“工程”菜单的“引用”选项下引用ExcelObjectLibrary;然后在Form中添加一个命令按钮cmdExcel;最后在窗体中输入如下代码:DimzsbexcelAsExcel.ApplicationPrivateSubcmdExcel_Click()Setzsbexcel=NewExcel.Applicationzsbexcel.Visible=Truezsbexcel.SheetsInNewWorkbook=1Setzsbworkbook=zsbexcel.Workbooks.AddWithzsbexcel.ActiveSheet.Range(A2:C9).Borders'边框设置.LineStyle=xlBorderLineStyleContinuous.Weight=xlThin.ColorIndex=1EndWithWithzsbexcel.ActiveSheet.Range(A3:C9).Font'字体设置.Size=14.Bold=True.Italic=True.ColorIndex=3EndWithzsbexcel.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)=50EndWithzsbexcel.ActiveSheet.PageSetup.Orientation=xlPortrait'xlLandscapezsbexcel.ActiveSheet.PageSetup.PaperSize=xlPaperA4zsbexcel.ActiveSheet.PrintOutzsbexcel.DisplayAlerts=Falsezsbexcel.Quitzsbexcel.DisplayAlerts=TrueSetzsbexcel=Nothing提高EXCEL中VBA的效率方法1:尽量使用VBA原有的属性、方法和Worksheet函数由于Excel对象多达百多个,对象的属性、方法、事件多不胜数,对于初学者来说可能对它们不全部了解,这就产生了编程者经常编写与Excel对象的属性、方法相同功能的VBA代码段,而这些代码段的运行效率显然与Excel对象的属性、方法完成任务的速度相差甚大。例如用Range的属性CurrentRegion来返回Range对象,该对象代表当前区。(当前区指以任意空白行及空白列的组合为边界的区域)。同样功能的VBA代码需数十行。因此编程前应尽可能多地了解Excel对象的属性、方法。充分利用Worksheet函数是提高程序运行速度的极度有效的方法。如求平均工资的例子:ForEachcInWorksheet(1).Range(″A1:A1000″)Totalvalue=Totalvalue+c.valueNextAveragevalue=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″...则以下语句比上面的快WithWorkbooks(1).Sheets(1).Range(″A1:A1000″).Font.Name=″Pay″.FontStyle=″Bold″...EndWith2.使用对象变量。如果你发现一个对象引用被多次使用,则你可以将此对象用Set设置为对象变量,以减少对对象的访问。如:Workbooks(1).Sheets(1).Range(″A1″).value=100Workbooks(1).Sheets(1).Range(″A2″).value=200则以下代码比上面的要快:SetMySheet=Workbooks(1).Sheets(1)MySheet.Range(″A1″).value=100MySheet.Range(″A2″).value=2003.在循环中要尽量减少对象的访问。Fork=1To1000Sheets(″Sheet1″).SelectCells(k,1).value=Cells(1,1).valueNextk则以下代码比上面的要快:SetThevalue=Cells(1,1).valueSheets(″Sheet1″).SelectFork=1To1000Cells(k,1).value=ThevalueNextk方法3:减少对象的激活和选择如果你的通过录制宏来学习VBA的,则你的VBA程序里一定充满了对象的激活和选择,例如Workbooks(XXX).Activate、Sheets(XXX).Select、Range(XXX).Select等,但事实上大多数情况下这些操作不是必需的。