【问题标题】:VBA Loop to MkDir from a SQL query从 SQL 查询到 MkDir 的 VBA 循环
【发布时间】:2019-03-21 09:46:06
【问题描述】:

我正在尝试使用 VBA 函数为表中的每个程序创建一个文件夹。表 TPrograms 将 ProgramID 作为关键字段。据我所知,它实际上并不是在阅读表格。

Dim rs As DAO.Recordset
Set rs = CurrentDb.OpenRecordset("SELECT * FROM TPrograms")
Do Until rs.EOF = True
    If Len(Dir("Y:\Education\TEST\" & ProgramID, vbDirectory)) = 0 Then
       MkDir "Y:\Education\TEST\" & ProgramID
    End If
    rs.MoveNext
Loop

MsgBox "Finished looping through records on record " & ProgramID

它运行,但它什么也不做,并以“通过记录在案”结束,最后没有数字。任何帮助将不胜感激。

【问题讨论】:

  • 模块声明中有Option Explicit,Access 会通知您ProgramID 有问题。您知道它是记录集中字段的名称,但 Access 不是。

标签: sql vba loops ms-access


【解决方案1】:

您实际上没有设置变量ProgramID。为它分配一个值:

ProgramID = rs!ProgramID

一起:

Dim rs As DAO.Recordset
Set rs = CurrentDb.OpenRecordset("SELECT * FROM TPrograms")
Do Until rs.EOF
    ProgramID = rs!ProgramID
    If Len(Dir("Y:\Education\TEST\" & ProgramID, vbDirectory)) = 0 Then
       MkDir "Y:\Education\TEST\" & ProgramID
    End If
    rs.MoveNext
Loop

MsgBox "Finished looping through records on record " & ProgramID

当然你也可以直接使用记录集中的字段

Dim rs As DAO.Recordset
Set rs = CurrentDb.OpenRecordset("SELECT * FROM TPrograms")
Do Until rs.EOF
    If Len(Dir("Y:\Education\TEST\" & rs!ProgramID, vbDirectory)) = 0 Then
       MkDir "Y:\Education\TEST\" & rs!ProgramID
    End If
    rs.MoveNext
Loop

MsgBox "Finished looping through records on record " & rs!ProgramID

我怀疑您的模块顶部没有Option Explicit,因此没有注意到变量ProgramID 没有声明。始终使用Option Explicit,这有助于避免错误。

【讨论】:

  • 非常感谢!这正是问题所在!我处于我所知道的最前沿并且在最后期限内,我非常感谢您的帮助。所以请确保我理解这一点:SQL 语句将该表拉入记录集,但 IF 语句还不能使用它,因为我必须单独定义一个变量。所以第一个先定义变量,然后运行语句,第二个将变量作为操作的一部分直接从记录集中拉出。
  • 因为您的代码顶部没有Option Explicit,所以您可以使用从未声明过的变量。因此,您没有注意到 ProgramID 是一个未声明且未分配的变量,而不是 RecordSet 中的字段。 RecordSet rs 确实加载了整个表,但您从未将其结果与rs!ProgramID 一起使用。无论您是直接通过rs!ProgramID 使用密钥还是先将其分配给变量都没有区别。
【解决方案2】:

您没有为 VBA 变量“ProgramID”赋值。您可以使用记录集的 .fields 属性来获取当前行的列值。

Do Until rs.EOF = True
    ProgramID = rs.Fields("ProgramID").Value

    If Len(Dir("Y:\Education\TEST\" & ProgramID, vbDirectory)) = 0 Then
       MkDir "Y:\Education\TEST\" & ProgramID
    End If
    rs.MoveNext
Loop

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-18
    • 2017-06-30
    • 1970-01-01
    相关资源
    最近更新 更多