Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Выдает ошибку "Loop without Do" хотя Do есть - Мир MS Excel

Регистрация · Логин: · Пароль: · · Забыли пароль?
Страница 1 из 11
Модератор форума: _Boroda_, Pelena, Manyasha, SLAVICK 
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Выдает ошибку "Loop without Do" хотя Do есть (Макросы/Sub)
Выдает ошибку "Loop without Do" хотя Do есть
Bamboo Дата: Понедельник, 28.03.2016, 21:50 | Сообщение № 1
Группа: Пользователи
Ранг: Участник
Сообщений: 56
Репутация: 0 ±
Замечаний: 20% ±

Excel 2010
Странная ситуация, цикл исправно работал. А Потом появилась эта ошибка. Хотя Do есть.
Прошу не ругаться на код, это мой первый на VBA да еще и не отлаженный.
[vba]
Код

Function HighLevACC(ACC, DistMap)
Dim Array_DistMap()
Dim Array_SubHLACC()
Dim I As Integer, J As Integer, X As Integer, Y As Integer
Do
X = X + 1
If ACC.Cells(X, 1) = "Empty" And ThisCell.Address.Offset(X, 10) = "" Then      
Set vHLACC = ACC.Cells(X, -1)
Array_DistMap = DistMap.Value
  Counter_j = 0
For I = 1 To UBound(Array_DistMap)
If Array_DistMap(I, 1) = vHLACC Then
J = J + 1
ReDim Preserve Array_SubHLACC(1 To J)
Array_SubHLACC(J) = Array_DistMap(I, 2)
  MsgBox (Array_SubHLACC(J))
  End If
Next
HighLevACC = Array_SubHLACC(2)
HighLevACC.Offset(0, 9) = 1
ACC.Cells(Õ, 9) = "S"      
If ACC.Cells(Õ - 1, 10) = "C" Then       
vHLACC = ACC.Cells(X - 1, -1)
Counter_j = 0
For I = 1 To UBound(Array_DistMap)
If Array_DistMap(I, 1) = vHLACC Then
J = J + 1
ReDim Preserve Array_SubHLACC(0 To J)
Array_SubHLACC(J) = Array_DistMap(I, 2)
  End If
Next
Y = HighLevACC.Offcet(-1, 9)
Y = Y + 1
If Y <= J Then
HighLevACC = Array_SubHLACC(Y)
HighLevACC.Cells(0, 9) = Y
If Y = J Then
HighLevACC.Cells(0, 10) = "D"
End If
End If
End If
HighLevACC = ACC.Cells(X, 1)
Loop While (X < ACC.Count) Or (ACC.Cells(X, 1) = "Empty" And ThisCell.Address.Offset(X, 10) = "")
End Function
[/vba]
 
Ответить
СообщениеСтранная ситуация, цикл исправно работал. А Потом появилась эта ошибка. Хотя Do есть.
Прошу не ругаться на код, это мой первый на VBA да еще и не отлаженный.
[vba]
Код

Function HighLevACC(ACC, DistMap)
Dim Array_DistMap()
Dim Array_SubHLACC()
Dim I As Integer, J As Integer, X As Integer, Y As Integer
Do
X = X + 1
If ACC.Cells(X, 1) = "Empty" And ThisCell.Address.Offset(X, 10) = "" Then      
Set vHLACC = ACC.Cells(X, -1)
Array_DistMap = DistMap.Value
  Counter_j = 0
For I = 1 To UBound(Array_DistMap)
If Array_DistMap(I, 1) = vHLACC Then
J = J + 1
ReDim Preserve Array_SubHLACC(1 To J)
Array_SubHLACC(J) = Array_DistMap(I, 2)
  MsgBox (Array_SubHLACC(J))
  End If
Next
HighLevACC = Array_SubHLACC(2)
HighLevACC.Offset(0, 9) = 1
ACC.Cells(Õ, 9) = "S"      
If ACC.Cells(Õ - 1, 10) = "C" Then       
vHLACC = ACC.Cells(X - 1, -1)
Counter_j = 0
For I = 1 To UBound(Array_DistMap)
If Array_DistMap(I, 1) = vHLACC Then
J = J + 1
ReDim Preserve Array_SubHLACC(0 To J)
Array_SubHLACC(J) = Array_DistMap(I, 2)
  End If
Next
Y = HighLevACC.Offcet(-1, 9)
Y = Y + 1
If Y <= J Then
HighLevACC = Array_SubHLACC(Y)
HighLevACC.Cells(0, 9) = Y
If Y = J Then
HighLevACC.Cells(0, 10) = "D"
End If
End If
End If
HighLevACC = ACC.Cells(X, 1)
Loop While (X < ACC.Count) Or (ACC.Cells(X, 1) = "Empty" And ThisCell.Address.Offset(X, 10) = "")
End Function
[/vba]

