2016-03-18 3 views
0

Я использую пользовательскую функцию импорта (скелет ниже) для сбора данных из текстовых файлов «Связанные» (содержащих заголовок/записи/нижний колонтитул). Первое поле заголовка всегда будет содержать 123, но мне нужно пропустить те записи, где второе поле в заголовке начинается с букв «AC».Custom Import VBA issue

Я попытался создать цикл, который, когда он найдет первое поле, содержит «123», а второе поле начинается с «AC», а затем пропускает записи до тех пор, пока не найдет другой «123», а затем снова проведет проверку через цикл и только вырваться из цикла, чтобы записать записи, которые не содержат «AC» во втором поле заголовка.

Однако я получаю сообщение об ошибке «Ошибка компиляции: Augment не является обязательным» на основе строки Loop Until rs!Field1 = "123" And Left(rs!Field2) <> "AC" при попытке выполнить следующее и не совсем уверенно, что еще нужно проверить, если строка во втором поле начинается с «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 
+1

Эта линия *. * Сбор. Я думаю, что вы слишком упростили свой код. [mcve] ==> Подтверждаемый – Andre

+1

BTW, 'Case Is =" 123 "' является ** очень ** неортодоксальным способом записи 'Case" 123 "' :) – Andre

+0

Извинения, это была строка, которая ранее не компилировалась , Я изменил свой оригинал, чтобы показать строку, которая не компилируется в раздел «Loop Until». Спасибо за комментарии к разделу 'Case is =" "'. Я буду изучать это коротко =) – Wowdude

ответ

1

Do/Пока/До циклов в VBA не приходят в различных формах, есть ответ здесь на SO (но я не могу найти его сейчас), в котором перечислены 7 версии.

(Edit: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 

Примечание: при использовании Do While Not rs.EOF избежать ошибки, если rs пуст.

+0

Я вижу. Конечно, вы можете использовать условие только в начале цикла или в конце, и я использовал его для обоих. В этом есть смысл. Поэтому вместо того, чтобы начинать с 'Do While' и зацикливать с помощью Loop Until', мне просто нужно« Do While »и цикл с простой« Loop »? – Wowdude

+0

Совершенно Андре! Я люблю петли и вложенные петли, но, к сожалению, я не очень хорош с ними и стараюсь строить их с эффективностью, сохраняя при этом простоту. Но у вас гораздо больше смысла. Спасибо за ваш совет. Выиграйте для вас! – Wowdude

 Смежные вопросы

  • Нет связанных вопросов^_^