由於某個衝動的承諾,最近再次接觸到 VBA (Visual Basic for Application) 程式碼,對 Excel 工作表進行客製化。雖然需求挺簡單的,程式碼也不多,可是寫 VBA 這件事對我來說,並不是像寫 C#/.NET 一樣容易遇上,再加上 VBA 中很重要的 Office Object Model 還挺複雜的,小弟實在沒辦法塞太多 Office Object Model 的東東在腦子裡,這時候要靠文件嗎?可能一個小小的需求就會查到我天昏地暗,寫不下去…
所以在這邊分享一個小方法,能讓你快速的使用 VBA 完成你的工作,懂得一些 VB 的邏輯與控制結構語法即可,關於 Office Object Model 就借助工具幫忙。
以 Excel 來看好了,這是一套非常強大的應用軟體,可以支持你進行非常複雜的運算,可是在資料顯示的需求上,我們常常會有自己的想法或需求,Excel 不見得能完全滿足你,像是下面這張圖,如果不寫些程式,你可能每次都得自己動手設定。
在你可能得先設定一下 Excel 以開啟 VBA 的設計工具,請參考小歐ou大的這篇文章,先完成設定,接下來錄製設定格式的巨集,操作如下:
開始錄製巨集第一個巨集,選取任一列並進行底色的設定,如圖:
然後就停止錄製,按下 Visual Basic 按鈕
你就會看到設定這樣的格式時,你需要操作那些 Excel Object Model
然後咧,就是把他 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 上查詢相關的資料。
參考資料
沒有留言:
張貼留言