设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
查看: 1679|回复: 6
打印 上一主题 下一主题

[其它] 请教一下大家:Sub和Function之间的转换问题

[复制链接]
跳转到指定楼层
1#
发表于 2011-3-6 05:05:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
       这是我编写的两段代码。
  1. Sub Power()
  2. Dim rst As New ADODB.Recordset
  3. Dim xcl As Object
  4. Set xcl = CreateObject("Excel.Application")
  5. rst.Open "select * from 主营收入", CurrentProject.Connection, 1, 3
  6. Do Until rst.EOF
  7. rst.Fields("主营收入3年复合增长09") = xcl.WorksheetFunction.Power(rst.Fields("主营收入09") / rst.Fields("主营收入06"), 1 / 3) - 1
  8. Debug.Print rst.Fields("主营收入3年复合增长09")
  9. rst.MoveNext
  10. Loop
  11. rst.Close
  12. Set rst = Nothing
  13. Set xcl = Nothing
  14. End Sub
复制代码
  1. Function CallPower(Field1 As String, Field2 As String, year As Long) As Double
  2. Dim rst As New ADODB.Recordset
  3. Dim xcl As Object
  4. Set xcl = CreateObject("Excel.Application")
  5. rst.Open "select " & Field1 & "," & Field2 & " from 主营收入", CurrentProject.Connection, adOpenKeyset, adLockOptimistic
  6. Do Until rst.EOF
  7. CallPower = xcl.WorksheetFunction.Power(rst.Fields(Field1) / rst.Fields(Field2), 1 / year) - 1
  8. Debug.Print CallPower
  9. rst.MoveNext
  10. Loop
  11. rst.Close
  12. Set rst = Nothing
  13. Set xcl = Nothing
  14. End Function
复制代码
      Debug.Print调试的时候,结果是一样的。所以开始时是打算采用Function那段的,不过执行更新查询后 ,问题就来了:
       在QBE界面调用Function来做更新查询时,结果是所有的记录都跟记录的最后一条记录一样。最后只好改写成Sub了。Sub当然没问题了,不足之处是只能在VBE界面下运行,而且灵活度较小。
       关于函数和过程,比较透彻的解说,网上几乎没有,至少俺是“百度不得其解”,而这个特例,应该算是比较普遍的问题,至少可以让大家加深对函数和过程的理解;而对新手来说,也可以少走一些弯路。
       尽管我知道是MoveNext的问题,但是,应该如何修改语句呢?欢迎大家一起研究。

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 分享淘帖 订阅订阅
2#
发表于 2011-3-6 07:43:00 | 只看该作者
返回的值是最后一条记录,但中间过程的值应该是每条记录的值。
这个问题有两种处理方法,其一是直接有记录集进行更新,那么并不需要函数返回值。第二种方法是带入记录的值作为参数,返回计算结果,这种情况下不需用记录集。
第二种情况可将函数写为:
Function CallPower(Field1Val As Double, Field2Val As Double, year As Long) As Double
Dim xcl As Object
Set xcl = CreateObject("Excel.Application")
CallPower = xcl.WorksheetFunction.Power(Field1Val/ Field2Val, 1 / year) - 1
End Function


在查询中引用函数:
select *,CallPower([field1],[field2],year([fielddate])) as Myval from 主营收入
3#
 楼主| 发表于 2011-3-6 07:51:41 | 只看该作者
本帖最后由 roych 于 2011-3-6 08:04 编辑

老汉的第二种办法我试过。估计是因为没有打开记录集,每个都要历遍一次,超慢。您可以对照下附件:


本帖子中包含更多资源

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

x
4#
发表于 2011-3-6 09:19:03 | 只看该作者
慢是有点慢,但应该与打不打开记录集没什么关系。可能与数据来回捣腾的过程不同有关系。
此外第一种处理方法还回到查询有点脱裤子放屁的意味。呵呵
5#
发表于 2011-3-6 09:55:36 | 只看该作者
ADO的好例子,值得好好研究!
6#
 楼主| 发表于 2011-3-6 18:27:03 | 只看该作者
回复 todaynew 的帖子

O(∩_∩)O~,如果有窗体控件(例如按钮),自然可以直接调用Sub过程了。没有窗体的情况下,只能直接进入VBE界面按下F5执行了,甚至宏都写不了,这多少都有些不足吧?
7#
发表于 2011-3-7 10:44:20 | 只看该作者
roych 发表于 2011-3-6 18:27
回复 todaynew 的帖子

O(∩_∩)O~,如果有窗体控件(例如按钮),自然可以直接调用Sub过程了。没有窗体的情 ...

用宏中的RunCode命令调用函数
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-16 17:41 , Processed in 0.086076 second(s), 31 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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