內(nèi)容提要
大家好,我是冷水泡茶。 今天在論壇上看到一個求助貼:
他的數(shù)據(jù)表是這樣的: 匯總表如下,每人一條記錄,也就是把明細表給它改為標準的二維表: 關(guān)于文件匯總合并,我們分享過案例【文件合并工具】、【Excel表合并】,合并對象都是標準的二維表,不適用今天這個案例。 今天這個問題看上去不是很復雜,如果所有人都是相同格式,我的意思是“父親”、“母親”都是全的,那就可以直接引用工作表單元格的位置來取得數(shù)據(jù)。 但我是不太喜歡直接引用單元格地址這種方式的,寫死了,靈活性就差點,我們寫代碼還是應該盡量考慮變化、擴展、容錯、特殊情況如何處理等等。 基本思路: 1、指定明細表文件夾,這里我們默認是跟“匯總表”放在同一個文件夾下。 2、循環(huán)文件夾中每一個文件,如果是Excel文件,我們就打開它,把它賦值給工作簿對象wb。 3、我們再循環(huán)wb中的每個工作表ws,雖說他這個明細表中只有一個工作表,但很多情況下并非如此,可能有其他表,工作表的名稱也可能各不相同,所以我們要循環(huán)判斷哪個工作表是我們需要匯總的目標工作表。 4、根據(jù)明細表格的結(jié)構(gòu)特征,我們設置兩個Range對象,rng1=A4:F5,rng2=A6:F8。 5、我們循環(huán)rng1,找到“姓名”單元格,再用offset函數(shù)取其右側(cè)單元格,員工姓名,我們把它作為字典的key,用一個數(shù)組arr作為item。 6、我們再分別循環(huán)rng1與rng2,取得各個字段的值,填入arr,再把arr裝回字典。 7、把字典的item寫入目標工作表“匯總”。 VBA代碼 代碼見第二條推文。 后記 Sub 最高學歷() Dim ws As Worksheet, lastRow As Integer Dim arr(), arrEduBg(), dic As Object, dkey As String, dic1 As Object Set ws = ThisWorkbook.Sheets("信息表") Set dic1 = CreateObject("Scripting.Dictionary") Set dic = CreateObject("Scripting.Dictionary") With ws lastRow = .UsedRange.Rows.Count arr = .Cells(2, 1).Resize(lastRow - 1, 3).Value End With arrEduBg = Array("高中", "專科", "本科", "碩士", "博士") For i = 0 To UBound(arrEduBg) dic1(arrEduBg(i)) = i Next For i = 1 To UBound(arr) If arr(i, 1) <> "" Then dkey = arr(i, 1) If Not dic.Exists(dkey) Then dic(dkey) = Array(arr(i, 1), arr(i, 2), arr(i, 3)) Else If dic1(arr(i, 3)) > dic1(dic(dkey)(2)) Then dic(dkey) = Array(arr(i, 1), arr(i, 2), arr(i, 3)) End If End If End If Next Sheets("學歷表").Cells(2, 1).Resize(dic.Count, 3) = Application.Transpose(Application.Transpose(dic.items))End Sub |
|