2016-02-29 151 views
0

我正在制作一个简单的表格来填充表格。其中一个字段是包含一些ID,个人或范围,如下所示:“65,73,99-114”,逗号和短划线作为分隔符。我需要Access来在另一个表中查找这些ID,并将其他列中的一些数据提供到目标表中。这应该在提交表单时完成。 尽管这个任务听起来很简单,而且我知道C#和js的一些,但这是我第一次受到VBA的挑战。我从来没有处理过这样的应用程序,我发现这些手册太模糊和/或偏离主题。基本上,我需要知道从哪些方面入手以及一些常规技巧,但欢迎您提供任何高级帮助。 p.s.进入2016使用VBA解析MS Access窗体中的文本

+0

你可以使用一个零宽度,零高度的文本框用于每个段和查找这些使它变得容易,或者看看使用split函数,这将通过分隔符分割到一个数组。 –

+0

我需要一个如何使用表单中的数据从外部表中提取数据的想法。 – Ubertwink

+0

这不是你的问题,但答案是dlookup,并尝试从表格,绑定控件等表格搜索数据。 –

回答

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 
+0

哦,整洁的解决方案。 – Gustav