Office中国论坛/Access中国论坛

标题: 请教一下大家:Sub和Function之间的转换问题 [打印本页]

作者: roych    时间: 2011-3-6 05:05
标题: 请教一下大家:Sub和Function之间的转换问题
       这是我编写的两段代码。
  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的问题,但是,应该如何修改语句呢?欢迎大家一起研究。


作者: todaynew    时间: 2011-3-6 07:43
返回的值是最后一条记录,但中间过程的值应该是每条记录的值。
这个问题有两种处理方法,其一是直接有记录集进行更新,那么并不需要函数返回值。第二种方法是带入记录的值作为参数,返回计算结果,这种情况下不需用记录集。
第二种情况可将函数写为:
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 主营收入
作者: roych    时间: 2011-3-6 07:51
本帖最后由 roych 于 2011-3-6 08:04 编辑

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


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

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

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

用宏中的RunCode命令调用函数




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3