透過 Excel 來產生 資產負債表 及 損益表 (影片說明可連結 https://www.youtube.com/watch?v=cdXZNErEttM)

一、日記帳格式

    下圖為一標準的日記帳格式,整個表單是在工作頁 "日記帳" 中,其中C 及 D 欄圍會計科目,為避免輸入錯誤,採用下拉式選單來控制。這部分會搭配表單控制項及 VBA 來完成。

 

 

    在輸入日記帳之前,必須在工作頁 "會計科目" 中,先把會計科目完整建好。如下圖。

 

    建立下拉式選單的第一步,在 "開發人員" 的工具列中,點選 "設計模式",如下圖。

 

 

    接下來,點擊 "插入" 按鈕。點擊後,會有下面的控制項可供選擇。其中表單控制項可直接與 Excel 工作表互動,但不適合用於 VBA 控制。如果要用 VBA 來管理控制項,必須選用 ActiveX 的控制項。

           

 

    以此範例,我們須選擇下圖的紅框框 icon,它是一個下拉是選單控制項。我們先抓兩個下拉式選單下來,一個要用來顯示大類的會計科目,另一個是細類的會計科目。如下圖所示:

           

    為避免混淆,我們先對這兩個控制項作命名,先在大類的控制項上點滑鼠右鍵,會彈出一個浮動是窗,然後選擇 "內容",如下圖:

           

 

    接下來會出現一個屬性視窗,視窗的上方,會有 (Name) 的屬性,在這裡,我們可以給它一個名字,例如 "cb_First",如下圖,並對第二個下拉選單也如法炮製,名字為 "cb_Second"。

           

二、撰寫控制項的程式碼

    下拉選單準備好之後,我們開始要用 VBA 來控制它。首先,先對名為 cb_First 的選單雙點擊,螢幕應該會出現 VBA 還祭的編輯視窗,其中一段會如下圖。(這裡假設讀者對VBA 有一定程度的認識,我們不做基礎解釋)

上圖程式碼的意思是:當 cb_First 的內容有變更時,則執行 cb_First_Change() 到 End Sub 之間的程式碼,而cb_First_Change() 其實就是一個 VBA 程序。這部分我們先放著,等一下再來處理。首先要處理的是,當 Excel 開啟並進入 "日記帳" 工作頁時,cb_First 的下拉選項裡,必須把會計科目的大分類拉進來。我們先看 VBA 編輯環境中的上方有兩個下拉選單,左邊是物件,右邊是物件對應的事件處理。先點選左邊,會有一個 "Worksheet" 選項,如下圖。

 

選擇 "Worksheet" 後,右邊的蝦拉選項也會變成下圖,此時選擇 "Activate",表示我們想要在 "日記帳" 工作頁被點選時想要做甚麼事。

選擇 "Activate" 後,下面程式碼會多一個空白程序,如下圖。

    這時候,我們要在這個空白程序裡,加入 cb_First 下拉時可以有哪些選項的功能,完整程式碼如下。其中 "cb_First.Clear" 表示要清除 cb_First 裡的原有選項。之後是一個迴圈,把會計科目的大類項目加入 cb_First 的選項中。(詳細的程式碼解說,不在此做討論)

=================================================

Private Sub Worksheet_Activate()
  cb_First.Clear
 
  For I = 1 To 100
    If Worksheets("會計科目").Cells(2, I) <> "" Then
    
      cb_First.AddItem Worksheets("會計科目").Cells(2, I)
    Else
      Exit For
    End If
  Next I
End Sub

=================================================

    完成上述程序後,每一次進入 "日記帳" 工作頁時,就會重新執行一次 "把會計科目的大類項目加入 cb_First 選項" 的功能。回到 Excel 頁面,點擊 cb_First 的下拉箭頭,就會出現下面畫面,會計科目的大類項目已經在選項之中。要記住的是,如果 "日記帳" 工作頁是第一個工作頁,那麼第一次開啟檔案進來時,上述程序並不會被執行,需切換到其他工作頁,再進來 "日記帳" 工作頁才會執行上述程序。當然這個問題可以透過其它小技巧解決。

    接下來,我們要處理 cb_Second 的下拉選單處理。cb_Second 是會計科目細類的選單,它是在 cb_First 完成選擇後才要處理,也就是 cb_First 有變化時,我們就依據 cb_First 的選擇項目來決定 cb_Second 的選單。所以,在 VBA 編輯視窗上方的左方選單,我們選擇 cb_First 這個物件,之後在右邊選擇 "Change" 這個事件,如下圖。

 

 

    點選 "Change" 後,程式碼會自動新增一個 Sub cb_First_Change() 的程序,如下圖。

        接下來,把下面程式碼輸入到 Sub cb_First_Change() 的程序中。這段程式碼的意思是:每次 cb_First 選擇的值變更後,先把 cb_Second 的下拉選單值清除,然後到 "會計科目" 中尋找對應 cb_First 的會計大分類,再把對應大分類下的細分類填入 cb_Second 選項中。程式碼中的迴圈只跑 100 次,此乃假設細分類的項目不會超過 100 個。這是比較偷懶的作法,正確的做法是取得 "會計科目" 頁面最後一列的值,再去跑回圈。 不過實務上並不需要,這裡直接從簡。

=================================================

Private Sub cb_First_Change()

  Dim I As Integer
  Dim now_index As Integer

 
  cb_Second.Clear
 
  now_index = cb_First.ListIndex + 1
 
  If now_index > 0 Then
    For I = 3 To 100
      If Worksheets("會計科目").Cells(I, now_index) <> "" Then
    
        cb_Second.AddItem Worksheets("會計科目").Cells(I, now_index)
      Else
        Exit For
      End If
    Next I
  End If
 
End Sub

=================================================

    回到 Excel 頁面,可以看到 cb_First 變動後,下拉 cb_Second,其選單也已跟著做相對變動,如下圖。