Здравствуйте. Есть перебор наподобие комбинаторного. Но задача в том что начинать перебор нужно с чисел определенного диапазона. Есть мысль впервый проход перебора прибавлять числа до нужного результата, потом обнулить их. Но может кто подскажет лучшее решение...
Здравствуйте. Есть перебор наподобие комбинаторного. Но задача в том что начинать перебор нужно с чисел определенного диапазона. Есть мысль впервый проход перебора прибавлять числа до нужного результата, потом обнулить их. Но может кто подскажет лучшее решение...megavlom
Формуляр, спасибо этому форуму я уже немного лучше плаваю в эксе. Не задавал бы такой простой вопрос. Видите ли если в начале x(1,1)=5 x(1,2)=8,то при дальнейшем i1=x(1,1)=5 i2=i1+1 to .. должно еще быть i2-- 6=5+1 а его не будет
Формуляр, спасибо этому форуму я уже немного лучше плаваю в эксе. Не задавал бы такой простой вопрос. Видите ли если в начале x(1,1)=5 x(1,2)=8,то при дальнейшем i1=x(1,1)=5 i2=i1+1 to .. должно еще быть i2-- 6=5+1 а его не будетmegavlom
Формуляр, извините,моя вина.Опять не могу толково обьяснить. Есть комбинаторный перебор,где допустим i2=i1 +1 To 9; i3=i2 +1 To 15. Т.е. значение следующей цифры пляшет от предыдущей на расстоянии от +1 до максимального.(устанавливаемого). Если первая цифра от 5 до 7 , то вторая от 6 до 9 ну и т.д. Загвоздка в том ,что начинать перебор надо не с i1=5, i2=i1 +1(6) , i3=i2 +1(7) а с чисел "диапазона" (5-8-12-), когда первое число станет 6 то второе (i2=i1+1) должно быть 7. Может проще так есть перебор,доходит до определенного значения стоп,это значение на лист.потом продолжение перебора со значения листа .
Формуляр, извините,моя вина.Опять не могу толково обьяснить. Есть комбинаторный перебор,где допустим i2=i1 +1 To 9; i3=i2 +1 To 15. Т.е. значение следующей цифры пляшет от предыдущей на расстоянии от +1 до максимального.(устанавливаемого). Если первая цифра от 5 до 7 , то вторая от 6 до 9 ну и т.д. Загвоздка в том ,что начинать перебор надо не с i1=5, i2=i1 +1(6) , i3=i2 +1(7) а с чисел "диапазона" (5-8-12-), когда первое число станет 6 то второе (i2=i1+1) должно быть 7. Может проще так есть перебор,доходит до определенного значения стоп,это значение на лист.потом продолжение перебора со значения листа .megavlom
чисто теоретически, при следующем способе суммарное время на выполнение проверок меньше: [vba]
Code
Sub Macr2() Dim i1%, i2%, i3%, i4%, h&, x, y Dim r1%, r2%, r3%, r4% x = Range("C6:F6").Value y = Range("I1:L3000").Value i1 = x(1, 1): i2 = x(1, 2): i3 = x(1, 3): i4 = x(1, 4) Do While True h = h + 1 y(h, 1) = i1: y(h, 2) = i2: y(h, 3) = i3: y(h, 4) = i4 i4 = i4 + 1 If i4 > 25 Then i3 = i3 + 1 If i3 > 15 Then i2 = i2 + 1 If i2 > 9 Then i1 = i1 + 1 If i1 > 7 Then Exit Do i2 = i1 + 1 End If i3 = i2 + 1 End If i4 = i3 + 1 End If Loop [I1:L1].Resize(h) = y End Sub
[/vba] но на данном примере разница неощутима (без интерфейсной части и ваши вложенные циклы, и мой Do While отрабатывают за 0 msec )
пс. а отступы в коде всегда так "творчески" обрабатываются движком?
чисто теоретически, при следующем способе суммарное время на выполнение проверок меньше: [vba]
Code
Sub Macr2() Dim i1%, i2%, i3%, i4%, h&, x, y Dim r1%, r2%, r3%, r4% x = Range("C6:F6").Value y = Range("I1:L3000").Value i1 = x(1, 1): i2 = x(1, 2): i3 = x(1, 3): i4 = x(1, 4) Do While True h = h + 1 y(h, 1) = i1: y(h, 2) = i2: y(h, 3) = i3: y(h, 4) = i4 i4 = i4 + 1 If i4 > 25 Then i3 = i3 + 1 If i3 > 15 Then i2 = i2 + 1 If i2 > 9 Then i1 = i1 + 1 If i1 > 7 Then Exit Do i2 = i1 + 1 End If i3 = i2 + 1 End If i4 = i3 + 1 End If Loop [I1:L1].Resize(h) = y End Sub
[/vba] но на данном примере разница неощутима (без интерфейсной части и ваши вложенные циклы, и мой Do While отрабатывают за 0 msec )
пс. а отступы в коде всегда так "творчески" обрабатываются движком? ikki
помощь по Excel и VBA ikki@fxmail.ru, icq 592842413, skype alex.ikki
Сообщение отредактировал ikki - Суббота, 13.10.2012, 21:05