2016年3月29日 星期二

{Excel-VBA} 取得當前的Sheet Name 與巨集的函數建立使用

剛好有閒來玩玩當時大學把老師嚇的半死的VBA程式
教大家如何建立一個簡單的巨集(VBA)

這邊主要是要利用Function的方式讓大家可以在Excel上呼叫自已寫的程式

首先,要先把Excel中的開發人員這個頁籤打開
1.選擇檔案>選項
2.接著將開發人員項目勾起來



3.回到Excel的工具上,就可以看到開發人員的頁籤
點擊開發人員頁籤,可以看到有一個Visual Basic 的按鈕,點擊下去
4.就會開一個Visual Basi的開發畫面,這時點擊工具列中的「插入」>「模組」
5.就會開啟一個空白的活頁簿,這時把程式貼上去
這裡所提供的程式目的為,取得當前Sheet Name,
網路上不乏是提供一個Cell函數解決取得Sheet Name(請參考),
但利用這樣的方式發現當多個Sheet切換或是多個Excel切換,值就會跑掉
可能是Cell("filename") 取到的Excel 路徑會因為切換不同Sheet 或是Excel 而跑掉造成路徑被當前Sheet 的路徑,截字串時當然就截不到所想要的結果 
所以這邊另外寫了一個Function,絕對不會有路徑取錯的問題
程式:

Function GetSheetNameF(ByVal pre As String) As String
Dim result As String
If pre <> "" Then
    result = pre
End If
GetSheetNameF = result + ActiveSheet.Name
End Function

*Function Name 可以隨意取自已懂的名稱(勿數字或是符合,請純英文命名較妥)
*ByVal pre As String 為傳入參數,此可有可無
6.接著我們點擊左上方的Excel圖示,回到Excel身上
7.接著在自已想要填入結果值的儲存格上輸入「=Get」就有我們新建立的Function名稱出現
8.我們設定的Function會傳入pre這個參數,主要希望的結果是「傳入的文字+當前SheetName」
如果我們只要帶出「當前SheetName」,參數放空值即可,
或是在Visual Basic的開發畫面上不寫ByVal pre As String 也是可以哦!

9.如果已達到你要的效果要儲存這個Excel檔時會發現,會跳出這樣的訊息
主要就是當不儲存Visual Basic 的程式碼,就直接存成xlsx 檔就可以,Function依舊可以運作
如果當要儲存Visual Basic 的程式碼,以便下次可以在修改或增加Function,則要存在xlsm 檔才可以哦!



這邊就特別詳細說明xlsx 檔與xlsm 檔的差別

如果存在xlsx 檔,則打開檔可以發現Visual Basic的開發畫面是空白的,程式碼已不見蹤影
但Function仍是可以work的
反之,xlsm 檔,打開檔可以發現Visual Basic的開發畫面還有上回寫的程式,而Function當然仍是可以work的,好處就是可以在修改程式

以上,提供給各位參考