|
|
|
ограничения циклов
|
|||
|---|---|---|---|
|
#18+
народ, вот столкнулся с такой проблеммой: у меня довольно большая вложенность циклов получилась (6) for for do while loop do while loop for for next next +там ещё несколько if then и если я добавлю ещё один цикл while то у меня начинают выскакивать ошибки типа он видит концы циклов но не видит их начала (next withhout block for ) или (end if withhout block if) /// вот что делать, подскажите? если нужно - могу весь пример скинуть .. 0:-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2008, 07:35 |
|
||
|
ограничения циклов
|
|||
|---|---|---|---|
|
#18+
Указывать чей next, тогда ему будет проще Если конечно ошибок нет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2008, 07:42 |
|
||
|
ограничения циклов
|
|||
|---|---|---|---|
|
#18+
ошибок нет, если я убираю свой "новый" цикл, все опять работает .. если делаю так как вы сказали - не помогает %( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2008, 07:51 |
|
||
|
ограничения циклов
|
|||
|---|---|---|---|
|
#18+
кидайте пример а то на представленом примере уж точно не хватает операторов next I Have Nine Lives You Have One Only THINK! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2008, 08:00 |
|
||
|
ограничения циклов
|
|||
|---|---|---|---|
|
#18+
авторесли нужно - могу весь пример скинутьСкидывайте ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2008, 08:01 |
|
||
|
ограничения циклов
|
|||
|---|---|---|---|
|
#18+
вот собственно, проблемное место выделю жирным шрифтом Dim fnd, n1, s As Byte Dim q As Byte Dim bol As Boolean bol = False Dim text As String Dim d As Date Dim tx As String Dim fin, u, fox As Byte Dim Sum, Sum1 As Long Sum = 0 Sum1 = 0 For h = 1 To Workbooks(nameIn).Sheets.count If Workbooks(nameIn).Sheets(h).name <> "Шаблон" Then n1 = Workbooks(nameIn).Sheets(h).Range("B500").End(xlUp).Row For s = 1 To n1 text = Workbooks(nameIn).Sheets(h).Range("A" & s) fnd = InStr(1, text, "-й этап") If fnd >= 2 Then bol = True End If If bol = True Then Dim obj As String Dim std As String obj = Workbooks(nameIn).Sheets(h).Range("B1").Value std = Workbooks(nameIn).Sheets(h).Range("B3").Value If Workbooks(nameIn).Sheets(h).Range("D" & s).Value <> "" Then d = CDate(Workbooks(nameIn).Sheets(h).Range("D" & s).Value) Do While Workbooks(nameIn).Sheets(h).Range("A" & s + 1).Value = "" tx = Workbooks(nameIn).Sheets(h).Range("B" & s + 1) fin = InStr(1, tx, "БТП") fox = InStr(1, tx, "****") If (fin > 0) Or (fox > 0) Then u = s + 2 Do While Workbooks(nameIn).Sheets(h).Range("E" & u).Value <> "" Sum = Sum + Val(Workbooks(nameIn).Sheets(h).Range("E" & u).Value) u = u + 1 Loop u = 0 End If If fin = 0 Then u = s + 2 Do While Workbooks(nameIn).Sheets(h).Range("E" & u).Value <> "" Sum1 = Sum1 + Val(Workbooks(nameIn).Sheets(h).Range("E" & u).Value) u = u + 1 Loop u = 0 End If With ActiveWorkbook For i = LBound(arMonth, 1) To UBound(arMonth, 1) For j = 0 To count - 1 If (Month(d) = i) And (ObjectName(j + 1) = obj) Then For q = 1 To countr + 1 If (ListObject(q) = obj) And (DopStatys(q) = std) Then If (ListObject(q) = ObjectName(j + 1)) And (Workbooks(nameIn).Sheets(h).Range("A" & s).Value <> "") Then If (StatysObject(q) = "Îñíîâíîé") And (DopStatys(q) = "äîï ñîãëàøåíèå") And (Workbooks(nameIn).Sheets(h).Range("A" & s).Value <> "") Then Sheets(ActiveWorkbook.Sheets.count - i).Range("B" + CStr(j * 11 + 4)).Value = Workbooks(nameIn).Sheets(h).Range("A" & s) Sheets(ActiveWorkbook.Sheets.count - i).Range("E" + CStr(j * 11 + 4)).Value = Workbooks(nameIn).Sheets(h).Range("E" & s) Sheets(ActiveWorkbook.Sheets.count - i).Range("F" + CStr(j * 11 + 4)).Value = Sum Sheets(ActiveWorkbook.Sheets.count - i).Range("G" + CStr(j * 11 + 4)).Value = Sum1 Exit For End If If ((StatysObject(q) = "Îñíîâíîé") Or (StatysObject(q) = "îñíîâíîé")) And (DopStatys(q) = "") And (Workbooks(nameIn).Sheets(h).Range("A" & s).Value <> "") Then Sheets(ActiveWorkbook.Sheets.count - i).Range("B" + CStr(j * 11 + 3)).Value = Workbooks(nameIn).Sheets(h).Range("A" & s) Sheets(ActiveWorkbook.Sheets.count - i).Range("E" + CStr(j * 11 + 3)).Value = Workbooks(nameIn).Sheets(h).Range("E" & s) Sheets(ActiveWorkbook.Sheets.count - i).Range("F" + CStr(j * 11 + 3)).Value = Sum Sheets(ActiveWorkbook.Sheets.count - i).Range("G" + CStr(j * 11 + 3)).Value = Sum1 Exit For End If If (StatysObject(q) = "Àâòîðñêèé") And (DopStatys(q) = "äîï ñîãëàøåíèå") And (Workbooks(nameIn).Sheets(h).Range("A" & s).Value <> "") Then Sheets(ActiveWorkbook.Sheets.count - i).Range("B" + CStr(j * 11 + 6)).Value = Workbooks(nameIn).Sheets(h).Range("A" & s) Sheets(ActiveWorkbook.Sheets.count - i).Range("E" + CStr(j * 11 + 6)).Value = Workbooks(nameIn).Sheets(h).Range("E" & s) Sheets(ActiveWorkbook.Sheets.count - i).Range("F" + CStr(j * 11 + 6)).Value = Sum Sheets(ActiveWorkbook.Sheets.count - i).Range("G" + CStr(j * 11 + 6)).Value = Sum1 Exit For End If If ((StatysObject(q) = "Àâòîðñêèé") Or (StatysObject(q) = "àâòîðñêèé")) And (DopStatys(q) = "") And (Workbooks(nameIn).Sheets(h).Range("A" & s).Value <> "") Then Sheets(ActiveWorkbook.Sheets.count - i).Range("B" + CStr(j * 11 + 5)).Value = Workbooks(nameIn).Sheets(h).Range("A" & s) Sheets(ActiveWorkbook.Sheets.count - i).Range("E" + CStr(j * 11 + 5)).Value = Workbooks(nameIn).Sheets(h).Range("E" & s) Sheets(ActiveWorkbook.Sheets.count - i).Range("F" + CStr(j * 11 + 5)).Value = Sum Sheets(ActiveWorkbook.Sheets.count - i).Range("G" + CStr(j * 11 + 5)).Value = Sum1 Exit For End If If (StatysObject(q) = "ÃÝÌ") And (DopStatys(q) = "äîï ñîãëàøåíèå") And (Workbooks(nameIn).Sheets(h).Range("A" & s).Value <> "") Then Sheets(ActiveWorkbook.Sheets.count - i).Range("B" + CStr(j * 11 + 8)).Value = Workbooks(nameIn).Sheets(h).Range("A" & s) Sheets(ActiveWorkbook.Sheets.count - i).Range("E" + CStr(j * 11 + 8)).Value = Workbooks(nameIn).Sheets(h).Range("E" & s) Sheets(ActiveWorkbook.Sheets.count - i).Range("F" + CStr(j * 11 + 8)).Value = Sum Sheets(ActiveWorkbook.Sheets.count - i).Range("G" + CStr(j * 11 + 8)).Value = Sum1 Exit For End If If ((StatysObject(q) = "ÃÝÌ") Or (StatysObject(q) = "ãýì")) And (DopStatys(q) = "") And (Workbooks(nameIn).Sheets(h).Range("A" & s).Value <> "") Then Sheets(ActiveWorkbook.Sheets.count - i).Range("B" + CStr(j * 11 + 7)).Value = Workbooks(nameIn).Sheets(h).Range("A" & s) Sheets(ActiveWorkbook.Sheets.count - i).Range("E" + CStr(j * 11 + 7)).Value = Workbooks(nameIn).Sheets(h).Range("E" & s) Sheets(ActiveWorkbook.Sheets.count - i).Range("F" + CStr(j * 11 + 7)).Value = Sum Sheets(ActiveWorkbook.Sheets.count - i).Range("G" + CStr(j * 11 + 7)).Value = Sum1 Exit For End If End If End If Next q End If Next j Next i End With bol = False Sum = 0 Sum1 = 0 End If ' ругается на эту строчку говорит - не может найти блок ИФ End If ' ругается на эту строчку говорит - не может найти блок ИФ Next s Loop End If Next h вот если убрать do while и loop - все работает ... а так - нет :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2008, 08:26 |
|
||
|
ограничения циклов
|
|||
|---|---|---|---|
|
#18+
А как насчет того что бы пользоваться отсупами? ИМХО, тогда проблема решиться сама собой. На первый взлгяд последний loop должен стоять до next s. Но еще раз повторяю, что читать такой не структурированный код не охота. Есть еще полезная практика возде каждого loop и End If в комментариях указывать условие по которому они работают, т.е. копировать информацию из операторов do и if. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2008, 09:51 |
|
||
|
ограничения циклов
|
|||
|---|---|---|---|
|
#18+
на самом деле я пользуюсь отступами, но дело в том что если скопировать и вставить то отступы удаляются, а я хотел выделить тот участок где есть проблема. я думаю, что правильно поставил loop потому как мне нужен был цикл который будет складывать ячейки внутри цикла по ячейкам (счетчик как раз s) могу кинуть структурированный код + отметить где и что заканчивается Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. постарался более структурно :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2008, 10:05 |
|
||
|
ограничения циклов
|
|||
|---|---|---|---|
|
#18+
как может быть правильно, если начинается Код: plaintext 1. 2. 3. Код: plaintext 1. 2. 3. I Have Nine Lives You Have One Only THINK! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2008, 10:15 |
|
||
|
ограничения циклов
|
|||
|---|---|---|---|
|
#18+
возможно примерно так Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. I Have Nine Lives You Have One Only THINK! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2008, 10:16 |
|
||
|
ограничения циклов
|
|||
|---|---|---|---|
|
#18+
Уважаемый Nomad87 , такая неотформатированность кода гарантирует возникновение ошибок. Структурные блоки (For, If, Do etc.) необходимо выделять (при помощи табуляций) и замыкающие их директивы желательно снабжать комментариями (Next 'j, End if 'a > b etc.) Так же гарантирует возникновение ошибок отсутствие описания переменных. Настоятельно рекомендую начинать каждый модуль директивой Option Explicit . В приложении - Ваш код, отформатированный и дополненный описаниями некоторых переменных. Некоторых, но не всех (я не телепат), так что пройти до конца трансляцию не удалось. Успехов! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2008, 10:29 |
|
||
|
ограничения циклов
|
|||
|---|---|---|---|
|
#18+
Nomad87 , в окне VBE предусмотрено одно маленькое удобство (возможно, Вы о нём уже знаете, но на всякий случай): над полосой вертикальной прокрутки есть (как и в окне Excel'я) маленький рубчик. Потянув его мышкой вниз, можно резделить окно на две "форточки" (в Excel'е они названы "областями"). Очень помогает при форматировании структурных блоков, не помещающихся целиком на экране. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2008, 10:41 |
|
||
|
ограничения циклов
|
|||
|---|---|---|---|
|
#18+
Dim fnd, n1, s As Byte ...... For s = 1 To n1 У вас здесь n1 As Variant, s As Byte, а цикл все-равно их делает Integer. Осознанно работайте с типами данных. И хорошо было бы все декларации вынести наверх. Успехов ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2008, 13:15 |
|
||
|
ограничения циклов
|
|||
|---|---|---|---|
|
#18+
VladConnFor s = 1 To n1 У вас здесь n1 As Variant, s As Byte, а цикл все-равно их делает Integer.Даже в случае For v = 0.4 To 1.5 Step 0.1 ? Справка VB For counter = start To end [ Step step ] ... counter Required. Numeric variable used as a loop counter. The variable can't be a Boolean or an array element. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2008, 15:20 |
|
||
|
ограничения циклов
|
|||
|---|---|---|---|
|
#18+
Нет, ДмиДми, не в вашем примере. А вот если n1 будет 100, то его тип станет Integer, и куда бежать с s As Byte? Далее, в теле цикла VB переменную s неявно будет делать типом Integer, а показывать как Byte, вы этого и знать не будете, и этот Byte тогда можно будет засунуть куда подальше. :0) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2008, 17:12 |
|
||
|
ограничения циклов
|
|||
|---|---|---|---|
|
#18+
ребят, спасибо огромное за ваши коментарии, я обязательно приму их к сведению ... просто сам изучал вба в течении пары недель с 0 ... ну и канеш осталось куча косяков, просто нужно закончиьт прогу ... думал, что если добавлю этот новый цикл - все будет ок, а она просто тупо вылетает ... вот эту ошибку просто не знаю даже как пробовать исправить ... может поглядите всю програмку, и вот как раз в 140 строчке этот косяк и есть ... (тот кусак который вы только что наблюдали) заранее благодарен пока что буду пробовать копать его сам ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2008, 05:50 |
|
||
|
ограничения циклов
|
|||
|---|---|---|---|
|
#18+
ИМХО, вам уже все разложили по полочкам. HandKot прямо указал на ошибку. Вы исправили этот кусок? И что получилось? Или же вы ждете когда за вас все сделают? Как тогда вы научитесь программировать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2008, 10:02 |
|
||
|
ограничения циклов
|
|||
|---|---|---|---|
|
#18+
проблема в том что HandKot прямо указал на ошибку но не учел одной мелочи, цикл который я добавлял - Do While Workbooks(nameIn).Sheets(h).Range("A" & s + 1).Value = "" loop был добавлен для того чтобы программа считала сумму по всем предприятиям столбца в этом цикле есть переменная s и на сколько я понимаю, если сделать так как сказал HandKot то переменная s будет иметь одно значение и произойдет зацикливание ... вот. если убрать этот цикл, то результатом будет только сумма только по одному предприятию в этапе, а мне соответственно нужна вся сумма по моему предприятию. как то так извините, я не лентяй и не хочу чтоб за меня все делали, сам сутками сижу и уже голова кипит... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2008, 11:51 |
|
||
|
ограничения циклов
|
|||
|---|---|---|---|
|
#18+
Помните, раньше: "Я Пастернака не читал, но осуждаю". Так и я: код не смотрел, но сомневаюсь. Мне почему-то кажется, что все эти циклы не обязательны. Они выглядят какими-то слишком тяжеловесными для меня. Можно ли это же сделать через SQL запросы, через встроенные формулы, наконец, (VLookup) ? :0) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2008, 16:10 |
|
||
|
ограничения циклов
|
|||
|---|---|---|---|
|
#18+
Можно было бы, наверно, отсортировать програмно. Через Find находить строки, соответствующие разным предприятиям, эпохам и идеям, а затем прописывать в коде FormulaR1C1 с SUM внутри в границах найденных строк. И нет почти циклов, только разве лишь внутри коллекции этих всяких предприятий. :0) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2008, 16:17 |
|
||
|
ограничения циклов
|
|||
|---|---|---|---|
|
#18+
Может можно воспользоваться програмно опцией в меню: Data/Subtotals... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2008, 16:21 |
|
||
|
ограничения циклов
|
|||
|---|---|---|---|
|
#18+
эх, VladConn, я бы с удовольствием сделал то, что вы говорите просто есть две вещи которых у меня нет, 1 - времени 2 - знаний по тому как это делать через sql или find или ещё как нибудь... хотя главное канеш - время в понедельник все должно работать .. вот так :( так что буду выкручиваться с тем что есть ....хм ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2008, 07:32 |
|
||
|
|

start [/forum/topic.php?fid=60&msg=35484586&tid=2161962]: |
0ms |
get settings: |
5ms |
get forum list: |
8ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
51ms |
get topic data: |
6ms |
get forum data: |
1ms |
get page messages: |
34ms |
get tp. blocked users: |
1ms |
| others: | 210ms |
| total: | 320ms |

| 0 / 0 |
