После первого цикла в переменной myZn(i) ничего не будет, а вы ее используете в дальнейшем для анализа For i = 1 To 12 myZn(i) = Cells(2, 2 + i) Next i
Вставьте строку myZn(i) = Cells(2, 2 + i) в тело второго цикла, возможно вам нужен цикл For i = 0 To 11 чтобы пройти все месяцы от января до декабря
Не согласен. После первого цикла в переменной myZn(i) будут все значения из второй строки, поэтому я и использую их для сравнения. Что бы убедиться в этом, нетрудно трассировать код (F8 – смотрим в Locals Window) или просмотреть значения переменных в Immediate window введя во втором цикле Debug.Print myZn(i). Но за участие – спасибо.
Пробовал, но не смог, потому что во встроенных Excel формулах не силён. Но если возможно решить задачу с помощью формул Excel, пожалуйста покажите, как это делается. Вот заготовка:
Post_71588 Вы нарисуйте в своей таблице, что должно быть в ячейках, помеченных желтым цветом и почему в них не входит ноябрь-декабрь. Вопросы? 1. Почему не заполнены столбцы январь-март и ноябрь-декабрь? 2. Где в таблице константа, с которой идет сравнение? 3. Сравнение с константой должно быть выполнено по всем инвентарным номерам? Или константы разные? 4. Планируемый расход - это за год?
{quote}{login=Kuzmich}{date=26.10.2009 10:20}{thema=Re}{post}Post_71588 Вы нарисуйте в своей таблице, что должно быть в ячейках, помеченных желтым цветом и почему в них не входит ноябрь-декабрь. Вопросы? 1. Почему не заполнены столбцы январь-март и ноябрь-декабрь? 2. Где в таблице константа, с которой идет сравнение? 3. Сравнение с константой должно быть выполнено по всем инвентарным номерам? Или константы разные? 4. Планируемый расход - это за год?{/post}{/quote}
Post_71685 Посмотрите код для одной строки, где ТО-1(1)
Sub DefTO() Ostatok = 0 For i = 6 To 12 j = 0 Do While Application.Sum(Range(Cells(4, i), Cells(4, i + j))) + Ostatok < Cells(3, 16).Value j = j + 1 If i + j > 12 Then Exit Sub Loop Ostatok = Application.Sum(Range(Cells(4, i), Cells(4, i + j))) + Ostatok - Cells(3, 16).Value LastTO = Cells(5, 1).Value Set iTO = Range("O3:O100").Find(What:=LastTO, LookIn:=xlFormulas, LookAt:=xlWhole) Cells(5, i + j) = Cells(iTO.Row + 1, 15) Cells(5, 1).Value = Cells(iTO.Row + 1, 15) i = i + j Next End Sub
В В5, В7, В9... (в одной строке с ТО) удалить формулы. Для С5: =ЕСЛИ(C4="";"";ЕСЛИ(ОСТАТ(СУММ(B4:$C4);$P$3)+C4>$P$3;ИНДЕКС($O$3:$O$100;ПОИСКПОЗ($A5;$O$3:$O$100;0)+ЦЕЛОЕ(СУММ($C4:C4)/$P$3));"")) Копировать-Вставить в нужные ячейки нечетных строк (желтая заливка). Недостаток формулы - при внесении числа, дающего с предыдущим остатком сумму, большую за две константы, неправильно указывается ТО. Например, остаток 450, вносим 5000: ЦЕЛОЕ(СУММ(450;5000)/$P$3)=2; будет указано ТО не следующее, а через одно, при ЦЕЛОЕ(...)=3 - через два. Принципиально или такой вариант невозможен?
Только определите все переменные перед выполнением программы
Sub DefTO() For nom = 4 To 14 Step 2 Ostatok = 0 FirstTO = Cells(nom + 1, 1).Value For i = 6 To 12 j = 0 Do While Application.Sum(Range(Cells(nom, i), Cells(nom, i + j))) + Ostatok < Cells(3, 16).Value j = j + 1 If i + j > 12 Then GoTo M1 Loop Ostatok = Application.Sum(Range(Cells(nom, i), Cells(nom, i + j))) + Ostatok - Cells(3, 16).Value LastTO = FirstTO Set iTO = Range("O3:O100").Find(What:=LastTO, LookIn:=xlFormulas, LookAt:=xlWhole) Cells(nom + 1, i + j) = Cells(iTO.Row + 1, 15) FirstTO = Cells(iTO.Row + 1, 15) i = i + j Next M1: Next End Sub