【问题标题】:Parsing text in MS Access forms with VBA使用 VBA 解析 MS Access 表单中的文本
【发布时间】:2016-02-29 19:50:30
【问题描述】:

我正在制作一个简单的表格来填写表格。其中一个字段是包含一些 ID,可以是单个 ID,也可以是范围 ID,例如:“65,73,99-114”,以逗号和破折号作为分隔符。我需要 Access 在另一个表中查找此 ID,并将其他列中的一些数据提供到目标表中。这应该在提交表单时完成。 虽然这个任务听起来很简单,而且我知道一点 C# 和 js,但这是我第一次受到 VBA 的挑战。我从未处理过这样的应用程序和手册,我发现这些应用程序和手册太模糊和/或离题了。基本上,我需要知道从什么开始以及一些一般提示,但欢迎您提供任何高级帮助。 p.s.访问 2016

【问题讨论】:

  • 您可以为每个段使用零宽度、零高度文本框,并在这些文本框上使用 dlookup 使其变得容易,或者查看使用 split 函数,这将通过分隔符拆分为数组。
  • 我需要了解如何使用表单中的数据从外部表中提取数据。
  • 这不是你的问题,但答案是 dlookup,并尝试从表单、绑定控件等表格中搜索数据。
  • 写一些代码给我们看。懂 C# 和 js,这应该很容易。

标签: ms-access vba ms-access-2016


【解决方案1】:

没有什么能阻止您编写一些代码来“解析”给定文本并创建所需的 SQL。这样的代码在 C# 或 VBA 中的外观并不是真正困难的部分。真正的挑战是编写代码来解析。 (编写代码!- 方法与我的 c# 大致相同)。

我只是对它进行了空气编码,它看起来工作得很好。此代码假定有问题的列是一个数字列(因此每个值都不需要引号)。

代码如下所示:

 Function MyWhereRanges(strRanges, strField As String) As String

   ' take the raganges, and return a where clause
   Dim vTokens      As Variant
   Dim strRa        As String       ' sql for ranges
   Dim strIn        As String       ' sql for "in" clause
   Dim s            As Variant
   Dim strResult    As String       ' return value

   vTokens = Split(strRanges, ",")
   For Each s In vTokens
      If InStr(s, "-") Then
         ' this is a range - append the range
         If strRa <> "" Then
            strRa = strRa & " and "
         End If
         strRa = strRa & "(" & strField & " between " & _
                 Split(s, "-")(0) & " and " & Split(s, "-")(1) & ")"
      Else
         ' append to the "in" clause
         If strIn = "" Then
            strIn = "(" & strField & " in ("
         Else
            strIn = strIn & ","
         End If
         strIn = strIn & s
      End If
  Next s

  If strIn <> "" Then strIn = strIn & ")) "
  strResult = strIn

  If strRa <> "" Then
     If strResult <> "" Then strResult = strResult & " and "
     strResult = strResult & strRa
  End If

  MyWhereRanges = strResult     ' return the value

 End Function

因此,您可以在调试窗口中输入:

? mywhereranges("5,6,12-13,15-25","InvoiceNum")

上面的结果是这样的:

(InvoiceNum in (5,6))  and 
(InvoiceNum between 12 and 13) and 
(InvoiceNum between 15 and 25)

因此,在实际表单中,您可以像这样启动报告或表单:

Dim strSQLwhere       As String
strSQLwhere = MyWhereRanges(Me.txtBoxRanges, "InvoiceNum")
DoCmd.OpenReport "rptInvoices", acViewPreview, , strSQLwhere

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-15
    • 2014-02-14
    • 2015-02-27
    • 2018-09-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多