Автор - Bamboo
Дата добавления - 28.03.2016 в 21:50
al-Ex Дата: Понедельник, 28.03.2016, 22:00 | Сообщение № 2
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 148
Репутация: 53 ±
Замечаний: 20% ±

Excel 2010

если цикл начинается с "For I =1 ..." тогда уже внизу - "Next I", исправьте в двух местах.
и конструкции типа: If Then
Else
End If
так мудрёно лучше не делать.
Вряд-ли это будет работать именно так как Вы задумали.


Сообщение отредактировал al-Ex - Понедельник, 28.03.2016, 22:24
 
Ответить
Сообщение
если цикл начинается с "For I =1 ..." тогда уже внизу - "Next I", исправьте в двух местах.
и конструкции типа: If Then
Else
End If
так мудрёно лучше не делать.
Вряд-ли это будет работать именно так как Вы задумали.

Автор - al-Ex
Дата добавления - 28.03.2016 в 22:00
Невилл Дата: Понедельник, 28.03.2016, 22:09 | Сообщение № 3
Группа: Пользователи
Ранг: Участник
Сообщений: 70
Репутация: 2 ±
Замечаний: 0% ±

Excel 2007
Одно из If не закрыто.

Кстати, неплохо бы определять переменные и их типы сверху, пожалуй.
 
Ответить
СообщениеОдно из If не закрыто.

Кстати, неплохо бы определять переменные и их типы сверху, пожалуй.

Автор - Невилл
Дата добавления - 28.03.2016 в 22:09
Апострофф Дата: Понедельник, 28.03.2016, 22:10 | Сообщение № 4
Группа: Пользователи
Ранг: Участник
Сообщений: 71
Репутация: 26 ±
Замечаний: 0% ±

Excel 2003
Учитесь оформлять код отступами - и проблем не будет
[vba]
Код
Function HighLevACC(ACC, DistMap)
Dim Array_DistMap()
Dim Array_SubHLACC()
Dim I As Integer, J As Integer, X As Integer, Y As Integer
Do
    X = X + 1
    If ACC.Cells(X, 1) = "Empty" And ThisCell.Address.Offset(X, 10) = "" Then
        Set vHLACC = ACC.Cells(X, -1)
        Array_DistMap = DistMap.Value
        Counter_j = 0
        For I = 1 To UBound(Array_DistMap)
            If Array_DistMap(I, 1) = vHLACC Then
                J = J + 1
                ReDim Preserve Array_SubHLACC(1 To J)
                Array_SubHLACC(J) = Array_DistMap(I, 2)
                MsgBox (Array_SubHLACC(J))
            End If
        Next
        HighLevACC = Array_SubHLACC(2)
        HighLevACC.Offset(0, 9) = 1
        ACC.Cells(O, 9) = "S"
        If ACC.Cells(O - 1, 10) = "C" Then
            vHLACC = ACC.Cells(X - 1, -1)
            Counter_j = 0
            For I = 1 To UBound(Array_DistMap)
                If Array_DistMap(I, 1) = vHLACC Then
                    J = J + 1
                    ReDim Preserve Array_SubHLACC(0 To J)
                    Array_SubHLACC(J) = Array_DistMap(I, 2)
                End If
            Next
            Y = HighLevACC.Offcet(-1, 9)
            Y = Y + 1
            If Y <= J Then
                HighLevACC = Array_SubHLACC(Y)
                HighLevACC.Cells(0, 9) = Y
                If Y = J Then
                    HighLevACC.Cells(0, 10) = "D"
                End If
            End If
        End If
    End If 'НЕ ХВАТАЛО ЭТОГО.
    HighLevACC = ACC.Cells(X, 1)
Loop While (X < ACC.Count) Or (ACC.Cells(X, 1) = "Empty" And ThisCell.Address.Offset(X, 10) = "")
End Function
[/vba]


Сообщение отредактировал Апострофф - Понедельник, 28.03.2016, 22:18
 
