0

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

4

1 回答 1

3

没有什么能阻止您编写一些代码来“解析”给定文本并创建所需的 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
于 2016-03-01T01:42:10.240 回答