表中的数据很简单,只有2列,用分号分隔,请见下表:
User; Hobby
User1; Reading,Internet,Music
User2; Internet,Computer,Reading
User3;
User4; Music
就是用户的爱好(一共有4种:Reading,Internet,Music,Computer 用逗号分隔),但是正如表中显示的,它们的出现没有先后顺序,也不是所有User都有Hobby(比如User3).
现在需要把这个2列的表,扩展成5列,如下所示:
User; Reading; Internet; Music; Computer
User1; Yes; Yes; Yes; No
User2; Yes; Yes; No; Yes
User3; No; No; No; No
User4; No; No; Yes; No
我想知道有没有简单的办法做到这种效果?谢谢!另外,我这个例子很简单,其实也许是几万行的数据和几十个Hobby的情况,所以手工比较困难。
------解决方案--------------------------------------------------------
不要用Excel了,先保存到CSV,在Access数据库里面读出来建立多对多关系,再生成CSV文件。
------解决方案--------------------------------------------------------
手工填写 所需结果 表 的 第1列 和 第1行
看上去象这样
User; Reading; Internet; Music; Computer
User1;
User2;
User3;
User4;
用vlookup函数配合search函数做个公式填充到数据区即可
------解决方案--------------------------------------------------------
Access可以拿来当数据库引擎,不然你还得自己写数据存储排序搜索什么的
------解决方案--------------------------------------------------------
这个不难吧,用不着写程序,用几个函数就可以完全搞定的
1、第一步:把数据导入到A列
2、B2公式:=MID(A2,1,SEARCH( "; ",A2)-1)
3、C2公式:=IF(IFERROR(SEARCH( "Reading ",A4), "N ")= "N ", "No ", "Yes ")
4、D2,E2,F2公式类似
5、选定b2:f2 往下拖动
6、选择b:f列 按复制
7、在新的SHEET中用选择性粘贴,选择仅复制数值
我在自己EXCEL中全部测试过了,能搞定。
------解决方案--------------------------------------------------------
即使是几万行的数据和几十个Hobby的情况,执行下面的宏就可以了:
'假设你的数据在A列
Sub macro1()
Application.ScreenUpdating = False
Dim arr, arr2() As String, s() As String, i As Long, j As Long, k As Long, n As Long, hobby As New Collection
On Error Resume Next
n = [a65536].End(xlUp).Row
k = 1
arr = [a1].Resize(n, 1)
ReDim arr2(1 To n, 1 To 256)
For i = 1 To n
arr2(i, 1) = Split(arr(i, 1), "; ")(0)
If i > 1 Then
s = Split(Trim(Split(arr(i, 1), "; ")(1)), ", ")
For j = 0 To UBound(s)
If WorksheetFunction.CountIf([b1:iv1], s(j)) = 0 Then k = k + 1: arr2(1, k) = s(j): hobby.Add k, s(j)
arr2(i, hobby(s(j))) = "yes "
Next
End If
Next
Sheets( "sheet2 ").[a1].Resize(n, 256) = arr2
Sheets( "sheet2 ").[a1].CurrentRegion.SpecialCells(4) = "no "
Application.ScreenUpdating = True
MsgBox "ok "
End Sub
------解决方案--------------------------------------------------------
狼的程序只处理源表的第一列
比如A1格为
User; Hobby
但我跑出来的结果不符合预期
其实不用VBA也行
===========================
手工填写 所需结果 表 的 第1列 和 第1行
看上去象这样
User; Reading; Internet; Music; Computer
User1;
User2;
User3;
User4;
在B2格填
=IF(ISERROR(SEARCH(B$1,VLOOKUP($A2,Sheet1!$A:$B,2,0))), "No ", "Yes ")
向右填充到最后一列(E列)