Excel VBA 實戰(2)

1.Case 1 解決方案原碼及相關注釋

在2017結束前還是把坑填了。

Case1 的鏈接如下,

楊風颯:Excel VBA 實戰(1)zhuanlan.zhihu.com圖標

源碼下載鏈接

http://qiou.eu/xl/Case1.xlsmqiou.eu

Option Explicit 裝逼開始nnnPublic Sub Main()n 主程序入口n groupAndSum 1, 2, 3, 2, , TruennEnd Subnnnparams : targKeyCol1 一級科目所在列序號 即第1列n targKeyCol2 二級科目所在列序號 即第2列n targValCol 值所在列序號,可選,默認與二級科目列相鄰,本例中 即第3列, 如果為0則只分組 不求和n targRowBegine 起始行,可選,默認從第1行開始n targRowEnd 結束行,可選,默認為已填充最後一列n sorted 是否對二級科目排序,可選,默認為否nFunction groupAndSum(ByVal targKeyCol1 As Integer, ByVal targKeyCol2 As Integer, Optional ByVal targValCol, Optional ByVal targRowBegine, Optional ByVal targRowEnd, Optional ByVal sorted As Boolean = False)n n 如果為空,從第一列開始n If IsMissing(targRowBegine) Thenn targRowBegine = 1n End Ifn n 如果為空,則設為最末一列n If IsMissing(targRowEnd) Thenn targRowEnd = Cells(Rows.Count, targKeyCol2).End(xlUp).Rown End Ifn n 如果為空,在二級科目右列n If IsMissing(targValCol) Thenn targValCol = targKeyCol2 + 1n End Ifn n 從下往上遍歷 保留當前以及上一單元格行號n Dim tmpPreviousRow As Integern Dim tmpCurrentRow As Integern n tmpPreviousRow = targRowEndn tmpCurrentRow = tmpPreviousRownn 當前行數小於等於起始行時停止n Do While tmpCurrentRow > targRowBeginen n 一級科目列 往上找到下一個非空的單元格 並取得行號 n tmpCurrentRow = Cells(tmpCurrentRow, targKeyCol1).End(xlUp).Rown n 區分是否排序n 目標區域為 兩個一級科目之間的各行n If sorted Thenn With Range(Cells(tmpCurrentRow + 1, targKeyCol2), Cells(tmpPreviousRow, targKeyCol2))n 兩個以上單元格時 排序n If .Cells.Count > 1 Thenn .Resize(tmpPreviousRow - tmpCurrentRow, 2).Sort Key1:=.Cells(1)n End Ifn 分組n .Rows.Groupn n End Withn Elsen Range(Cells(tmpCurrentRow + 1, 1), Cells(tmpPreviousRow, 1)).Rows.Groupn End Ifn n targValCol 為 0 時 不求和 n 注意求和函數的兩個端點單元格n If targValCol <> 0 Thenn Cells(tmpCurrentRow, targValCol).Formula = "=SUM(" & Cells(tmpCurrentRow + 1, targValCol).Address(0, 0) & ":" & Cells(tmpPreviousRow, targValCol).Address(0, 0) & ")"n End Ifn n 當前區域起始單元格 上移一行 即為一下目標區域結束單元格所在行n tmpPreviousRow = tmpCurrentRow - 1n LoopnnEnd Functionn

Case1 中的層級模式廣泛應用在實踐項目當中,最典型的例子就是財務報表與會計科目之間層疊關係。類似於YAML,它可以非常直觀地反映對象之間的層次關係,宜於修改和維護。

更多的自動化實例將在以後與大家分享。

2.Case 2

問題描述

找區別

* AB為兩列發票號,要求找出哪些發票號僅在A列存在,而在B列不存在以及哪些B存在而A不存在,並將相關結果列印到屏幕

* 函數簽名為function printDiff(byVal ColA, byVal ColB, optional byVal startRow as Long = 2), ColA, ColB 為所在列序號, StartRow為起始行號

推薦閱讀:

七夕專題:自定義格式--不管我的容顏如何變幻,愛你的心至死不渝!
教你5秒破解密碼,從此,沒有你打不開的excel
Excel VBA 基礎(01.3)
Excel中如何製作雙層餅圖

TAG:VBA | MicrosoftExcel | 财务分析 |