“分析”這種能力,堪稱人類智慧之光。專利分析領域有很多大神,還有許多高明的工具和技巧。不過君對分析是七竅通了六竅——一竅不通,所以分析絕對不是這篇文章的重點。這系列的文章,只想聊幾個Excel宏VBA的小程序(其實并不限于處理專利數據,只是圖個方便圖個開心罷了),篇幅短小,而且比較快更。

假如,某食品企業,每個部門按期提交發明創造。企業統計人員把發明創造的提交日、年份、發明名稱、獎勵系數匯總到一張表里。

如果現在需要分段統計各個部門的獎勵系數的總數,怎么辦呢?有的小伙伴可能手動用SUM函數求和來搞定,或者可能用“合并計算”搞定咯。
不過,雖然手動操作的技巧簡單易學,但當多個數據文件需要一系列的復雜手動操作時,手動操作就存在一些Bug:每換一套數據,就要重新手動操作一遍,并且,如果處理數據的人員更換,這一系列復雜手動操作的可移植性和準確性都比較堪憂。人力因素在處理數據的過程中難以抽離,大家很容易變成“表哥”和“表姐”。相比于人工手動操作,宏VBA程序因為在運行過程中剔除了人工的因素,所以可移植性和準確性都較高。而且,編寫一段程序,相當于對不同的待處理數據固定了相同的“標準”。這個“統計各個部門發明獎勵系數總數”的簡單小例子,著重傳達一種程序思維。
? 第一步:打開宏程序編輯界面
根據Excel版本的不同,可以在 “視圖” 中錄制一個空的宏,停止錄制后進行編輯。也可以在Excel選項的自定義功能區中勾選 “開發工具” 訪問宏功能。
? 第二步:定義Sub過程及變量我們把完成“按部門加合發明獎勵系數”的這個過程定義為bigtitle,當然,用其他的名字也可以。隨后,我們要定義四個整型變量:
i 代表數據區域的行的變量
j 代表上一段相同部門底端的行
k 代表下一段相同部門底端的行
t 代表在一段相同部門的數據范圍內變化的行

隨后我們再定義兩個字符串變量:str1代表第i行的部門名稱,str2代表第i+1行的部門名稱。
寫為:
Sub bigtitle()
Dim i, j, k, t As Integer
Dim str1, str2 As String
*程序主體*
End Sub
① 第一層循環,i從表的第2行循環賦值至第24行,在i的每次賦值過程中,表中第i列、第3列的部門信息被賦值給str1,同時第i+1行、第3列的部門信息被賦值給str2。
寫為:
For i=2 To 24? str1 = Sheet2.Cells(i,3)
? str2 = Sheet2.Cells(i+1,3)
? *條件語句*
Next
② 條件語句,當str1不等于str2時,說明i所在的行已經到了該相同部門的最后一行,從i+1行起,就進入了下一個部門。這時,我們把這個i值賦給k,作為該段相同部門底端的行的標記,同時,把原k值賦給j,用于標記上一段相同部門底端的行。在判斷str1和str2是否相同時,我們使用字符串對比函數StrComp。
寫為:
If StrComp(str1, str2, 1) <> 0 Then? j = k
? k = i
? *第二層循環*
End If
③ 第二層循環,當j和k確定后,從第j+1行到第k行,部門名稱相同,即同一部門。此時設置t變量,其循環范圍從第j+1行到第k行,將在此范圍內的所有第5列的獎勵系數都加總到第k行的第6列。這里需要注意的是,應當設置k的初始值為1。
寫為:
For t = j+1 To kSheet2.Cells(k, 6) = Sheet2.Cells(k, 6) + Sheet2.Cells(t, 5)Next這樣,運行宏之后,就可以得到各個部門的總獎勵系數:

全體Sub過程如下,由兩層循環和一層條件判斷構成,給大家做個參考。

這樣,當數據量變大時,只需要修改第一層循環中“For i=2 To 24”的24至最后一條數據所在行的行數,然后重新運行宏,即可完成大量數據分段加合的工作。