Ответить
СообщениеУчитесь оформлять код отступами - и проблем не будет
[vba]
Код
Function HighLevACC(ACC, DistMap)
Dim Array_DistMap()
Dim Array_SubHLACC()
Dim I As Integer, J As Integer, X As Integer, Y As Integer
Do
    X = X + 1
    If ACC.Cells(X, 1) = "Empty" And ThisCell.Address.Offset(X, 10) = "" Then
        Set vHLACC = ACC.Cells(X, -1)
        Array_DistMap = DistMap.Value
        Counter_j = 0
        For I = 1 To UBound(Array_DistMap)
            If Array_DistMap(I, 1) = vHLACC Then
                J = J + 1
                ReDim Preserve Array_SubHLACC(1 To J)
                Array_SubHLACC(J) = Array_DistMap(I, 2)
                MsgBox (Array_SubHLACC(J))
            End If
        Next
        HighLevACC = Array_SubHLACC(2)
        HighLevACC.Offset(0, 9) = 1
        ACC.Cells(O, 9) = "S"
        If ACC.Cells(O - 1, 10) = "C" Then
            vHLACC = ACC.Cells(X - 1, -1)
            Counter_j = 0
            For I = 1 To UBound(Array_DistMap)
                If Array_DistMap(I, 1) = vHLACC Then
                    J = J + 1
                    ReDim Preserve Array_SubHLACC(0 To J)
                    Array_SubHLACC(J) = Array_DistMap(I, 2)
                End If
            Next
            Y = HighLevACC.Offcet(-1, 9)
            Y = Y + 1
            If Y <= J Then
                HighLevACC = Array_SubHLACC(Y)
                HighLevACC.Cells(0, 9) = Y
                If Y = J Then
                    HighLevACC.Cells(0, 10) = "D"
                End If
            End If
        End If
    End If 'НЕ ХВАТАЛО ЭТОГО.
    HighLevACC = ACC.Cells(X, 1)
Loop While (X < ACC.Count) Or (ACC.Cells(X, 1) = "Empty" And ThisCell.Address.Offset(X, 10) = "")
End Function
[/vba]

Автор - Апострофф
Дата добавления - 28.03.2016 в 22:10
Bamboo Дата: Понедельник, 28.03.2016, 22:48 | Сообщение № 5
Группа: Пользователи
Ранг: Участник
Сообщений: 56
Репутация: 0 ±
Замечаний: 20% ±

Excel 2010
Апострофф, Спасибо! Получилось! Насчет, отступов, это я поленился, а зря...
 
Ответить
СообщениеАпострофф, Спасибо! Получилось! Насчет, отступов, это я поленился, а зря...

Автор - Bamboo
Дата добавления - 28.03.2016 в 22:48
_Boroda_ Дата: Понедельник, 28.03.2016, 23:02 | Сообщение № 6
Группа: Модераторы
Ранг: Экселист
Сообщений: 9375
Репутация: 3948 ±
Замечаний: 0% ±

2003; 2007; 2010; 2013 RUS
Bamboo, Виталий, я, например, делаю вот так - когда пишу If ... Then, то сразу же ДВА раза жму Ентер и пишу End If, затем возвращаюсь на строчку выше, жму Тав и пишу то, что хотел написать внутри Ифа.
Аналогично с циклами - For i = 1 to 5, ДВА раза Ентер, Next i, стрелка вверх, Тав и тело цикла. При таком стиле записи я уже не теряю закрытия циклов и Ifов.
Можно еще пользоваться облегчениями отсюда http://www.excelworld.ru/forum/10-22392-180576-16-1458977793
Кстати, вот это
если цикл начинается с "For I =1 ..." тогда уже внизу - "Next I"
не обязательно. Можно писать просто Next, но, когда у Вас цикл в цикле и все это внутри цикла, то довольно легко запутаться, поэтому для облегчения понимания желательно указывать переменную, цикл по которой закрываем.
Насчет, отступов, это я поленился
Отступы легко делать Тавом или в VBA вывести панельку Edit, там есть специальные кнопочки - ими можно делать отступ сразу для нескольких строк (Тавом тоже можно).


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
СообщениеBamboo, Виталий, я, например, делаю вот так - когда пишу If ... Then, то сразу же ДВА раза жму Ентер и пишу End If, затем возвращаюсь на строчку выше, жму Тав и пишу то, что хотел написать внутри Ифа.
Аналогично с циклами - For i = 1 to 5, ДВА раза Ентер, Next i, стрелка вверх, Тав и тело цикла. При таком стиле записи я уже не теряю закрытия циклов и Ifов.
Можно еще пользоваться облегчениями отсюда http://www.excelworld.ru/forum/10-22392-180576-16-1458977793
Кстати, вот это
если цикл начинается с "For I =1 ..." тогда уже внизу - "Next I"
не обязательно. Можно писать просто Next, но, когда у Вас цикл в цикле и все это внутри цикла, то довольно легко запутаться, поэтому для облегчения понимания желательно указывать переменную, цикл по которой закрываем.
Насчет, отступов, это я поленился
Отступы легко делать Тавом или в VBA вывести панельку Edit, там есть специальные кнопочки - ими можно делать отступ сразу для нескольких строк (Тавом тоже можно).

Автор - _Boroda_
Дата добавления - 28.03.2016 в 23:02
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Выдает ошибку "Loop without Do" хотя Do есть (Макросы/Sub)
Страница 1 из 11
Поиск:

Яндекс цитирования
© 2010-2016 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!