由於某個衝動的承諾,最近再次接觸到 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 上查詢相關的資料。
參考資料
沒有留言:
張貼留言