【问题标题】:Custom Import VBA issue自定义导入 VBA 问题
【发布时间】:2016-03-18 10:27:45
【问题描述】:

我使用定制的导入功能(下面的骨架)从“链接”文本文件(包含页眉/记录/页脚)中收集数据。标题的第一个字段将始终包含 123,但我需要跳过标题中的第二个字段以字母“AC”开头的那些记录。

我尝试创建一个循环,当它发现第一个字段包含“123”并且第二个字段以“AC”开头然后跳过记录直到找到另一个“123”,然后通过循环再次评估并且仅跳出循环,将不包含“AC”的记录写入标题的第二个字段。

但是,当我尝试以下操作并且不太确定如何检查第二个字段中的字符串是否以“AC”开头时,我收到基于行 Loop Until rs!Field1 = "123" And Left(rs!Field2) <> "AC" 的“编译错误:扩充不是可选的”。谢谢。

Public Function FormatTextFile()

Dim db As Database
Dim rs, rsa As Recordset
Dim cCount as double

Set db = CurrentDb
Set rs = db.OpenRecordset("Flow_20160316")

cCount = 1

Do

    Do While rs!Field1 = "123" And Left(rs!Field2, 2) = "AC"
        Debug.Print "Code Skipped on Record " & cCount
        cCount = cCOunt + 1
        rs.MoveNext
    Loop Until rs!Field1 = "123" And Left(rs!Field2) <> "AC"

Select Case rs!Field1

    Case Is = "123"
        'Code continues and writes some variables to tables'
        Case else
        Debug.Print "Code Skipped on Record " & cCount
    End select
    cCount = cCOunt + 1
rs.MoveNext

Loop until rs.eof

rs.Close
db.Close

Set rs = Nothing
Set db = Nothing

End Function

【问题讨论】:

  • 这一行确实编译。我认为您已经过多地简化了代码。 minimal reproducible example ==> 可验证
  • 顺便说一句,Case Is = "123" 是一种非常非正统的写法Case "123" :)
  • 抱歉,这是之前无法编译的行。我已经修改了我的原件以显示无法编译到 Loop Until 部分的行。感谢Case is = "" 部分的 cmets。我会尽快调查=)
  • 我还修改了主要段落以显示数据是从“链接”文本文件中提取的。不确定这是否会有所不同。

标签: ms-access vba do-while data-import do-loops


【解决方案1】:

VBA 中的 Do/While/Until 循环有多种形式,SO 上有一个答案(但我现在找不到)列出了 7 个版本。

编辑: found it - 警告:如果您没有空闲时间可以浪费,请不要去那里)

但是

Do While <condition>
    ' stuff
Loop Until <condition>

不允许 - 这是语法错误。条件只能出现一次。

这是一个不错的概述: http://www.excelfunctions.net/VBA-Loops.html#DoWhileLoop


话虽如此,您的带有嵌套循环的代码似乎过于复杂。你不能简单地这样做吗?

Do While Not rs.EOF

    If rs!Field1 = "123" And Left(rs!Field2, 2) = "AC" Then
        Debug.Print "Code Skipped on Record " & cCount
    Else
        ' regular code
    End If

    cCount = cCount + 1
    rs.MoveNext

Loop

注意:如果rs 为空,使用Do While Not rs.EOF 可以避免错误。

【讨论】:

  • 我明白了。当然,你只能在循环开始或结束时使用条件,我在这两个地方都使用过。这就说得通了。因此,与其从Do While 开始并以Loop Until 循环,我应该只需要Do While 并以简单的Loop 循环?
  • 那是完美的安德烈!我喜欢循环和嵌套循环,但不幸的是我对它们不是很好,并且在保持简单性的同时高效地构建它们。但你的更有意义。感谢您的意见。为你赢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-22
  • 2017-11-05
  • 2013-09-07
  • 1970-01-01
  • 2017-07-12
相关资源
最近更新 更多