
我有一個 Excel 2007 電子表格,有 2250 行和 19 列。在這些行中,我可能有兩行重複的客戶資訊需要合併,但前提是上面的儲存格為空。我可能還有一些不需要合併的客戶資料行。唯一的客戶成員編號可用於識別需要組合在一起的行。我正在努力開發正確的 VBA 腳本,將唯一的客戶資料合併到一行(頂部)中,並刪除合併後剩餘的行。有人願意幫忙嗎?這將節省我數小時/數天的時間來組合這些行,而且我們正在進行時間敏感的審核。
我們的資料樣本:
會員名字 會員姓氏 會員# MVP 系統輸入日期 註冊日期 MVP 積分 抽獎條目 註冊表格?要點正確嗎?錯過的分數 最終分數 繪圖條目 SP Talon # WP Talon # BD 部門員工註釋 DLR 基因 S 550061 3/2/2013 0 0 0 #N/A 基因 S 550061 2013 年 3 月 2 日 1539 137 MC MJ SP 史蒂夫 G 550087 3/2/2013 30019 1588 PA NR WP 柯蒂斯 S 550128 2013 年 4 月 24 日 5 0 5 #N/A 柯特 S 550128 4/24/2013 358 47 MC MJ SP
編輯(不是來自OP)以添加管道/段落分隔版本,並在標題中添加下劃線空格:
MEMBER_FIRST_NAME|MEMBER_LAST_NAME|MEMBER_#|MVP_SYSTEM_ENTRY_DATE|ENROLL_DATE|MVP_POINTS|DRAWING_ENTRIES|ENROLL_FORM?|POINTS_CORRECT?|POINTS_MISSEDTaDR_MISSED|FCUS0505| OYEE|註S|DLR
基因|S|550061|03 / 02/2013||0|0||||0|#N/A|||||||
基因|S|550061||2013年2月3日||||||||1539|137||MC|MJ||SP
史蒂夫|G|550087||2013年2月3日||| |||| |30019|1588||PA|NR||WP
柯蒂斯|S|550128|2013年4月24日||5|0||||5|#N/A||||| ||
簡短|S|550128||2013年4月24日||||||||358|47||MC|MJ||SP
答案1
我不太確定您提供的說明,但無論如何!
重點 - 以下假設在 MEMBER # MVP 系統進入日期內將始終高於註冊日期。
為了安全起見,請處理副本並向每行添加索引號(例如 insert ColumnA
、 put 1
in A1
、=A1+1
inA2
並將公式複製到 Row2250。將ColumnA
特殊/值複製並貼上到頂部。
選擇D2
、首頁 > 樣式 – 條件格式、新規則、使用公式決定要設定格式的儲存格、格式化此公式為真的值:插入=AND(NOT(ISBLANK(D2)),OR(D1=D2,D2=D3))
、格式、填入、選擇黃色、確定、確定。在「條件格式 - 管理規則」中,在「套用」中輸入=$D$2:$D$2250
「套用」。好的。
選擇整個電子表格(點擊 A 左側和標題中 1 上方的三角形),資料 > 排序和過濾 – 過濾,然後對於ColumnD
按顏色過濾,選擇黃色。
將 Row1 複製到最後一行以藍色編號並貼上到A1
另一個工作表(例如 Sheet2)中。
在Sheet2中,刪除F1
,將儲存格上移,確定。也N1:T1
. (這是可能需要額外觀察的地方。)
ColumnA
在 Sheet2中新增內容。放入、輸入、選擇,抓住所選內容的右下角,按住滑鼠左鍵,同時向下拖曳至所需位置,直到1
按住。 A1
2
A2
A1:A2
Ctrl
選擇 Sheet2,資料 > 排序和過濾 – 排序,選取我的資料有標題,排序依據ColumnA
(第一個1
!),按值排序,從最小到最大排序,確定。
2
記下 Sheet2包含的最低行號ColumnA
和最高佔用行號。刪除ColumnA
。
返回第一個工作表並刪除包含黃色突出顯示的所有行。
在 Sheet2 中,選擇較低的行號和具有較高編號副本的所有其他佔用的行,然後將其貼回ColumnA
第一張工作表的底部。
希望這能滿足您的大部分需求 - 或者如果沒有,這也是「朝著正確方向邁出的一步」!檢查一下,您最後佔用的行現在應該是 2250+1 減去上面提到的兩個數字之間的差異。
要檢查會員名字,我建議建立一個會員號碼的查找表,然後在此基礎上在您複製的表格中比較會員名字。柯特或柯蒂斯大概是一個判斷力。
答案2
這是另一種可能的方法。這取決於三個條件:
- 必須有唯一識別碼來區分重複欄位和非重複欄位。在這種情況下,字段 MEMBER# 就用於此目的。在其他情況下,標識符可以被建構為多個欄位中的值的組合。
- 任何 MEMBER# 的重複項不得超過兩個,即沒有三重或更多的「重複」記錄。
- 行按 MEMBER# 標識符排序。
這個想法是建構一個轉換後的表,最方便地位於現有表的右側,該表使用公式將兩個重複行之間共享的部分資料合併為一行,留下一個填充行和一個空白行排。
完成此操作後,可以將篩選器套用於結果表以排除空白行,而將填入的行複製到另一個位置。
如下所示,我在 A 列中新增了一個標誌欄位「DUP」:如果 C 列中的 MEMBER# 等於前一行中的 MEMBER#,則它等於 1,否則等於 0。範例資料中具有重複 MEMBER# 的兩組行以黃色突出顯示。
這是公式結果表的樣子。如預期的那樣,兩筆記錄之間共享的補充資訊已收集到其中一筆記錄中,而另一筆記錄則以雙破折號(「--」)填充。 (範例資料中的兩組重複行在表中以深藍色突出顯示。)
查看表格的前兩行,其中包含 MEMBER# 550061 的重複版本,MEMBER_FIRST_NAME 列第 4 行中的第二個「Gene」已替換為「--」;在第 3 行中先前空白的 ENROLLMENT_DATE 現在填入 3/2/2013,從第 4 行向上移動;第二個 DRAWING_ENTRIES 欄位(原始表中的 M 列,新表中的 AS 列)的 N/A 值已被替換為空白。
剩下要做的就是套用篩選器,使用 DUP 列作為條件列,僅選擇 DUP 等於 0 的行 - 並將結果複製到新位置。
用於合併重複項的公式在結構上基本上相同,因此詳細檢查一個公式是有意義的。這是表中 MEMBER_FIRST_NAME 列的第一個公式,來自單元格 AH3(我在本文末尾包含了結果表第一行的完整公式集)。
=IF($A3=1, If this is row 2 of a DUP set,
"--", Set value of the result cell to "--"
Otherwise it's a row 1 (maybe a dup, maybe not)
IF($A4=0, Is the following row its dup?
IF(IFERROR(B3="",FALSE),"",B3), No, set result to the value on this row
IF(OR(IFERROR(B3="",FALSE),ISERROR(B3)), Yes, but is this row's value blank or error?
IF(IFERROR(B4="",FALSE),"",B4), Yes, use the value from the following row
IF(IFERROR(B3="",FALSE),"",B3)))) No, use the value from this row
另一個程式碼的註解是:IFERROR(<cell address>="",FALSE)
需要使用某種迂迴的措詞來正確篩選某些行中的 N/A 錯誤值。
結果表第一行的程式碼
DUP =IF(D3=D2,1,0)
FNAME =IF($A3=1,"--",IF($A4=0,IF(IFERROR(B3="",FALSE),"",B3),IF(OR(IFERROR(B3="",FALSE),ISERROR(B3)),IF(IFERROR(B4="",FALSE),"",B4),IF(IFERROR(B3="",FALSE),"",B3))))
LNAME =IF($A3=1,"--",IF($A4=0,IF(IFERROR(C3="",FALSE),"",C3),IF(OR(IFERROR(C3="",FALSE),ISERROR(C3)),IF(IFERROR(C4="",FALSE),"",C4),IF(IFERROR(C3="",FALSE),"",C3))))
MEMBER# =IF($A3=1,"--",IF($A4=0,IF(IFERROR(D3="",FALSE),"",D3),IF(OR(IFERROR(D3="",FALSE),ISERROR(D3)),IF(IFERROR(D4="",FALSE),"",D4),IF(IFERROR(D3="",FALSE),"",D3))))
ENTRY DT =IF($A3=1,"--",IF($A4=0,IF(IFERROR(E3="",FALSE),"",E3),IF(OR(IFERROR(E3="",FALSE),ISERROR(E3)),IF(IFERROR(E4="",FALSE),"",E4),IF(IFERROR(E3="",FALSE),"",E3))))
ENROL_DT =IF($A3=1,"--",IF($A4=0,IF(IFERROR(F3="",FALSE),"",F3),IF(OR(IFERROR(F3="",FALSE),ISERROR(F3)),IF(IFERROR(F4="",FALSE),"",F4),IF(IFERROR(F3="",FALSE),"",F3))))
MVP_PTS =IF($A3=1,"--",IF($A4=0,IF(IFERROR(G3="",FALSE),"",G3),IF(OR(IFERROR(G3="",FALSE),ISERROR(G3)),IF(IFERROR(G4="",FALSE),"",G4),IF(IFERROR(G3="",FALSE),"",G3))))
ENTRIES =IF($A3=1,"--",IF($A4=0,IF(IFERROR(H3="",FALSE),"",H3),IF(OR(IFERROR(H3="",FALSE),ISERROR(H3)),IF(IFERROR(H4="",FALSE),"",H4),IF(IFERROR(H3="",FALSE),"",H3))))
FORM =IF($A3=1,"--",IF($A4=0,IF(IFERROR(I3="",FALSE),"",I3),IF(OR(IFERROR(I3="",FALSE),ISERROR(I3)),IF(IFERROR(I4="",FALSE),"",I4),IF(IFERROR(I3="",FALSE),"",I3))))
PTS_CORRECT =IF($A3=1,"--",IF($A4=0,IF(IFERROR(J3="",FALSE),"",J3),IF(OR(IFERROR(J3="",FALSE),ISERROR(J3)),IF(IFERROR(J4="",FALSE),"",J4),IF(IFERROR(J3="",FALSE),"",J3))))
PTS_MISSED =IF($A3=1,"--",IF($A4=0,IF(IFERROR(K3="",FALSE),"",K3),IF(OR(IFERROR(K3="",FALSE),ISERROR(K3)),IF(IFERROR(K4="",FALSE),"",K4),IF(IFERROR(K3="",FALSE),"",K3))))
FINAL_PTS =IF($A3=1,"--",IF($A4=0,IF(IFERROR(L3="",FALSE),"",L3),IF(OR(IFERROR(L3="",FALSE),ISERROR(L3)),IF(IFERROR(L4="",FALSE),"",L4),IF(IFERROR(L3="",FALSE),"",L3))))
DR_ENTRIES =IF($A3=1,"--",IF($A4=0,IF(IFERROR(M3="",FALSE),"",M3),IF(OR(IFERROR(M3="",FALSE),ISERROR(M3)),IF(IFERROR(M4="",FALSE),"",M4),IF(IFERROR(M3="",FALSE),"",M3))))
SP_TALON =IF($A3=1,"--",IF($A4=0,IF(IFERROR(N3="",FALSE),"",N3),IF(OR(IFERROR(N3="",FALSE),ISERROR(N3)),IF(IFERROR(N4="",FALSE),"",N4),IF(IFERROR(N3="",FALSE),"",N3))))
WP_TALON =IF($A3=1,"--",IF($A4=0,IF(IFERROR(O3="",FALSE),"",O3),IF(OR(IFERROR(O3="",FALSE),ISERROR(O3)),IF(IFERROR(O4="",FALSE),"",O4),IF(IFERROR(O3="",FALSE),"",O3))))
BD =IF($A3=1,"--",IF($A4=0,IF(IFERROR(P3="",FALSE),"",P3),IF(OR(IFERROR(P3="",FALSE),ISERROR(P3)),IF(IFERROR(P4="",FALSE),"",P4),IF(IFERROR(P3="",FALSE),"",P3))))
DEPT =IF($A3=1,"--",IF($A4=0,IF(IFERROR(Q3="",FALSE),"",Q3),IF(OR(IFERROR(Q3="",FALSE),ISERROR(Q3)),IF(IFERROR(Q4="",FALSE),"",Q4),IF(IFERROR(Q3="",FALSE),"",Q3))))
EMPL =IF($A3=1,"--",IF($A4=0,IF(IFERROR(R3="",FALSE),"",R3),IF(OR(IFERROR(R3="",FALSE),ISERROR(R3)),IF(IFERROR(R4="",FALSE),"",R4),IF(IFERROR(R3="",FALSE),"",R3))))
NOTES =IF($A3=1,"--",IF($A4=0,IF(IFERROR(S3="",FALSE),"",S3),IF(OR(IFERROR(S3="",FALSE),ISERROR(S3)),IF(IFERROR(S4="",FALSE),"",S4),IF(IFERROR(S3="",FALSE),"",S3))))
DLR =IF($A3=1,"--",IF($A4=0,IF(IFERROR(T3="",FALSE),"",T3),IF(OR(IFERROR(T3="",FALSE),ISERROR(T3)),IF(IFERROR(T4="",FALSE),"",T4),IF(IFERROR(T3="",FALSE),"",T3))))