Странная ситуация, цикл исправно работал. А Потом появилась эта ошибка. Хотя 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
если цикл начинается с "For I =1 ..." тогда уже внизу - "Next I", исправьте в двух местах. и конструкции типа: If Then Else End If так мудрёно лучше не делать. Вряд-ли это будет работать именно так как Вы задумали.
если цикл начинается с "For I =1 ..." тогда уже внизу - "Next I", исправьте в двух местах. и конструкции типа: If Then Else End If так мудрёно лучше не делать. Вряд-ли это будет работать именно так как Вы задумали.al-Ex
Сообщение отредактировал al-Ex - Понедельник, 28.03.2016, 22:24
Учитесь оформлять код отступами - и проблем не будет [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]
Учитесь оформлять код отступами - и проблем не будет [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
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, там есть специальные кнопочки - ими можно делать отступ сразу для нескольких строк (Тавом тоже можно).
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_