当前位置: 代码迷 >> VBA >> Excel 2003的绝对难题!挑战高手的Excel分列难题,寻求有效的方法!解决思路
  详细解决方案

Excel 2003的绝对难题!挑战高手的Excel分列难题,寻求有效的方法!解决思路

热度:2336   发布时间:2013-02-26 00:00:00.0
Excel 2003的绝对难题!挑战高手的Excel分列难题,寻求有效的方法!
表中的数据很简单,只有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列)
  相关解决方案