2012年1月25日 星期三

VBA-檢查某欄位所有儲存格內容是否含有空白


Rem <summary>
Rem 檢查某欄位所有儲存格內容是否含有空白
Rem <param name="toDealColumn">目前游標所在欄位(Range物件)(例:Sheet1.Range("A:A"))</param>
Rem <param name="tnColumnCount">本Sheet包含的欄位數量</param>
Rem <returns>True:通過檢查,False:未通過檢查</returns>
Rem </summary>
Public Function checkColumnBlank(toDealColumn As Range, tnColumnCount As Integer) As Boolean

    '尋找toDealColumn對應之工作表的最後一個含有內容(非空白也非Null)的列號
    Dim lnLastUsedRow As Integer
       
        '先撈出整個工作表曾經被使用過區域的最後一列編號
        lnLastUsedRow = Worksheets(toDealColumn.Worksheet.Name).UsedRange.Row + _
                        Worksheets(toDealColumn.Worksheet.Name).UsedRange.Rows.Count - 1
                   
        '找尋每個欄位在工作表中曾經被使用過區域中最後一列之前最後一個含有內容(非空白也非Null)的列編號集合,取此集合之最大值
        Dim lnI As Integer
        Dim lnMaxRowNo As Integer '每個欄位在工作表中曾經被使用過區域中最後一列之前最後一個含有內容(非空白也非Null)的列編號集合之最大值
        Dim lnRowNo As Integer
        lnMaxRowNo = 0
        For lnI = 1 To tnColumnCount
       
            '取得每個欄位由第一列到『整個工作表曾經被使用過區域的最後一列(再加1)的編號』的Range
            Set loDealColumnSubSet = _
                Range(Worksheets(toDealColumn.Worksheet.Name).Cells(toDealColumn.Row, lnI), _
                      Worksheets(toDealColumn.Worksheet.Name).Cells(lnLastUsedRow + 1, lnI))
           
            '在此Range中找到本欄最後一個含有內容(非空白也非Null)的儲存格
            'Set result = loDealColumnSubSet.Find(What:=Null, After:=loDealColumnSubSet.Rows(lnLastUsedRow), _
            '                                     SearchOrder:=xlByRows, SearchDirection:=xlPrevious)
           
            '尋找此Range最後一個含有內容的Cell
            lnRowNo = 0
            lnRowNo = toDealColumn.Row + loDealColumnSubSet.Cells(loDealColumnSubSet.Rows.Count, 1) _
                      .End(xlUp).Row - 1
           
            '如果有找到內容非空白也非Null的儲存格式,取得此儲存格的列編號
            'If Not result Is Nothing Then
            '    lnRowNo = result.Row
            'Else
            '    lnRowNo = 0
            'End If
           
            '記錄列編號集合之最大值
            If lnRowNo > lnMaxRowNo Then
                lnMaxRowNo = lnRowNo
            End If
        Next lnI
                               
    '取得指定欄位第一列到第lnMaxRowNo列的Range
    Set loDealColumnSubSet = _
        Range(Worksheets(toDealColumn.Worksheet.Name).Cells(toDealColumn.Row, toDealColumn.Column), _
              Worksheets(toDealColumn.Worksheet.Name).Cells(lnMaxRowNo, toDealColumn.Column))
             
    '在此Range中由最後一列向上尋找為Null的儲存格
    Set result = loDealColumnSubSet.Find(What:=Null, After:=loDealColumnSubSet.Rows(lnMaxRowNo), _
                                         SearchOrder:=xlByRows, SearchDirection:=xlPrevious)
                               
    '如果找到了Null的儲存格,提示User並跳到該儲存格
    If result Is Nothing Then
    Else
        Worksheets(toDealColumn.Worksheet.Name).Activate
        result.Select
        MsgBox "第" & result.Row & "列" & "第" & result.Column & "行" & _
               "不可為空白! 請修正!"
        checkColumnBlank = False
        Exit Function
    End If
   
    '驗證通過,未包含空白
    checkColumnBlank = True

End Function