Страницы: 1
RSS
VBA делать пока код в цикле выдает ошибку (делать до первой неошибочной попытки)
 
Есть цикл, который пытается подставить в базу (аналитический Куб) сегодняшнюю дату и выгрузить на нее определенные данные. Если сегодняшней даты в Кубе нет, то он должен подставлять сегодняшнюю дату -1, если и ее нет, то еще -1 и т.д. до первого успеха.
Как выглядит (записывается) команда в начале цикла Do While (или Do until), чтоб он выполнял цикл, пока операция подстановки не даст НЕ ошибку?

Что-то типа Do while not iserror [операция кода] Loop

Вариант выше не работает. У самого знания матчасти недостаточно чтоб корректно написать.

Текст кода ниже. Все кроме "Do while Not IsError" работает.

Код
Sub Macron1()

Dim i As Long
Dim segodnya, Dt As Date
Dim DtText As String
Dim Pvt As Object

Set Pvt = ThisWorkbook.Worksheets(1).PivotTables("СводнаяТаблица1")
segodnya = Format(Now, "YYYY-MM-DD")

i = 0

Do While Not IsError
    Dt = Format(segodnya - i, "YYYY-MM-DD")
    DtText = Dt

    On Error Resume Next
    Pvt.PivotFields( _
        "[Дата отчета].[Дата отчета].[Дата отчета]").VisibleItemsList = Array( _
        "[Дата отчета].[Дата отчета].&[" & DtText & "T00:00:00]")
    i = i + 1
Loop

End Sub
 
если вы опишете не свой способ решения, а задачу, которую решаете (понятно с файлом-примером), возможно вам предложат работающий и более оптимальный код
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
что-то из угадайки:
Код
On Error Resume Next
Do
    err.clear
    
    Dt = Format(segodnya - i, "YYYY-MM-DD")
    DtText = Dt
    Pvt.PivotFields( _
        "[Дата отчета].[Дата отчета].[Дата отчета]").VisibleItemsList = Array( _
        "[Дата отчета].[Дата отчета].&[" & DtText & "T00:00:00]")
    i = i + 1
Loop While err.Number <> 0
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Спасибо! Вариантов практического решения я сделал уже несколько штук. Например, выгружать на отдельный лист все даты из Куба в столбец (без каких либо других данных, чтоб не увеличивать время выгрузки), затем находить последнюю заполненную ячейку в столбце и использовать ее значение как переменную для подстановки в Куб с данными.

Либо, допустим, сделать предположение, что последняя доступная дата в Кубе точно не меньше, чем Сегодня-365 дней. И далее ввсести какую нибудь переменную m, равную сегодня минус 365, и останавливать цикл, если m < ячейка, показывающая дату Куба, на которую удалось выгрузить данные. тогда первая же выгрузившаяся (существующая) дата из Куба позволит остановить цикл.

Так что практически задача решена, меня просто интересует как останавливать цикл, если конкретная операция удалась. Ну или делать его, пока операция не удастся.
 
Код
Do while ...
  if ОперацияУдалась Then  Exit Do
Loop
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Дмитрий(The_Prist) Щербаков,  Круто! Счетчик ерроров. Я бы сам очень долго додумывался. Спасибо, все работает!
 
Цитата
VasiliY_Seryugin написал: как останавливать цикл, если конкретная операция удалась.
Код
    Do While задача_не_выполнена
        '...........
    Loop
    
    Do
        '...........
    Loop Until задача_выполнена
    
    For i = 1 To мульйон
        If задача_выполнена Then Exit For
        '...........
    Next i
 
Цитата
VasiliY_Seryugin написал:
Я бы сам очень долго додумывался
не удивительно, потому что это не счетчик ошибок, а номер ошибки
код не считает количество ошибок, а выполняется пока есть ошибка
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Ігор Гончаренко,  ничего не могу возразить.
Так уж вышло, что знания набираю по ходу практики.
Вот теперь благодаря вам буду знать команду, считывающую номер ошибки, наверняка в будущем пригодится.
Сам бы наверное не скоро до этого дошел тоже;)
 
Ребят, всем спасибо за ответы! Вы просто недооценили уровень моего незнания VBA  :)
У меня как раз вот и есть проблема с тем, как записать, что "операция удалась" или "операция не удалась"?

Цитата
vikttur написал:
Do While задача_не_выполнена        '...........    Loop
Вот как это кодом записывается?
Do While [код] = Error или как?

Цитата
vikttur написал:
Do        '...........    Loop Until задача_выполнена
И это как записывается?
Do ... Loop Until [код] <> Error?
Do ... Loop Until [код] IS NOT Error?
Do ... Loop Until [код] NOT IsError?


Цитата
vikttur написал:
 If задача_выполнена Then Exit For
Как записать проверку, что "задача выполнена", т.е. строка кода выполнена и не дала ошибку?

Вот на столько у меня все плохо с VBA.
Логика то операции мне понятна, у меня проблемы с синтаксисом.
 
Да вот логика должна быть как в коде Дмитрия выше
1. до цикла отключаем ошибки
2. в начале цикла сбрасываем значение ошибки
3. делаем проблемное действие
4. анализируем значение ошибки
Как работать с задача_не_выполнена/задача_выполнена честно говоря так с лёту виртуально не придумывается, это нужно по конкретной задаче смотреть.
Изменено: Hugo - 12.10.2020 22:20:00
 
Цитата
VasiliY_Seryugin: недооценили уровень моего незнания VBA
изучайте подобные циклы
Я редко такие использую (обычно For … Next), поэтому сам путаюсь и пишу вот так просто
Код
Do
   If [условие выполнено] Then Exit Do
Loop
вариант от Дмитрия в таком случае выглядел бы так
Код
On Error Resume Next
Do
    Err.Clear

    Dt = Format(segodnya - i, "YYYY-MM-DD")
    DtText = Dt
    Pvt.PivotFields( _
        "[Дата отчета].[Дата отчета].[Дата отчета]").VisibleItemsList = Array( _
        "[Дата отчета].[Дата отчета].&[" & DtText & "T00:00:00]")

    If Err.Number=0 Then Exit Do
    i = i + 1
Loop
Изменено: Jack Famous - 13.10.2020 11:19:51
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Страницы: 1
Наверх