设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

12345下一页
返回列表 发新帖
查看: 11367|回复: 47
打印 上一主题 下一主题

[模块/函数] 水泥做的女人——浅谈Excel函数的调用

[复制链接]
跳转到指定楼层
1#
发表于 2011-4-22 22:24:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 roych 于 2015-6-26 11:14 编辑

       Access在计算方面并不如Excel,复杂的统计不该由Access完成,而是在Excel里完成之后再把数据导入到Access里。不过,有些版友希望Access可以完成Excel的一些工作,这样就可以一劳永逸了。
       我一直觉得应该软件之间尽可能交互使用,扬长避短才能优化工作效率。正如男人是泥做的,女人是水做的,世界才更加精彩。而一旦女子偶尔强势一下无可厚非,但如果永远都一片阳刚,那她也不再是水做的了,应该是水泥做的吧。
       言归正传,以下是对成绩高低进行排名的一段代码(附件里有注释):
  1. Private Sub 排名_Click()
  2. Dim exl As Excel.Application
  3. Dim wb As Excel.Workbook
  4. Dim ws As Excel.Worksheet
  5. Dim rst As New ADODB.Recordset
  6. rst.Open "select * from 成绩表", CurrentProject.Connection, adOpenKeyset, adLockOptimistic
  7. Set exl = CreateObject("Excel.Application")
  8. exl.Workbooks.Add
  9. Set wb = exl.ActiveWorkbook
  10. With wb
  11. Set ws = exl.Worksheets(1)
  12. ws.Activate
  13. With ws
  14. .Range("A1").CopyFromRecordset rst
  15. rnk = exl.WorksheetFunction.Rank(Me.成绩, .Range("C:C"))
  16. End With
  17. wb.Close False, Me.Name
  18. End With
  19. MsgBox Me.姓名 & "的成绩排名为:第" & rnk & "名", vbInformation
  20. rst.Close
  21. End Sub
复制代码
      这里的知识点有两三个:1、使用ADO打开数据集。2、导出数据集到工作表。3、调用Excel内置函数Rank。
       此外,还有更简单的办法,不过测试时发现第二种方法运行要慢些:
  1. Private Sub 排名2_Click()
  2. Dim xcl As Object
  3. Dim rs As New ADODB.Recordset
  4. rs.Open "select * from 成绩表", CurrentProject.Connection, adOpenKeyset, adLockOptimistic
  5. Set xcl = CreateObject("excel.sheet")
  6. Set xcl = xcl.Application.ActiveWorkbook.ActiveSheet
  7. With xcl
  8. .[a1].CopyFromRecordset rs
  9. .[k1].Formula = "=rank(" & Me.成绩 & ",C:C)"
  10. End With
  11. MsgBox Me.姓名 & "的成绩排名为:第" & xcl.[k1].Value & "名", vbInformation
  12. Set x = Nothing
  13. End Sub
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享分享 分享淘帖 订阅订阅
2#
发表于 2011-4-22 23:33:31 | 只看该作者
3#
发表于 2011-4-23 07:28:03 | 只看该作者
学习学习
4#
发表于 2011-4-23 09:27:09 | 只看该作者
5#
发表于 2011-4-23 09:40:58 | 只看该作者
学习!
6#
发表于 2011-4-23 10:21:30 | 只看该作者
学习学习
7#
发表于 2011-4-23 10:28:31 | 只看该作者
学习学习
8#
发表于 2011-4-23 12:37:03 | 只看该作者
本帖最后由 红尘如烟 于 2011-4-23 12:41 编辑

其实没必要调用Excel,直接用记录集就能实现了,不需要打开Excel,效率会高很多:
  1. Private Sub 排名_Click()
  2.     Dim strSQL As String
  3.     Dim rst As Object    'DAO.Recordset
  4.    
  5.     strSQL = "SELECT DISTINCT 成绩 FROM 成绩表 ORDER BY 成绩 DESC"
  6.     Set rst = CurrentDb.OpenRecordset(strSQL, , 4)    ' dbReadOnly = 4
  7.     rst.FindFirst "成绩=" & Me.成绩
  8.     MsgBox Me.姓名 & "的成绩排名为:第" & rst.AbsolutePosition + 1 & "名"
  9.     rst.Close
  10.     Set rst = Nothing
  11. End Sub
复制代码
不记得是谁说过的:编程这件事,更多的是受限于想象力……
9#
发表于 2011-4-23 13:01:01 | 只看该作者
8楼红尘版主的方法也很好,但我认为楼主主要的意思是说明调用EXCEL的方法。
10#
发表于 2011-4-23 18:05:27 | 只看该作者
我也来学习学习。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-11-29 16:02 , Processed in 0.086176 second(s), 35 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表