小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Excel VBA【案例】多文件多工作表數(shù)據(jù)匯總:員工簡歷信息批量匯總

 冷茶視界 2024-01-17 發(fā)布于江蘇

內(nèi)容提要

  • 多個文件多個工作表數(shù)據(jù)匯總
  • 字典、數(shù)組綜合運用

大家好,我是冷水泡茶。

今天在論壇上看到一個求助貼:

[求助] 緊急求助求助 多個員工簡歷表合并生成一個匯總表

現(xiàn)在有200多個員工的簡歷信息單表(圖1),一人一個文件匯總到一個信息匯總表(圖2)。

他的數(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代碼

代碼見第二條推文。

后記

1、代碼寫得比較冗長,我看到有人只寫了20幾行,主要采用直接指定目標數(shù)據(jù)單元格地址的方式。正如我前面所說,我不太喜歡這種方式,從某種程度上來說,降低靈活性,所以代碼很長,也算情有可原吧。
2、另外,我們還考慮了一些特殊情況,比如,父親、母親只有一條記錄的,或者順序顛倒的,都不影響取數(shù)的準確性。
3、昨天的案例【提取最高學歷】,有朋友留言,說代碼可以簡化一下,我研究了一下他的代碼,思路的確不錯,在此基礎上,我重新梳理了一下思路,又精減了幾行代碼,與我昨天寫的代碼相比,減少了一大半:
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
好,今天就到這,我們下期再會。

    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多