在實際進入運用VBA編碼指令命令Excel進行什麼酷炫的自動化之前,我們應該先從簡單的(容易想像的)東西開始。
比如說,調整格式或許是個好案例。假使你的辦公室有在使用ERP之類的辦公室系統串聯彙整各部門資料,極有可能可以從資料庫中倒出你需要的資訊。然而,一般而言ERP系統最怕沒有撈到資料,寫進去的東西抓不出來,事事需要IT權限進去開鎖來抓,簡直煩死IT。於是按照我以偏概全的印象調查,大部分的ERP倒出的初級資料包山包海,需要使用者為了當次目的刪除不需要的行與列或重新排序,然後才終於可以寄給主管或是客戶。如果是一次兩次單獨事件稱不上繁瑣,但如果是例行公事的話,這工作可就耐人尋味了。
此目錄非彼目錄:
希望從前曾經是我的問題的問題能帶給你靈感。
假設一份6x8(含標題)微不足道的資料名叫test.xlsx,剛從你的系統中下載下來,它或許長這樣:
雖然看起來很棒,可是這個完成度要交給不是同事的別人的話,總讓人遲疑。C列欄寬不夠使得標題字被吃掉了;而且要提交的資訊其實也只需要A與C列的Site與Performace一覽。B、D、E、F都可以刪掉免得占用檔案大小。
但首先想要達成上面兩個目的(調整欄寬、刪除列)之前,我們必須先了解這次的巨集(VBA)應該寫在哪份檔案上?
眾所周知,如果這個初級資料是從ERP之類的系統下載下來的話,它當然是「剛下載」下來的(我在說什麼廢話?)意即,它每次都是全新的。這麼一來理所當然,你不可能每次都花十分鐘寫一支VBA然後用一秒鐘執行程式;不然你直接用三分鐘動動手指調整格式不就好了。
也就是說,既然目的是想要免去每次都要重新鑽木取火的麻煩,那就得固定在一個地方建造爐灶以便輕鬆生火。
綜上前提,必須先做一個讓VBA可以寄存的檔案,以便每次都可以藉由它來控制新下載下來的初級資料,進行調整格式的作業。
而這裡再次有了其它麻煩。世界唯一的東西不需要名字也不存在區別;但複數存在的時候,不得不說清楚,以免張冠李戴。而在程式的世界裡沒有眼睛,人眼可以看到這個檔案和那個檔案,一目瞭然;在程式裡則必須以「宣言(Dim)」指定:設址於長野縣的XXXX股份有限公司,下稱甲方。
現在,我們終於可以打開一個新的活頁簿,進入<Visual Basic>的編輯區塊進行編碼了。
Sub test()
Dim wb As Workbook
Set wb = ThisWorkbook
Dim ws As Worksheet
Set ws = wb.Worksheets(1)
ws.Cells(1, 2) = "Try try."
End Sub
白話:
上面已經確認了記載VBA的活頁簿檔案在我們的控制之下了,現在要來處理每次下載下來的初級資料檔案。
Sub test()
'前略
Dim db As Workbook
Set db = Workbooks("test.xlsx")
Dim ds As Worksheet
Set ds = db.Worksheets(1)
ds.Cells(1, 7) = "Check check."
End Sub
白話:
到這裡看起來已經都準備好了,我們進入這次想要執行的目標動作。
雖然事已至此,還是岔題說明一下Microsoft Excel檔案的層級。一份Excel檔案我們稱之為「活頁簿(workbook)」,活頁簿下可以有許多不同「頁籤(worksheet)」。每個頁籤由「直欄(column)橫行(row)」組成表格,其中可以對每個儲存格(cell)或是複數儲存格的區塊(range)進行編輯。
Sub test()
'前略
ds.Columns(3).ColumnWidth = 20
ds.Range("E:F").Delete
ds.Range("B:B,D:D").Delete
End Sub
白話:
現在已經成功完成了這個定點爐灶,以後不用再時時重新鑽木取火。這份VBA檔案要好好保存。
但是,難道每次我都要進入<Visual Basic>的編輯頁面去按那個<執行>紐來跑程式嗎?我們應該可以設置一個前台按鈕,可以在活頁簿<執行>VBA。
Excel VBA當然考慮過相關事宜,前台控制按鈕在<開發人員>→<插入>→<表單控制項>裡。現在我們需要的只是一個「啟動」的按鈕,所以選擇第一個。
選擇後應該可以如插入方塊插圖時一樣可以框選設定你想要的按鈕大小。鬆開滑鼠按鍵後,會跳出按鈕的設定視窗:
這裡已經寫好的VBA只有test一個而已,請選擇它。如果你寫了好因應各種狀況的VBA,需要在這裡指定按鈕是要啟動哪一支。另外,下面的下拉選項也需要選擇,現在你指定讓按鈕啟動的這支VBA是存在哪個活頁簿裡。設定完成後按下確定,會出現你要的按鈕。
按鈕顯示名稱可以隨意更換,如果設錯VBA也可按下左鍵後重新選擇<指定巨集>進行編輯。
試著按下按鈕,Ta-da。
下班了,明天見。