【问题标题】:How can I use an Access query which uses Access-VBA-defined functions in Word VBA?如何使用在 Word VBA 中使用 Access-VBA 定义的函数的 Access 查询?
【发布时间】:2011-01-25 21:43:37
【问题描述】:

问题状态:

我不再认为我引用 Excel 或查询有参数是相关的。我认为问题归结为:如何使用在 Word VBA 中使用 Access-VBA 定义的函数的 Access 查询?

我想做什么is impossible,如何根据shahkalpesh's answer 使 Acos 函数的内联版本与我的查询一起工作?


我在 Access VBA 中有一个函数:

Public Function Acos(radians As Double) As Double
     Acos = WorksheetFunction.Acos(radians)
End Function

WorksheetFunction 来自引用 Excel(我这样做只是因为它定义了 acos 函数)。

我在具有三个参数的查询中使用此函数。然后我在 Word VBA 中运行这个查询,如下所示:

Dim command As New ADODB.command
With command
    .ActiveConnection = connection
    .CommandText = "MyQueryName"
    .CommandType = adCmdStoredProc
    .Parameters.Append .CreateParameter( _
        "Param1", adDouble, adParamInput, , param1Value)
    .Parameters.Append .CreateParameter( _
        "Param2", adDouble, adParamInput, , param2Value)
    .Parameters.Append .CreateParameter( _
        "Param3", adDouble, adParamInput, , param3Value)
End With

Dim records As New ADODB.Recordset
records.Open command, , adOpenKeyset, adLockOptimistic

我在 Word VBA 中收到一个错误,即未定义函数 Acos。

想法?

更新

回应评论:是的,该查询在 Access 中完美运行。

另外,请注意,这都是 Office 2007。

更新 2

我们将从 Access 转到 Word,因为 VBA 程序已经在 Word 中,但需要进行一些数据处理,而这在 VBA 中并不实际。

更改为创建 Excel 应用程序对象除了显着减慢查询速度之外没有任何效果。

更新 3

我在 Word 和 Access 中都引用了 Excel。 (如果有更好的方法来获取 acos 函数,我当然愿意接受。)

【问题讨论】:

  • 您能否在 Access 中运行 Access 查询(使用 Acos)而不会出现任何错误?
  • 我本来期望 Set xl = CreateObject("Excel.Application") Acos = xl.WorksheetFunction.Acos(0.1) 另请注意,如果您输入错误的弧度值,您将得到一个错误。
  • 另外,我们为什么要从 Access 转到 Word?
  • 你没有提到,所以我不得不问。您是否将 Excel DLL 添加到您的 Word 参考库中?

标签: ms-access vba ms-office ado ms-word


【解决方案1】:

不要使用 Excel 来获取 ACos 的结果,试试这个

其中 X = 包含将传递给 Acos 的值的字段

SELECT X, IIF(X = 1, 0, Atn(-X / Sqr(-X * X + 1)) + 2 * Atn(1))
FROM myTable;

这是page,我参考了ACos 公式。

尝试并保存上述查询。
Access 中还有其他功能,例如AtnSqr,它们可以帮助您获得ACos 所需的功能。因此,您无需让 Excel 为您计算。

注意:您必须对 ACos 不支持的值进行错误处理。
例如=ACOS(1.25) 给你#NUM!(不是数字)

同理,如果上面查询的参数是1.25,就会返回错误。
因此,请小心并验证输入以确保查询不会崩溃。

【讨论】:

  • 这适用于替换 Acos 函数,但它仍然不允许我从 VBA 运行查询。我会尝试内联这个,但是我运行 Acos 的 X 是一个非常复杂的表达式,所以它会变得非常混乱。
  • 其实我对Acos的调用中的表达式太长了Access不会让我内联这个函数...
  • 有没有办法,您可以将 X 值转储到中间表的字段 Y 中并使用字段 Y 作为此表达式的参数?
  • 如何引用之前计算的字段?我尝试将字段名称放在表达式中,Access 要求输入值,就好像它是一个参数一样。
  • 我最终不得不创建一个临时列,然后计算实际结果,但是如果不按照我之前所说的要求计算字段就好像它一样,它不会让我对此进行排序是一个查询,所以我不得不进行第二个查询,查询第一个查询然后排序....但它工作正常。
【解决方案2】:

每页:

http://bytes.com/topic/net/answers/124351-custom-function-vba-access-stored-query-called-asp-net

我认为我想要做的事情是不可能的。如果有人可以提供有关如何使 shahkalpesh 的答案发挥作用的更多信息,我会为那里的答案表示赞赏。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-04
    • 2018-02-18
    • 2019-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多