你好!这题目是一个典型的将一个交叉表(二维表)数据转换为数据库记录(一行一行的记录)表的操作过程,我可以给你一个操作,稍等。
1、先将表整理一下,取消合并单元格,为了唯一值,在每个科目前加一个科目代码列(如图),
2、以身份证号加科目代码为唯一值,在表前加三空列,A2=H2&I2,B2=H2&M2,C2=H2&Q2, 下拉,得到全部值,然后复制这3列值,再选择性粘贴为数值(因公式所得值不能当参数);
3、复制前三列值(不包括表头),粘贴---选择性粘贴为数值---转置,
4、列公式,错位相等,再下拉公式,直到值为0出现时,这样就把原来的交叉数据变成一列唯一的记录。
5、再复制得到的新列A,选择粘贴为数值,原表后面的列值全部可以用vlookup( )函数实现。B30=vlookup(A30, $A$1:$T$6, 6, 0), C30=vlookup(A30, $A$1:$T$6, 7, 0),
因本人经常与数据库打交道,常用EXCEL转换数据,这个方法当你面对海量数据进行加工时,特别实用,希望对你用。谢谢
【代码和图片已更新过,开始上传的答案有点问题,现在正确了。】
你这个问题,公式不好解决。用VBA代码吧。
先看下图:
方法:
点顶部的“开发者工具”,点“VisualBasic”打开VB编辑器,
在画蓝色框的区域内的任意位置,点右键---插入模块,
点击模块,在右侧输入代码,
点击画粉色圆圈的按钮执行代码,即可得出结果。
代码中加了注释文字,方便你看懂,
代码如下:
Sub 拆分数据()
Dim i, t As Integer '定义i和t的类型
For i = 3 To 4 '遍历原数据所在行,从第3行到第4行
x = Evaluate("COUNTA(F" & i & ",I" & i & ",L" & i & ")") '统计Fi、Ii、Li非空单元格个数
If [A10] = "" Then '数据从A10单元格开始写
s = 10 '如果A10格是空的,则s=10
Else
s = [A65536].End(3).Row + 1 '否则s=A列最后一个数据的行号+1
End If
For t = s To s + x - 1 '遍历该同学需写数据的行,从第s行到第s+x-1行
Range("A" & t) = Range("A" & i)
Range("B" & t) = Range("B" & i)
Range("C" & t) = Range("C" & i)
Range("D" & t) = Range("D" & i)
Range("E" & t) = Range("E" & i)
Range("F" & t) = Cells(i, 5 + (t - s) * 3 + 1) '5指原数据中第一个科目左侧列的列序数
Range("G" & t) = Cells(i, 5 + (t - s) * 3 + 2) '例图上第一个科目左列为E列的列序数是5
Range("H" & t) = Cells(i, 5 + (t - s) * 3 + 3) '3指原数据科目列序数等差,F、I、L的列等差为3
Next t
Next i
End Sub
这个
个可以的
后面成绩的部分没写,思路是这样,后面的index里面地址要么手动换,要么你自己加一个offset
然后下拉拖动
注意第一行需要手动
=IF(COUNTIF($C$9:C11,C11)