那你得上附件,因为我这里没有这个问题。 关于注解,我先把它变成标准形式: Sub total() Application.ScreenUpdating = False Set Cnn = CreateObject("adodb.connection") cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=Excel 8.0;Data Source=" & ActiveWorkbook.FullName [a4:d65536].ClearContents Sql = "TRANSFORM COUNT(通话类型) SELECT 对方号码,SUM([时长(秒)]) FROM [原始数据$] GROUP BY 对方号码 PIVOT 通话类型 " [a4].CopyFromRecordset Cnn.Execute(Sql) cnn.Close Set cnn = Nothing Range("A3:E" & [a65535].End(xlUp).Row).Sort Key1:=Range("D3"), Order1:=xlDescending Application.ScreenUpdating = True End Sub 1. 设置对象 Set Conn = CreateObject("adodb.connection") 2. 打开联接 (1)包含字段名的情况 Conn.Open "provider=microsoft.jet.oledb.4.0;extended properties=excel 8.0;data source=" & 文件全路径 (2)不包含字段名的情况 Conn.Open "provider=microsoft.jet.oledb.4.0;extended properties='excel 8.0;hdr=no';data source=" & 文件全路径 (3)同一列中数据类型不一致的情况 Conn.Open "provider=microsoft.jet.oledb.4.0;extended properties='excel 8.0;imex=1';data source=" & 文件全路径 3. 设置 sql 语句 Sql = sql 语句 4. 执行 sql 语句 放置结果的区域的左上角单元格.CopyFromRecordset Conn.Execute(Sql)
5. 关闭联接 conn.Close 6. 对象置空 Set Conn = Nothing 处理不同问题时深色部分的代码可以保持不变,只要根据不同情况改变红色部分的代码即可。 所以对照上面的分析,本例中需要解释的就剩 SQL 语句了 Set Cnn = CreateObject("adodb.connection") cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=Excel 8.0;Data Source=" & ActiveWorkbook.FullName [a4:d65536].ClearContents Sql = "TRANSFORM COUNT(通话类型) SELECT 对方号码,SUM([时长(秒)]) FROM [原始数据$] GROUP BY 对方号码 PIVOT 通话类型 " [a4].CopyFromRecordset Cnn.Execute(Sql) cnn.Close Set cnn = Nothing 若仅是获取工作表某区域中的数值而没有汇总等等其他的操作,那么基本的SQL语句为: SELECT * FROM [表名$区域] 若没有指明区域且包含字段名,则对于字段名连续的表: SELECT * FROM [原始数据$]) 可将原始数据表中所有字段名下的数据取出, SELECT 字段名1 FROM [原始数据$]) 可将原始数据表中指定字段名1下的数据取出, SELECT SUM(字段名2) FROM [原始数据$]) GROUP BY 字段名1 可求出原始数据表中字段名2根据字段名1的分类求和值, 若同时列出分类字段字段名1: SELECT 字段名1,SUM(字段名2) FROM [原始数据$]) GROUP BY 字段名1 则结果的第一列为字段名1的不重复值,第二列为字段名2根据字段名1的分类求和值, TRANSFORM COUNT(字段名4)
SELECT 字段名1 FROM [原始数据$])
GROUP BY 字段名1 PIVOT 字段名3
可将PIVOT
后面指定的字段名3的非重复值作为列标题,并求出字段名4根据字段名1的分类个数值, TRANSFORM COUNT(字段名4) SELECT 字段名1,SUM(字段名2) FROM [原始数据$]) GROUP BY 字段名1 PIVOT 字段名3 得结果的第一列为字段名1的不重复值,第二列为字段名2根据字段名1的分类求和值,后面为字段名3的非重复值作为列标题的字段名4根据字段名1的分类个数值, (上面所涉及到的字段名可相同也可不同)所以, TRANSFORM COUNT(通话类型) SELECT
对方号码,SUM([时长(秒)]) FROM [原始数据$] GROUP BY 对方号码 PIVOT
通话类型 即可得到第一列为对方号码的不重复值,第二列为时长根据对方号码的分类求和值,后面为通话类型的非重复值作为列标题的通话类型根据对方号码的分类个数值,因为通话类型只有两种“主叫”和“被叫”,所以第三列为“主叫”次数即呼出次数,第四列为“被叫”次数即呼入次数。
[此贴子已经被作者于2006-12-24 18:33:07编辑过] |