近期正在利用Excel开发一套工作管理系统,已初步有了结果,并开始使用。前不久,在一篇博客文章中,我贴出了该系统的主界面。在这里,随便谈谈在开发过程中的一些心得体会,供大家参考。
在同一工作簿中不要试图处理所有需要实现的任务。当然,如果您的系统只需实现少有的几项功能,在一个工作簿中集中实现这几项功能是简单方便的。但是,如果需要实现多项任务,特别是需要处理大量数据的情形下,建议将任务进行整合分类,分别放在不同的工作簿中来实现这些任务。 此时,需要规划好各工作簿要实现的功能任务,合理设计各个工作簿之间的关系,理顺各工作簿之间的数据调用,并且使用一个主工作簿来调用各个工作簿,这样使得系统非常灵活、精简,也不致于因使用而致使工作簿体积快速不断增大。 要注意的是,对于存在数据调用的工作簿,一定要清楚调用的顺序,避免因为某一工作簿数据的更换而影响其他相关工作簿数据的准确性。例如,工作簿B需要调用工作簿A中的数据,如果工作簿A中的数据发生变化,那么要及时更新工作簿B中的数据。
为工作簿添加自定义文档属性(即CustomDocumentProperties 属性),从而利用该属性来查找工作簿,或者判断是否为要查找的工作簿,或者能够合并同类工作簿。特别是在有大量名称会发生变化的工作簿时。 单击菜单“文件”─—“属性”,选择“自定义”选项卡,在“名称”中输入相应的名称,在“取值”中输入“Yes”,然后单击“添加”按钮加入属性,如下图所示。 
这样,在多个工作簿相互调用时,可以避免因工作簿名称改变而出现的无法找到工作簿的错误。
记得及早、适时地退出循环,特别是在存在大量数据而不得不逐一进行循环时。例如,下面的代码,必须在工作表中的第3行至第31行、第2列至第32列依次循环,当满足特定条件后,使用Exit Sub语句退出,从而避免继续循环。如果在更大范围内循环时更应如此。 For i = 3 To 31 ‘循环每一列 For j = 2 To 32 If Target.Value = “” Then If iTotalRow > 1 Then For k = 2 To iTotalRow If Target.Row = Worksheets(”Data”).Range(”A” & k) And Target.Column = Worksheets(”Data”).Range(”B” & k) Then Worksheets(”Data”).Rows(k).EntireRow.Delete bDecide = True Exit Sub End If Next k End If End If Next j Next i
有时,需要在工作表中反复汇总或操作来自另一工作表或工作簿中的数据。记住,在将其他地方的数据复制到工作表中之前,记得清除以前的数据,避免产生重复数据或带来错误。
在我们编写程序的过程中,总有些代码适合于不同的程序开发。我们可以将这些程序代码做成通用程序,当需要时直接调用,从而节省时间,便于组织,提高了开发效率。这里,举几个例子。 (1)判断某文件是否存在 ‘判断文件是否存在 Private Function FileExists(fname) As Boolean ‘如果存在则返回True FileExists = (Dir(fname) <> “”) End Function (2)判断工作表是否存在 ‘判断工作表是否存在 Private Function SheetExists(sName) As Boolean ‘如果当前工作簿中存在该工作表则返回True Dim x As Object On Error Resume Next Set x = ActiveWorkbook.Sheets(sName) If Err = 0 Then SheetExists = True Else SheetExists = False End If End Function
(3)返回满足查找条件的所有单元格组成的区域 ‘通用的查找函数 Function FindAll(SearchRange As Range, FindWhat As Variant, _ Optional LookIn As XlFindLookIn = xlValues, Optional LookAt As XlLookAt = xlWhole, _ Optional SearchOrder As XlSearchOrder = xlByRows, _ Optional MatchCase As Boolean = False) As Range ””””””””””””””””””””””””””””””””””””””””””””” ‘ 返回SearchRange区域中含有FindWhat所代表的值的所有单元格组成的Range对象 ‘ 其参数与Find方法的参数相同 ‘ 如果没有找到单元格,将返回Nothing. ””””””””””””””””””””””””””””””””””””””””””””” Dim FoundCell As Range Dim FoundCells As Range Dim LastCell As Range Dim FirstAddr As String With SearchRange Set LastCell = .Cells(.Cells.Count) End With Set FoundCell = SearchRange.Find(what:=FindWhat, after:=LastCell, _ LookIn:=LookIn, LookAt:=LookAt, SearchOrder:=SearchOrder, MatchCase:=MatchCase) If Not FoundCell Is Nothing Then Set FoundCells = FoundCell FirstAddr = FoundCell.Address Do Set FoundCells = Application.Union(FoundCells, FoundCell) Set FoundCell = SearchRange.FindNext(after:=FoundCell) Loop Until (FoundCell Is Nothing) Or (FoundCell.Address = FirstAddr) End If If FoundCells Is Nothing Then Set FindAll = Nothing Else Set FindAll = FoundCells End If End Function 大家在平时可以积累这些程序,既方便学习,又可以重用。
|