我有一个 Excel 2007 电子表格,有 2250 行和 19 列。在这些行中,我可能有两行重复的客户信息需要合并,但前提是上面的单元格为空。我可能还有一些不需要合并的客户数据行。可以使用唯一的客户会员编号来标识需要合并在一起的行。我正在努力开发正确的 VBA 脚本,将唯一的客户数据合并到一行(顶部)并删除合并后剩余的行。有人愿意帮忙吗?这将为我节省数小时/数天的手动合并这些行的时间,而我们正处于时间敏感的审计中。
我们的数据样本:
会员名字 会员姓氏 会员编号 MVP 系统 进入日期 注册日期 MVP 积分抽奖条目 注册表?积分正确吗?积分缺失 最终积分抽奖条目 SP Talon # WP Talon # BD 部门 员工备注 DLR Gene S 550061 3/2/2013 0 0 0 #N/A Gene S 550061 3/2/2013 1539 137 MC MJ SP Steve G 550087 3/2/2013 30019 1588 PA NR WP Curtis S 550128 4/24/2013 5 0 5 #N/A Curt S 550128 4/24/2013 358 47 MC MJ SP
编辑(不是来自 OP)以添加带有下划线的管道/段落分隔版本来表示标题中的空格:
会员名字|会员姓氏|会员编号|MVP_SYSTEM_ENTRY_DATE|注册日期|MVP_POINTS|绘图条目|注册表格?|POINTS_CORRECT?|POINTS_MISSED|FINAL_POINTS|绘图条目|SP_Talon_#|WP_Talon_#|BD|DEPT|员工|备注|DLR
Gene|S|550061|03/02/2013||0|0||||0|#N/A|||||||
Gene|S|550061||03/02/2013|||||||||1539|137||MC|MJ||SP
Steve|G|550087||03/02/2013|||||||||30019|1588||PA|NR||WP
Curtis|S|550128|4/24/2013||5|0|||||5|#N/A|||||||
Curt|S|550128||4/24/2013|||||||||358|47||MC|MJ||SP
答案1
我不太确定您提供的说明,但无论如何,还是说一下!:
关键点——以下内容假设会员编号 MVP 系统中的进入日期将始终位于注册日期之上。
为了安全起见,请复制一份并为每一行添加一个索引号(例如插入ColumnA
、输入1
、A1
输入=A1+1
并将A2
公式复制到 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
(第一个 s 1
!),按值排序,从小到大排序,确定。
2
记下 Sheet2中包含的最低行号ColumnA
和占用最高行的行号。删除ColumnA
。
返回第一张表并删除所有包含黄色突出显示的行。
在 Sheet2 中,选择较低的行号,然后将所有其他具有较高数字的占用行复制并粘贴回ColumnA
第一张表的底部。
希望这能满足您的大部分要求 - 或者如果不是,这是“朝着正确方向迈出的一步”!为了检查,您最后占用的行现在应该是 2250+1 减去上述两个数字之间的差值。
要检查成员名字,我建议创建一个成员编号的查找表,然后在您复制的表格中根据该表比较成员名字。Curt 或 Curtis 大概是一个判断。
答案2
这是另一种可能的方法。它取决于三个条件:
- 必须有一个唯一标识符来区分重复字段和非重复字段。在本例中,字段 MEMBER# 可以满足这一目的。在其他情况下,标识符可能由多个字段中的值组合而成。此 ID 可以是单个字段中的值,也可以是多个字段中的值的组合。
- 任何 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 的行 - 然后将结果复制到新位置。
用于合并重复项的公式在结构上基本相同,因此有必要详细研究一下。这是表格中的第一个公式,来自单元格 AH3,用于 MEMBER_FIRST_NAME 列(我将在本文末尾附上结果表第一行的完整公式集)。
=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))))