【问题标题】:Undefined function 'Replace' in expression. Run-time error 3085表达式中未定义的函数“替换”。运行时错误 3085
【发布时间】:2026-01-20 13:40:02
【问题描述】:

我正在使用 vb 6.0 应用程序。我在查询中使用了替换功能。该查询在访问中工作正常,但是当它在 vb 中运行时,它给了我错误:

“表达式中未定义函数'Replace'。运行时错误3085”。

我认为我缺少参考资料。我目前添加了以下参考。

“替换”位于 where 子句中:

...WHERE ((DateValue(Replace(Invoice.InvoiceDate, ': ', ' ')) Between...

以下完整查询给了我错误。

Set DrsInv = db.OpenRecordset("SELECT Invoice.InvoiceDate, InvoicedProduct.InvoiceType, Invoice.InvoiceStatus, Invoice.RetailerID, Invoice.DailySalesID, Invoice.RepID, InvoicedProduct.Quantity, InvoicedProduct.UnitRate, InvoicedProduct.TotalItemValue From Invoice INNER JOIN InvoicedProduct ON (Invoice.DailySalesID = InvoicedProduct.DailySalesID) AND (Invoice.RepID = InvoicedProduct.RepID) AND (Invoice.InvoiceID = InvoicedProduct.InvoiceID)" _
                            & " WHERE ((DateValue(Replace(Invoice.InvoiceDate, ': ', ' ')) Between #" & Format(dtpFrom.value, "yyyy/mm/dd") & "# And #" & Format(dtpTo.value, "yyyy/mm/dd") & "#) AND (InvoicedProduct.ProductID = '" & Srs("ProductID") & "'))" _
                            & " GROUP BY Invoice.InvoiceDate, InvoicedProduct.InvoiceType, Invoice.InvoiceStatus, Invoice.RetailerID, Invoice.DailySalesID, Invoice.RepID, InvoicedProduct.Quantity, InvoicedProduct.UnitRate, InvoicedProduct.TotalItemValue HAVING ((InvoicedProduct.InvoiceType)='Invoice' AND (Invoice.InvoiceStatus)='VALID') Order By Invoice.InvoiceDate DESC")

我使用替换功能是因为 InvoiceDate 是一个文本字段。因此,当我尝试将其转换为查询中的日期字段时,它给了我错误“数据类型不匹配”。日期内的冒号是此错误的原因。这就是为什么我需要更换冒号。我无法更改数据库字段。所以这就是我所看到的解决方案。

InvoiceDate 字段的数据如下所示

【问题讨论】:

  • 替换属于 Visual Basic for Applications。最新的 DLL 是 VBE7.DLL
  • 你是如何定义db的?请添加初始化代码
  • 看起来问题是数据库引擎无法识别Replace。我无法复制它,但我知道 Replace 位于一个奇怪的地方,它是一个标准函数,但不允许在默认值中使用。
  • Jet Expression Service 没有实现 Replace、InStrRev 或其他几个较新的函数。 MS Access 使用专有方案在其位置注入自己的 VBA 处理器,但 VB6 程序无法做到这一点。
  • 您能否通过使用左侧、右侧等并将它们连接在一起从 InvoiceDate 字段构建您想要的格式?看看您的系统中的一些 InvoiceDate 值示例是什么样子会有所帮助。

标签: vb6 ms-access-2010


【解决方案1】:

这个功能对我来说没有多大意义。正如评论者所问的那样,您能否解释为什么需要从 InvoiceDate 中删除“:”?正如@LukeG 所说——添加数据示例会对我们有所帮助。

通过从日期的 AM/PM 部分中删除“:”,即使替换有效,您的函数也会失败,因为您会要求 DateValue 转换为现在未格式化为正确日期的字符串

你可以做几件事:

已编辑:

由于我们现在知道 InvoiceDate 不是日期字段,您可以通过获取前 10 个字符并转换为日期来删除该字段的时间部分:

(CDate(Left(Invoice.InvoiceDate,10)) Between #" & Format(dtpFrom.value, "yyyy/mm/dd") & "# And #" & Format(dtpTo.value, "yyyy/mm/dd") & "#)

【讨论】:

  • 先生,我很遗憾没有提供我的问题的所有信息。 InvoiceDate 不是日期字段。因此它需要转换,第二个答案是给我错误数据类型不匹配
  • 我在编辑的问题中添加了 InvoiceDate 字段的数据样本
  • 好的 - 更改解决方案以匹配它不是日期字段的事实。在比较之前从整个字段中剥离时间