【问题标题】:How to run a double loop in Access VBA如何在 Access VBA 中运行双循环
【发布时间】:2020-02-24 01:50:31
【问题描述】:

我正在学习 Access 几天,我遇到了一些问题,进入了双循环。我做错了什么,因为我不是 Access 专家。看来我陷入了无限循环(或其他一些错误)。我的目标是从同一个表中检索一些数据。这是一个例子:

Table1

Field1     Field2
AAA        1
BBB        2
CCC        3
CCC        4
AAA        5
BBB        6

我想检索字段 2 中 Field1= x 的所有记录(但如果找到相同的记录,则不重复该操作)

这是我的代码:

Dim strSQL as String, rs as DAO.Recordset, rs2 as Dao.Recordset, result as String

strSQL = "SELECT * FROM Table1"
strSQL2 = "SELECT DISTINCT Field1 FROM Table1"
Set rs = Currentdb.OpenRecordset(strSQL)
Set rs2 = Currentdb.OpenRecordset(strSQL2)


rs2.movefirst

While not rs2.EOF
rs.movefirst
result = ""
While not rs.EOF
If rs.Fields("Field1") = rs2.Fields("Field1") Then
result = result & rs.fields("Field2") & "   "
rs.movenext
End if
Wend
rs2.movenext
Debug.print result
Wend

Set rs=Nothing
Set rs2 = Nothing

我想要的结果应该是:

  • 结果(第一个循环)= 1 5

  • 结果(第二个循环)= 2 6

  • 结果(第三个循环)= 3 4

编辑: 我正在运行循环,因为我需要使用我找到的数据生成电子邮件。我知道如何生成电子邮件,但我只是堆在这个循环中。电子邮件示例应如下所示:

电子邮件数量 = [table1].[field1] 中唯一值的数量(在前面提到的示例中为 3)

对于每封电子邮件,字段 2 中所有记录的列表在字段 1 中具有循环值。

【问题讨论】:

  • 当你开始需要代码中的嵌套块时,你就开始需要consistent indentation
  • 您的需求似乎可以通过一条 SQL 语句来解决。你能分享一些样本数据和你想要的结果吗?您的解决方案感觉非常笨拙。
  • @JNevill 我需要生成不同的电子邮件(电子邮件数量=字段 1 中唯一值的数量)。在每封电子邮件中,正文应该是我在字段 2 中找到的所有记录的列表,这些记录在字段 1 中具有相同的记录,这就是我运行循环的原因。
  • 那么您可能希望为 Field1 中的每个值创建一个包含 Field2 中所有值的字符串。这需要一个 VBA 过程。一个常用的代码示例是 Allen Browne 的 ConcatRelated。

标签: sql database vba loops ms-access


【解决方案1】:

假设 Field2 实际上包含唯一的数值,请考虑:

TRANSFORM Max(Table1.Field2) AS MaxOfField2
SELECT Table1.Field1
FROM Table1
GROUP BY Table1.Field1
PIVOT DCount("*","Table1","Field1='" & Field1 & "' AND Field2<" & Field2)+1;

但是,如果 CROSSTAB 需要处理的值太多,或者如果您确实需要 Field2 中的单个值字符串用于 Field1 中的每个值,请使用 VBA 连接数据。一个版本http://allenbrowne.com/func-concat.html

【讨论】:

    【解决方案2】:

    另一个使用 ado 记录集的 getstring 方法的选项。

    a) 粘贴到 sql 视图中的新查询并保存:select field1,field2list(field1) from table1

    b) 在 vba 模块中,粘贴 field2list 函数:

    Function field2list(field1) As String
    Dim rs As New adodb.Recordset
    Dim ColumnSeparator
    Dim RowSeparator
    Dim sql
    ColumnSeparator = ""
    RowSeparator = ","
    sql = "select field2 from table1 where field1='" & field1 & "'"
    Set rs = CurrentProject.Connection.Execute(sql)
    If rs.RecordCount > 0 Then
        field2list = rs.GetString(, -1, ColumnSeparator, RowSeparator)
    End If
    End Function
    

    c) 打开在步骤 a 中创建的查询。

    【讨论】:

    • 更正:将sql语句改为group by field2以获取field2的唯一值:"select field2 from table1 where field1='" & field1 & "' group by field2"
    猜你喜欢
    • 2019-08-14
    • 1970-01-01
    • 2016-02-28
    • 2021-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    相关资源
    最近更新 更多