2010年10月10日 星期日

懶人的 VBA 程式寫作法

由於某個衝動的承諾,最近再次接觸到 VBA (Visual Basic for Application) 程式碼,對 Excel 工作表進行客製化。雖然需求挺簡單的,程式碼也不多,可是寫 VBA 這件事對我來說,並不是像寫 C#/.NET 一樣容易遇上,再加上 VBA 中很重要的 Office Object Model 還挺複雜的,小弟實在沒辦法塞太多 Office Object Model 的東東在腦子裡,這時候要靠文件嗎?可能一個小小的需求就會查到我天昏地暗,寫不下去…

所以在這邊分享一個小方法,能讓你快速的使用 VBA 完成你的工作,懂得一些 VB 的邏輯與控制結構語法即可,關於 Office Object Model 就借助工具幫忙。

以 Excel 來看好了,這是一套非常強大的應用軟體,可以支持你進行非常複雜的運算,可是在資料顯示的需求上,我們常常會有自己的想法或需求,Excel 不見得能完全滿足你,像是下面這張圖,如果不寫些程式,你可能每次都得自己動手設定。

2010-10-10_010005

你可能馬上會想到 Excel 有條件化條件的功能可以用,但是它卻只能對單一儲存格設定格式,由於找不到可以達成我目的的設定方式,所以只好寫程式解決啦。

image

在你可能得先設定一下 Excel 以開啟 VBA 的設計工具,請參考小歐ou大的這篇文章,先完成設定,接下來錄製設定格式的巨集,操作如下:

image

開始錄製巨集第一個巨集,選取任一列並進行底色的設定,如圖:

image

然後就停止錄製,按下 Visual Basic 按鈕

image

你就會看到設定這樣的格式時,你需要操作那些 Excel Object Model

image

然後咧,就是把他 COPY 走,拿到你要用的程式碼那邊去囉,完成這個數量與位置標示的 VBA 程式碼大致如下,高亮的那幾行就是由巨集錄製得來的程式碼,其餘則是我自己完成的程式的邏輯控制結構。
Private Sub Worksheet_Change(ByVal Target As Range)
    ' 整批貼上時 Range 的左上角是 A4
    If Target.row = 4 And Target.Column = 1 Then
        FormatAll
    End If
    
    ' 如果直接改數量...
    If Target.row >= 4 And Target.Column = 5 Then
        FormatRow Range("$A" & Target.row & ":$J" & Target.row)
    End If
End Sub

Function FormatAll()
    Dim row As Integer
    row = 4
    
    Dim continue As Boolean
    continue = True
    
    While (continue)
        If Cells(row, 1) = "" Then
            ' 一直處理到沒有批號的那列
            continue = False
        Else
            FormatRow Range("$A" & row & ":$J" & row)
            row = row + 1
        End If
    Wend
End Function

Function FormatRow(Target As Range)
    ' 數量大於1 整列給底色
    If Cells(Target.row, 5) > 1 Then
        Target.Interior.Color = RGB(255, 153, 204)
    Else
        Target.Interior.Pattern = xlNone
    End If
    
    ' 儲位區域不同上方畫實線 (畫雙實線怕列印會換頁)
    If Target.row > 4 Then
        If Left(Cells(Target.row, 3), 3) <> Left(Cells(Target.row - 1, 3), 3) Then
            With Target.Borders(xlEdgeTop)
                .LineStyle = xlContinuous
                .ColorIndex = 0
                .TintAndShade = 0
                .Weight = xlThin
            End With
        Else
            With Target.Borders(xlEdgeTop)
                .LineStyle = xlContinuous
                .ColorIndex = 0
                .TintAndShade = 0
                .Weight = xlHairline
            End With
        End If
    End If
End Function

介紹這個簡單的 Office Object Model 學習方法,這應該對剛接觸 VBA 的人有幫助(我自己比較少碰到有人寫 VBA... XD),但是以錄製方式產生的 VBA 程式碼其實會有很多冗餘的程式碼跑出來,所以個人是建議一開始可以用此方法來學習、快速上手,但是千萬不要不求甚解,多到 MSDN 上查詢相關的資料。

參考資料

沒有留言: