loading...


loading...


公告
loading...

Google 全球搜索 本站搜索
我的分类(专题)
loading...

日志更新
loading...

最新评论
loading...

留言板
loading...

链接

Blog信息
loading...




Google 网上论坛 Beta 版
订阅 excelblogger
电子邮件:
访问此论坛





my e-mail:xhdsxfjy@163.com



Excel应用程序开发心得(一)
fanjy 发表于 2008-7-31 19:52:00

近期正在利用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

大家在平时可以积累这些程序,既方便学习,又可以重用。
注:本文同时发表于完美Excel.

阅读全文 | 回复(0) | 引用通告 | 编辑
 


  • 标签:Excel VBA 程序开发 
  • 发表评论:

      大名:
      密码:
      主页:
      标题:
      loading...


    fanjy的博客

    Powered by Oblog.